与主库同步时,从库中清空所有数据,因此在做 redis 尽量选择没有任何数据的主从 redis
架构图
环境准备
2.部署两台 redis2.1 192.168.81.210 配置
1.创建redis部署路径[root@redis-1 ~]# mkdir -p /data/redis_cluster/redis_6379/{conf,pid,logs,data}[root@redis-1 ~]# tree /data/redis_cluster//data/redis_cluster/└── redis_6379 ├── conf ├── logs ├── pid └── data 2.下载redis[root@redis-1 ~]# mkdir /data/soft[root@redis-1 ~]# cd /data/soft[root@redis-1 /data/soft]# wget https://repo.huaweicloud.com/redis/redis-3.2.9.tar.gz3.编译安装redis[root@redis-1 /data/soft]# tar xf redis-3.2.9.tar.gz -C /data/redis_cluster/[root@redis-1 /data/soft]# cd /data/redis_cluster/[root@redis-1 /data/redis_cluster]# ln -s redis-3.2.9/ redis[root@redis-1 /data/redis_cluster]# cd redis/src[root@redis-1 /data/redis_cluster/redis]# make && make install4.准备配置文件[root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf daemonize yesbind 192.168.81.210 127.0.0.1port 6379pidfile /data/redis_cluster/redis_6379/pid/redis_6379.pidlogfile /data/redis_cluster/redis_6379/logs/redis_6379.logdatabases 16dbfilename redis_6379.rdbdir /data/redis_cluster/redis_6379/data/save 900 1save 300 100save 60 10000appendonly yesappendfilename "appendonly.aof"appendfsync alwaysappendfsync everysecappendfsync nono-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yes5.启动redis[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
2.2 192.168.81.220 配置
由于 redis-1 一套已经部署好了 redis,我们可以直接复制使用
1.使用rsync将redis-1的redis复制你的目录[root@redis-1 ~]# rsync -avz /data root@192.168.81.220:/2.查看复制的目录文件[root@redis-2 ~]# ls /data/redis_cluster/redis redis-3.2.9 redis_6379[root@redis-2 ~]# ls /data/redis_cluster/redis_6379/conf data logs pid3.编译安装redis,使系统能够使用redis直接执行命令make install即可,因为编译步骤在redis-1已经做了[root@redis-2 ~]# cd /data/redis_cluster/redis-3.2.9/[root@redis-2 /data/redis_cluster/redis-3.2.9]# make install4.修改redis配置文件[root@redis-2 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf bind 192.168.81.220 127.0.0.15.启动redis[root@redis-2 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
3.redis 主从复制配置
3.1.批量创建主库 key
[root@redis-1 ~]# for i in{0..2000}; do redis-cli set k_${i}v_${i}; echo "k_${i}is ok"; done127.0.0.1:6379> DBSIZE(integer) 2001
3.2.配置从库连接主库
实现两种配置方式 Redis 主从复制:
配置文件实现命令执行命令3.2.1.在配置文件中设置
1.修改配置文件[root@redis-2 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf slaveof 192.168.81.210 6379 #指定主库ip和端口2.重启redis[root@redis-2 ~]# redis-cli shutdown[root@redis-2 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
3.2.2.命令行热更新配置
[root@redis-2 ~]# redis-cli127.0.0.1:6379> SLAVEOF 192.168.81.210 6379OK
3.3.检查主库数据同步主库数据
1.从库中执行keys检查数据是否相同[root@redis-2 ~]# redis-cli 127.0.0.1:6379> keys * 2.在主库上新建一个key,检查从库是否存在主:127.0.0.1:6379> set name jiangxlOK从:127.0.0.1:6379> get name "jiangxl"k_114,检查从库是否也删除了主:127.0.0.1:6379> del k_114(integer) 1从:127.0.0.1:6379> get k_114(nil)
3.4.在查看日志时,主要从同步原理
主库从库有记录复制的详细日志
4.redis 从复制危险操作开始4.1.使用热更新配置误操作
redis 如果使用热更新配置进行主从复制,有时候因为选错了主机,把从库误认为是主库,所以在主库上执行了 slaveof,这将导致主库上的数据被清空,因为从库中没有数据
从库同步主库时,将清空所有原始数据
误操作过程
从库数据为0127.0.0.1:6379> DBSIZE(integer) 0主库数据为2001127.0.0.1:6379> DBSIZE(integer) 2001在主库上同步操作本应从库的数据127.0.0.1:6379> SLAVEOF 192.168.81.220 6379OK再次查看数据,127数据已清空.0.0.1:6379> DBSIZE(integer) 0
4.2.避免热更新配置误操作
在配置文件中直接配置主从而不使用热更新 slaveof 先执行 bgsave,手动备份数据,然后在数据目录中,将 rdb 将文件复制成另一个文件备份,这样即使有问题,也可以恢复bgsave 之后不需要重启,直接备份 rdb 文件即可
1.手动持久化127.0.0.1:6379> BGSAVEBackground saving started2.备份rdb文件[root@redis-1 ~]# cd /data/redis_cluster/redis_6379/[root@redis-1 /data/redis_cluster/redis_6379]# cd data/[root@redis-1 /data/redis_cluster/redis_6379/data]# cp redis_6379.rdb redis_6379.rdb.bak3.主库再次同步错误,数据丢失127.0.0.1:6379> SLAVEOF 192.168.81.220 6379OK127.0.0.1:6379> keys *(empty list or set)4.还原备份rdb先停止文件redis,在还原[root@redis-1 ~]# redis-cli shutdown[root@redis-1 /data/redis_cluster/redis_6379/data]# cp redis_6379.rdb.bak redis_6379.rdb5.检查还原后的数据[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf 127.0.0.1:6379> DBSIZE(integer) 2001
5.模拟 redis 主要从复制错误数据恢复
模拟 redis 恢复同步误操作数据
大致思路:
清空两台 redis 在主库上创建一些数据,然后使用 bgsave 命令将数据保存到磁盘中,然后将磁盘 rdb 文件备份将从数据库中同步,模拟主库数据丢失 rdb 还原数据库备份文件本实验的主要目的是操作 redis 备份还原
5.1.清空数据
两台 redis 都需要操作
先关闭再删除数据再启动
[root@redis-1 ~]# redis-cli shutdown[root@redis-1 ~]# rm -rf /data/redis_clu
st