Redis主从故障模拟及恢复

Posted MiMuheYe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis主从故障模拟及恢复相关的知识,希望对你有一定的参考价值。

目录

一、 模拟主库不小心同步了从库及恢复

1、具体环境

2、模拟步骤

3、模拟恢复

二、 模拟主库故障及恢复

1、环境恢复

2、模拟主库故障

3、模拟恢复

 

一、模拟主库不小心同步了从库及恢复

1、具体环境

db01

IP地址:10.0.0.51

主机名:db01

Redis中有数据,可以使用【for i in 1..2000;do redis-cli SET k_$i v_$i;echo $i is ok;done】脚本来生成实验数据,关闭AOF,开启RDB

角色:主库

 

db02

IP地址:10.0.0.52

主机名:db02

Redis无数据,关闭AOF,开启RDB

角色:从库

 

2、模拟步骤

db01

[root@db01/data/redis_cluster/redis_6379 08:44:32]# for i in 1..2000;do redis-cli SET k_$i v_$i;echo $i is ok;done
//db01执行脚本,生成实验数据
[root@db01/data/redis_cluster/redis_6379 08:47:13]# redis-cli dbsize

(integer) 2000

//db01查看当前键值对数量,一共生成了2000个

 

db02

[root@db02/data/redis_cluster/redis_6379 08:45:16]# redis-cli

127.0.0.1:6379> keys *

(empty list or set)
//可以看到db02目前什么数据都没有

 

db01

[root@db01/data/redis_cluster/redis_6379 08:50:05]# redis-cli BGSAVE

Background saving started

//手动保存一份完整的RDB文件
[root@db01/data/redis_cluster/redis_6379 08:50:17]# cp redis_6379.rdb redis_6379.rdb.bak
//备份一份RDB文件

[root@db01/data/redis_cluster/redis_6379 08:50:23]# ll

total 56

-rw-r--r-- 1 root root 27868 Mar  3 08:50 redis_6379.rdb

-rw-r--r-- 1 root root 27868 Mar  3 08:50 redis_6379.rdb.bak

//一定要注意大小,大小不一致一定要重新备份

 

db01

[root@db01/data/redis_cluster/redis_6379 08:52:15]# redis-cli SLAVEOF 10.0.0.52 6379

OK


//现在主库db01不小心同步到从库去了,也就是说现在db01变成从库,db02变成主库了

 

db01&db02

db01:
127.0.0.1:6379> keys *

(empty list or set)
//可以看到db01原本的数据丢失了
[root@db01/data/redis_cluster/redis_6379 08:55:35]# ll

total 32

-rw-r--r-- 1 root root    76 Mar  3 08:52 redis_6379.rdb

-rw-r--r-- 1 root root 27868 Mar  3 08:50 redis_6379.rdb.bak
//可以看到主库RDB文件从27868字节变成了现在的76字节了,76字节就意味着是空的

db02:

127.0.0.1:6379> keys *

(empty list or set)
//可以看到db02也没有

 

 

3、模拟恢复

db01

[root@db01/data/redis_cluster/redis_6379 08:58:06]# redis-cli SLAVEOF NO ONE

OK

//第一步必须先断开主从,如果配置文件中配置了主从关系也要删除配置文件里面的主从

[root@db01/data/redis_cluster/redis_6379 08:58:25]# redis-cli shutdown
//第二步软关闭redis,以免新数据产生
[root@db01/data/redis_cluster/redis_6379 08:58:40]# rm -rf redis_6379.rdb
//第三步删除现在的RDB文件

[root@db01/data/redis_cluster/redis_6379 08:58:44]# cp redis_6379.rdb.bak redis_6379.rdb
//第四步复制我们备份好的RDB文件,不要用mv,以防万一

[root@db01/data/redis_cluster/redis_6379 08:58:47]# ll

total 56

-rw-r--r-- 1 root root 27868 Mar  3 08:58 redis_6379.rdb

-rw-r--r-- 1 root root 27868 Mar  3 08:50 redis_6379.rdb.bak
//第七步查看复制好的RDB文件,是否和备份文件大小一致

[root@db01/data/redis_cluster/redis_6379 08:59:23]# redis-server@start

//第六步重新启动redis,这里用来alias别名,本质还是redis-server加配置文件路径
[root@db01/data/redis_cluster/redis_6379 09:07:10]# redis-cli dbsize

(integer) 2000

第七步可以看到数据已经恢复了

 

db02

[root@db02/data/redis_cluster/redis_6379 09:07:54]# redis-cli dbsize

(integer) 0

//一定要注意在做主从的时候,从库一定要看一下有没有其他数据,因为一旦执行了主从命令,从库数据将被刷新成主库的数据
[root@db02/data/redis_cluster/redis_6379 09:08:09]# redis-cli SLAVEOF 10.0.0.51 6379

OK

[root@db02/data/redis_cluster/redis_6379 09:09:28]# redis-cli INFO REPLICATION

# Replication

role:slave

master_host:10.0.0.51

master_port:6379

master_link_status:up

master_last_io_seconds_ago:6

master_sync_in_progress:0

slave_repl_offset:15

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2369

repl_backlog_histlen:1456

//执行同步命令后可以查看一下状态,目前db02变成了从库
[root@db02/data/redis_cluster/redis_6379 09:09:44]# redis-cli DBSIZE

(integer) 2000

//可以看到db02从库已经从主库那里同步过来了那2000个键值对了

 

 

 

 

二、模拟主库故障及恢复

1、环境恢复

db01

[root@db01/data/redis_cluster/redis_6379 09:30:47]# rm -rf redis_6379.rdb.bak
//只需要把rdb备份的文件删除即可,实验接着前面的实验继续

 

2、模拟主库故障

db01

[root@db01/data/redis_cluster/redis_6379 09:32:44]# redis-cli shutdown
//模拟关闭主库

 

3、模拟恢复

db02

[root@db02~ 09:41:13]# tail -f /opt/redis_cluster/redis_6379/logs/redis_6379.log
18090:S 03 Mar 09:41:19.471 * Connecting to MASTER 10.0.0.51:6379

18090:S 03 Mar 09:41:19.471 * MASTER <-> SLAVE sync started

18090:S 03 Mar 09:41:19.472 # Error condition on socket for SYNC: Connection refused
//查看db02的日志,可以看到一直在连接主库,但是一直连接同步失败,db02会一直尝试连接主库,除非认为断开

 

db02

[root@db02/data/redis_cluster/redis_6379 09:44:30]# redis-cli SLAVEOF NO ONE

OK

[root@db02/data/redis_cluster/redis_6379 09:45:08]# cp redis_6379.rdb redis_6379.rdb.ba
//关闭主从复制,并且备份一份rdb文件以防万一
[root@db02/data/redis_cluster/redis_6379 09:49:08]# redis-cli SET TEST T1;

OK

//这个时候肯定得维护的牌子,立刻将后端服务器连接Redis的IP改成从库db02的,然后在将维护的牌子重新摘除,换完之后肯定会有数据到db02上了,这里TEST:T1键值对就是模拟数据到db02上

 

db01

[root@db01/data/redis_cluster/redis_6379 09:46:06]# redis-server@start
//现在db01修好了,所以启动db01
[root@db01/data/redis_cluster/redis_6379 09:51:50]# redis-cli SLAVEOF 10.0.0.52 6379

OK
//现在将db01与db02的角色调换过来,db01变成从库,db02变成主库

[root@db01/data/redis_cluster/redis_6379 09:51:56]# redis-cli DBSIZE

(integer) 2001

//db01现在可以看一下,2001个键值对,2001个说明TEST:T1那个新数据也恢复过来了

 

以上是关于Redis主从故障模拟及恢复的主要内容,如果未能解决你的问题,请参考以下文章

Redis——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

redis的主从配置与故障切换恢复操作

redis主从同步及手动处理故障

Redis主从复制哨兵实现,并模拟master故障场景

Redis哨兵模式(sentinel)学习总结及部署记录(主从复制读写分离主从切换)

Redis哨兵模式(sentinel)学习总结及部署记录(主从复制读写分离主从切换)