Redis主从故障模拟及恢复
Posted MiMuheYe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis主从故障模拟及恢复相关的知识,希望对你有一定的参考价值。
目录
一、模拟主库不小心同步了从库及恢复
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 (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) |
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: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&db02
db01: (empty list or set) 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 127.0.0.1:6379> keys * (empty list or set) |
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 [root@db01/data/redis_cluster/redis_6379 08:58:44]# cp redis_6379.rdb.bak redis_6379.rdb [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 [root@db01/data/redis_cluster/redis_6379 08:59:23]# redis-server@start //第六步重新启动redis,这里用来alias别名,本质还是redis-server加配置文件路径 (integer) 2000 第七步可以看到数据已经恢复了 |
db02
[root@db02/data/redis_cluster/redis_6379 09:07:54]# redis-cli dbsize (integer) 0 //一定要注意在做主从的时候,从库一定要看一下有没有其他数据,因为一旦执行了主从命令,从库数据将被刷新成主库的数据 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变成了从库 (integer) 2000 //可以看到db02从库已经从主库那里同步过来了那2000个键值对了 |
二、模拟主库故障及恢复
1、环境恢复
db01
[root@db01/data/redis_cluster/redis_6379 09:30:47]# rm -rf redis_6379.rdb.bak |
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 * MASTER <-> SLAVE sync started 18090:S 03 Mar 09:41:19.472 # Error condition on socket for SYNC: Connection refused |
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 OK //这个时候肯定得维护的牌子,立刻将后端服务器连接Redis的IP改成从库db02的,然后在将维护的牌子重新摘除,换完之后肯定会有数据到db02上了,这里TEST:T1键值对就是模拟数据到db02上 |
db01
[root@db01/data/redis_cluster/redis_6379 09:46:06]# redis-server@start OK [root@db01/data/redis_cluster/redis_6379 09:51:56]# redis-cli DBSIZE (integer) 2001 //db01现在可以看一下,2001个键值对,2001个说明TEST:T1那个新数据也恢复过来了 |
以上是关于Redis主从故障模拟及恢复的主要内容,如果未能解决你的问题,请参考以下文章
Redis——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复