设为首页 收藏本站
查看: 807|回复: 0

[经验分享] 模拟redis灾难恢复(实验)

[复制链接]

尚未签到

发表于 2018-11-2 11:56:16 | 显示全部楼层 |阅读模式
  目前通常的设计思路:
  利用replication机制来弥补aof、snapshot性能上的不足,达到了数据可持久化。
  即master上RDB和AOF都不开启,来保证master的读写性能,
  而slave上则同时开启RDB和AOF来进行持久化,保证数据的安全性。
  如果数据要做持久化,又想保证稳定性,建议留一半的物理内存。
  因为在进行snapshot时,fork出来进行dump操作的子进程会占用与父进程一样的内存,
  真正的copy-on-write,对性能的影响和内存的耗用都是比较大的。
  环境描述:
  master:192.168.2.100    不开启RDB和AOF
  slave:192.168.2.200    开启RDB和AOF
  配置信息:
  master:
  # vim etc/redis.conf
  #save 600 5           //禁用RDB
  appendonly no       //禁用AOF
  requirepass 123456        //指定验证密码
  slave:
  # vim etc/redis.conf
  save 600 5           //开启RDB
  dbfilename "dump_6379.rdb"         //RDB文件
  dir "/usr/local/redis-3.0.6-6379"           //RDB文件路径
  appendonly yes      //开启AOF
  appendfilename "appendonly.aof"        //指定AOF文件
  appendfsync everysec                //每秒强制写入磁盘一次
  no-appendfsync-on-rewrite no        //在日志重写时,不进行命令追加操作
  auto-aof-rewrite-percentage 100            //当前AOF超过上一次AOF大小100%时重写
  auto-aof-rewrite-min-size 64mb           //日志重写最小值
  slaveof 192.168.2.100 6379          //指定主库IP和端口
  masterauth 123456          //指定主库登录密码
  启动redis:
  master:# redis-server etc/redis.conf
  slave:# redis-server etc/redis.conf
  master创建key:
  # redis-cli -a 123456
  127.0.0.1:6379> info replication         //查看主从关系是否正确
  127.0.0.1:6379> keys *               //此时,master安装目录下是没有RDB文件的
  (empty list or set)
  127.0.0.1:6379> set name zhagnsan       //创建3个key
  OK
  127.0.0.1:6379> set age 26
  OK
  127.0.0.1:6379> set home beijing
  OK
  slave检查同步情况:
  # redis-cli
  127.0.0.1:6379> keys *            //数据已同步
  1) "age"
  2) "home"
  3) "name"
  模拟master故障:
  # ps -ef |grep redis
  root     126472      1  0 21:58 ?        00:00:02 redis-server *:6379
  root     127714   2844  0 22:29 pts/0    00:00:00 grep --color=auto redis
  # kill -9 126472
  # rm -rf dump_6379.rdb
  slave查看主从状态:
  # redis-cli
  127.0.0.1:6379> info replication
  # Replication
  role:slave
  master_host:192.168.2.100
  master_port:6379
  master_link_status:down                //我们看到master已经不可访问了,slave正常
  master_last_io_seconds_ago:-1
  ... ...
  灾难恢复:
  1、取消slave的同步状态
  避免master未完成数据恢复就重启,导致覆盖掉slave上的数据,最终数据丢失。
  127.0.0.1:6379> SLAVEOF no one      //动态修改配置文件,将slavof设置为no
  OK
  127.0.0.1:6379> info repolication        //查看主从信息,已经没有了
  127.0.0.1:6379>
  2、启动master的redis,确认数据不存在(这步可以忽略,我只是想确认下有没有数据)
  # redis-server etc/redis.conf
  # redis-cli -a 123456
  127.0.0.1:6379> keys *
  (empty list or set)
  # ps -ef |grep redis
  root     128031      1  0 22:45 ?        00:00:00 redis-server *:6379
  root     128050   2844  0 22:46 pts/0    00:00:00 grep --color=auto redis
  # kill -9 128031                 //再次异常关闭redis
  # rm -rf dump_6379.rdb    //再次删除RDB文件
  3、拷贝RDB文件和AOF文件给master
  # scp dump_6379.rdb 192.168.2.100:/usr/local/redis-3.0.6-6379/
  # scp appendonly.aof 192.168.2.100:/usr/local/redis-3.0.6-6379/
  4、master开启RDB、开启AOF
  # vim etc/redis.conf
  save 600 5           //开启RDB
  dbfilename "dump_6379.rdb"         //RDB文件
  dir "/usr/local/redis-3.0.6-6379"           //RDB文件路径
  appendonly yes      //开启AOF
  appendfilename "appendonly.aof"        //指定AOF文件
  ... ...
  5、master启动redis,查看库,数据已恢复
  # redis-server etc/redis.conf
  # redis-cli -a 123456
  127.0.0.1:6379> keys *
  1) "home"
  2) "name"
  3) "age"
  6、master数据恢复后,需要关闭RDB和AOF,来保证自身的读写性能。
  但是RDB文件和AOF文件要保留(不能恢复数据后给删除了)
  虽然RDB文件和AOF文件存在,但大小不会增加,依然只是salve的AOF文件增加。
  # kill [redis PID]               //关闭redis
  # vim etc/redis.conf        //关闭RDB和AOF
  #save 600 5
  appendonly no
  # redis-server etc/redis.conf    //启动redis
  # redis-cli -a 123456
  127.0.0.1:6379> keys *       //关闭RDB和AOF功能,库中的数据依然存在
  1) "home"
  2) "name"
  3) "age"
  7、slave开启同步状态
  127.0.0.1:6379> SLAVEOF 192.168.2.100 6379           //开启同步状态
  OK
  127.0.0.1:6379> info replication
  # Replication
  role:slave
  master_host:192.168.2.100
  master_port:6379
  master_link_status:up                //master可以正常访问了
  master_last_io_seconds_ago:5
  master_sync_in_progress:0
  ... ...
  8、master创建key
  127.0.0.1:6379> set abc 123      //新增一个key
  OK
  127.0.0.1:6379> keys *
  1) "abc"
  2) "home"
  3) "name"
  4) "age"
  9、slave查看同步情况
  127.0.0.1:6379> keys *
  1) "abc"
  2) "age"
  3) "home"
  4) "name"
  总结:
  在此次恢复的过程中,我们同时使用了AOF和RDB文件,那么到底是哪个文件完成了恢复呢?
  1、如果只配置了RDB,启动时加载的是RDB文件;
  2、如果只配置了AOF,启动时加载的是AOF文件;
  3、如果同时配置了RDB和AOF,由于AOF优先级高于RDB,所以使用的是AOF文件。
  而且,AOF文件的数据完整性要高于RDB文件,因为RDB是按照周期性策略进行保存的。
  如果在下个周期来临前故障,那么将丢失上个周期到故障点的数据。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629817-1-1.html 上篇帖子: 监控CPU负载、Nginx、TCP、PHP、Memcached、Redis、Mysql、Tomcat 下篇帖子: Redis主从同步原理解析(实验)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表