要须心地收汗马,孔孟行世目杲杲。这篇文章主要讲述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那个新数据也恢复过来了 |
推荐阅读
- 常见的基于比较的排序算法
- yum管理工具
- 自制yum仓库
- ceph基于VMware Workstation虚拟机Ceph集群安装配置笔记#私藏项目实操分享#
- 如何使用maven把项目及其依赖打包为可运行jar包
- ROS 2.0-SPRINGER-机器人学工具科研和教学重要参考书-机器人操作系统(ROS)-THE COMPLETE REFERENCE
- Prometheus监控K8S各项指标
- linux之service命令
- 云原生应用配置中心简述