Redis主从故障模拟及恢复

要须心地收汗马,孔孟行世目杲杲。这篇文章主要讲述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
【Redis主从故障模拟及恢复】(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那个新数据也恢复过来了
 

    推荐阅读