10模拟redis主从故障及恢复上线操作
一准备2台装有redis的机器(在所有节点都操作):
1#杀掉redis:pkill redis
2#清空数据:rm -rf /data/redis_cluster/redis_6379/*
3#编写配置文件
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.201 127.0.0.1
### 监听端口
port 6379
### pid 文件和 log 文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为 0
databases 16
### 指定本地持久化文件的文件名,默认是 dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
save 600 1
save 300 10
save 60 100
4#启动服务:redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
5#检查两边都没有数据:
[root@db02 redis_6379]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
二模拟场景:
1在主库db01中生成数据:[root@db01 redis_6379]# for i in {0..20};do redis-cli set k_${i} v_${i}; echo "${i} is ok";done
2在主库中生成数据并备份:
[root@db01 redis_6379]# redis-cli bgsave
Background saving started
[root@db01 redis_6379]# cd /data/redis_cluster/redis_6379
[root@db01 redis_6379]# ls
redis_6379.rdb
[root@db01 redis_6379]# cp redis_6379.rdb redis_6379.rdb.bak
[root@db01 redis_6379]# ll
总用量 8
-rw-r--r--. 1 root root 292 4月 8 00:28 redis_6379.rdb
-rw-r--r--. 1 root root 292 4月 8 00:32 redis_6379.rdb.bak
3模拟主库操作失误,同步了从库的数据:
[root@db01 redis_6379]# redis-cli
127.0.0.1:6379> slaveof 10.0.0.202 6379
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
4模拟恢复:
(1)服务器突然挂掉了
[root@db01 ~]# ps -ef|grep redis
root 1436 1 0 00:10 ? 00:00:05 redis-server 10.0.0.201:6379
root 1484 981 0 00:50 pts/0 00:00:00 grep --color=auto redis
[root@db01 ~]# kill -9 1436
[root@db01 ~]# ll /data/redis_cluster/redis_6379
总用量 8
-rw-r--r--. 1 root root 76 4月 8 00:37 redis_6379.rdb
-rw-r--r--. 1 root root 292 4月 8 00:32 redis_6379.rdb.bak
(2)如果配置文件中有slaveof 10.0.0.202 6379语句,注释掉配置文件里的slaveof语句
(3)恢复备份数据:
[root@db01 ~]# cd /data/redis_cluster/redis_6379
[root@db01 redis_6379]# ls
redis_6379.rdb redis_6379.rdb.bak
[root@db01 redis_6379]# cp redis_6379.rdb.bak redis_6379.rdb
cp:是否覆盖"redis_6379.rdb"? y
[root@db01 redis_6379]# ll
总用量 8
-rw-r--r--. 1 root root 292 4月 8 00:58 redis_6379.rdb
-rw-r--r--. 1 root root 292 4月 8 00:32 redis_6379.rdb.bak
(4)启动主库redis并检查数据是否恢复了:
[root@db01 redis_6379]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db01 redis_6379]# redis-cli
127.0.0.1:6379> keys *
5模拟主库故障:
(1)在db02中执行slaveof 10.0.0.201 6379
(2)打开db02日志观察:[root@db02 ~]# tail -f /opt/redis_cluster/redis_6379/logs/redis_6379.log
(3)关闭db01模拟宕机:root@db01 ~]# redis-cli shutdown
此时日志报错1397:S 09 Apr 02:15:11.672 # Error condition on socket for SYNC: Connection refused
6从库如何接管主库?
(1)从库db02执行slaveof no one 取消复制关系,
也可以在其它机器中远程操作:[root@db01 ~]# redis-cli -h db02 -p 6379 slaveof no one
取消复制关系后,从库就可以进行读写了
[root@db01 ~]# redis-cli -h db02 -p 6379 set k1 vyyy
OK
[root@db01 ~]# redis-cli -h db02 -p 6379 get k1
"vyyy"
(2)通知后端修改代码,让程序指向这个从库为主库
(3)备份从库数据:
[root@db02 ~]# cd /data/redis_cluster/redis_6379
[root@db02 redis_6379]# ls
redis_6379.rdb
[root@db02 redis_6379]# cp redis_6379.rdb redis_6379.rdb.bak
(4)修复已经坏掉的主库
[root@db01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db01 ~]# ps -ef|grep redis
root 1154 1 0 02:31 ? 00:00:00 redis-server 10.0.0.201:6379
root 1158 1088 0 02:31 pts/0 00:00:00 grep --color=auto redis
[root@db01 ~]#
(5)将修复好的旧主库变为从库(关闭均衡负载,防止数据写入)
[root@db01 ~]# redis-cli
127.0.0.1:6379> slaveof 10.0.0.202 6379
OK
127.
(6)将修复后的主库重新升级为主库,并通知后端代码指向修复后的主库:
[root@db01 ~]# redis-cli
127.0.0.1:6379> slaveof 10.0.0.202 6379 #取消主从关系
OK
127.
[root@db02 redis_6379]# redis-cli
127.0.0.1:6379> slaveof 10.0.0.201 6379
OK
127.0.0.1:6379>
注意:修复的时候需要先将配置文件中的slaveof代码注销掉,要不没办法使用热键进行来回的切换

浙公网安备 33010602011771号