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代码注销掉,要不没办法使用热键进行来回的切换

posted @ 2021-04-07 17:05  linuxTang  阅读(402)  评论(0)    收藏  举报