为什么很多人用keepalived来实现redis故障转移

目前,Redis还没有一个类似于MySQL Proxy或Oracle RAC的官方HA方案。Redis作者有一个名为Redis Sentinel的计划 ,据称将会有监控,报警和自动故障转移三大功能,非常不错。但可惜的是短期内恐怕还不能开发完成。因此,如何在出现故障时自动转移是一个需要解决的问题。通过对网上一些资料的搜索,有建议采用HAProxy或Keepalived来实现的,事实上如果是做Failover而非负载均衡的话,Keepalived的效率肯定是超过HAProxy的,所以我决定采用Keepalived的方案。环境介绍:Master: 10.6.1.143Slave: 10.6.1.144Virtural IP Address (VIP): 10.6.1.200设计思路:当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从复制功能;当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。然后依次循环。需要注意的是,这样做需要在Master与Slave上都开启本地化策略,否则在互相自动切换的过程中,未开启本地化的一方会将另一方的数据清空,造成数据完全丢失。下面,是具体的实施步骤:在Master和Slave上安装Keepalived$ sudo apt-get install keepalived修改Master和Slave的/etc/hosts文件$ sudo vim /etc/hosts127.0.0.1	localhost10.6.1.143	redis10.6.1.144	redis-slave

默认安装完成keepalived之后是没有配置文件的,因此我们需要手动创建:首先,在Master上创建如下配置文件:$ sudo vim /etc/keepalived/keepalived.confvrrp_script chk_redis {                 script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本                 interval 2                                        ###监控时间 } vrrp_instance VI_1 {         state MASTER                            ###设置为MASTER        interface eth0                          ###监控网卡            virtual_router_id 51        priority 101                            ###权重值        authentication {                      auth_type PASS             ###加密                      auth_pass redis            ###密码         }         track_script {                 chk_redis                       ###执行上面定义的chk_redis        }         virtual_ipaddress {              10.6.1.200                         ###VIP         }        notify_master /etc/keepalived/scripts/redis_master.sh        notify_backup /etc/keepalived/scripts/redis_backup.sh        notify_fault  /etc/keepalived/scripts/redis_fault.sh        notify_stop   /etc/keepalived/scripts/redis_stop.sh } 

然后,在Slave上创建如下配置文件:$ sudo vim /etc/keepalived/keepalived.confvrrp_script chk_redis {                 script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本                 interval 2                                        ###监控时间 } vrrp_instance VI_1 {         state BACKUP                                ###设置为BACKUP         interface eth0                              ###监控网卡        virtual_router_id 51         priority 100                                ###比MASTRE权重值低         authentication {                      auth_type PASS                      auth_pass redis                ###密码与MASTRE相同        }         track_script {                 chk_redis                       ###执行上面定义的chk_redis        }         virtual_ipaddress {              10.6.1.200                         ###VIP         }         notify_master /etc/keepalived/scripts/redis_master.sh        notify_backup /etc/keepalived/scripts/redis_backup.sh        notify_fault  /etc/keepalived/scripts/redis_fault.sh        notify_stop   /etc/keepalived/scripts/redis_stop.sh }

在Master和Slave上创建监控Redis的脚本$ sudo mkdir /etc/keepalived/scripts$ sudo vim /etc/keepalived/scripts/redis_check.sh#!/bin/bash

ALIVE=`/opt/redis/bin/redis-cli PING`if [ "$ALIVE" == "PONG" ]; then  echo $ALIVE  exit 0else  echo $ALIVE  exit 1fi

编写以下负责运作的关键脚本:notify_master /etc/keepalived/scripts/redis_master.shnotify_backup /etc/keepalived/scripts/redis_backup.shnotify_fault /etc/keepalived/scripts/redis_fault.shnotify_stop /etc/keepalived/scripts/redis_stop.sh因为Keepalived在转换状态时会依照状态来呼叫:当进入Master状态时会呼叫notify_master当进入Backup状态时会呼叫notify_backup当发现异常情况时进入Fault状态呼叫notify_fault当Keepalived程序终止时则呼叫notify_stop首先,在Redis Master上创建notity_master与notify_backup脚本:$ sudo vim /etc/keepalived/scripts/redis_master.sh#!/bin/bash

REDISCLI="/opt/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"

echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE 2>&1

echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.6.1.144 6379 >> $LOGFILE  2>&1sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

$ sudo vim /etc/keepalived/scripts/redis_backup.sh#!/bin/bash

REDISCLI="/opt/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"

echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.6.1.144 6379 >> $LOGFILE  2>&1

接着,在Redis Slave上创建notity_master与notify_backup脚本:$ sudo vim /etc/keepalived/scripts/redis_master.sh#!/bin/bash

REDISCLI="/opt/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"

echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE 2>&1

echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.6.1.143 6379 >> $LOGFILE  2>&1sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

$ sudo vim /etc/keepalived/scripts/redis_backup.sh#!/bin/bash

REDISCLI="/opt/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"

echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.6.1.143 6379 >> $LOGFILE  2>&1

然后在Master与Slave创建如下相同的脚本:$ sudo vim /etc/keepalived/scripts/redis_fault.sh#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo "[fault]" >> $LOGFILEdate >> $LOGFILE

$ sudo vim /etc/keepalived/scripts/redis_stop.sh#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo "[stop]" >> $LOGFILEdate >> $LOGFILE

给脚本都加上可执行权限:$ sudo chmod +x /etc/keepalived/scripts/*.sh脚本创建完成以后,我们开始按照如下流程进行测试:1.启动Master上的Redis$ sudo /etc/init.d/redis start2.启动Slave上的Redis$ sudo /etc/init.d/redis start3.启动Master上的Keepalived$ sudo /etc/init.d/keepalived start4.启动Slave上的Keepalived$ sudo /etc/init.d/keepalived start5.尝试通过VIP连接Redis:$ redis-cli -h 10.6.1.200 INFO连接成功,Slave也连接上来了。role:masterslave0:10.6.1.144,6379,online6.尝试插入一些数据:$ redis-cli -h 10.6.1.200 SET Hello RedisOK从VIP读取数据$ redis-cli -h 10.6.1.200 GET Hello"Redis"从Master读取数据$ redis-cli -h 10.6.1.143 GET Hello"Redis"从Slave读取数据$ redis-cli -h 10.6.1.144 GET Hello"Redis"下面,模拟故障产生:将Master上的Redis进程杀死:$ sudo killall -9 redis-server查看Master上的Keepalived日志$ tailf /var/log/keepalived-redis-state.log[fault]Thu Sep 27 08:29:01 CST 2012同时Slave上的日志显示:$ tailf /var/log/keepalived-redis-state.log[master]Fri Sep 28 14:14:09 CST 2012Being master....Run SLAVEOF cmd ...OKRun SLAVEOF NO ONE cmd ...OK然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。$ redis-cli -h 10.6.1.200 INFO$ redis-cli -h 10.6.1.144 INFOrole:master然后我们恢复Master的Redis进程$ sudo /etc/init.d/redis start查看Master上的Keepalived日志$ tailf /var/log/keepalived-redis-state.log[master]Thu Sep 27 08:31:33 CST 2012Being master....Run SLAVEOF cmd ...OKRun SLAVEOF NO ONE cmd ...OK同时Slave上的日志显示:$ tailf /var/log/keepalived-redis-state.log[backup]Fri Sep 28 14:16:37 CST 2012Being slave....Run SLAVEOF cmd ...OK可以发现目前的Master已经再次恢复了Master的角色,故障切换以及自动恢复都成功了。转载
时间: 2024-10-09 18:22:24

为什么很多人用keepalived来实现redis故障转移的相关文章

MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移

转自 MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移 - KK ——专注数据 - 博客频道 - CSDN.NEThttp://blog.csdn.net/kk185800961/article/details/51115264# 系统信息: mysql主库 192.168.1.152 CentOS 5.6 mysql 5.6.22 mysql从库 192.168.1.153 CentOS 5.6 mysql 5.6.22 VIP 192.168.1.150 my

Redis故障转移

一.环境说明 单机 redis-3.2.1 二.操作截图 注意:     如果是部署在不同的服务器上,千万记得防火墙开放相应端口,并且在哨兵的配置中增加如下 protected mode=no 记住,哨兵是一个特殊的Redis实例,对于Redis配置文件中的一些通用配置项一样可以用在哨兵的配置 文件中

如何选择编程入门语言?一个让很多人纠结的问题

用心分享,共同成长 没有什么比你每天进步一点点更实在了 本文已经收录至我的github,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 点关注,不迷路!!! 为什么会出这样一篇文章? ?本来想写点最近学习的东西,但是最近好多粉丝再问我一个问题. image-20200105164345384 于是我决定把我这个过来人的一些建议给到你们,希望大家少一些不必要的迷茫,多花点时间去学习该学习的东西,去做一些重要的事情. 刚开始学习

上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?

今天群里有人聊图片上传,简单说下自己的经验 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那么如果我在传路径的时候,前面加了一个../呢,这样这种服务器端的限制就跳过了.(DJ音乐站基本上都有这个问题,以及用某编辑器的同志) 1.常用方法:这种就是根据后缀判断是否是图片文件,需要注意的是这种格式:文件:1.asp;.jpg  1.asp%01.jpg  目录: 1.jpg/1.asp 1.jpg/1.

51cto 真好!我又回到了这里!! 看到很多人还在!小废物、小松等等小伙伴还在吗?

呵呵,好几年过去了,发生了好多故事!  现在大家都有很多的改变吧? 作为同龄人的小废物等人现在过得怎么样了? 大家都还好吗?? 51cto 真好!我又回到了这里!! 看到很多人还在!小废物.小松等等小伙伴还在吗?,布布扣,bubuko.com

为什么知乎上很多人都反对创业?(上战场的士兵如果先拿枪打打靶练练枪法,研究研究战术之后,战损比肯定要更好看一点)

为什么知乎上很多人都反对创业? 经常看到一些排名靠前的答案,内容无非规劝他人不要创业,要脚踏实地,认为党和国家大众创业万众创新的政策方针都是胡扯?难道知乎上的知识分子们竟比国家的智囊更有远见?还是他们的认识层次达不到? 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:唐缺链接:https://www.zhihu.com/question/37559307/answer/72755062来源:知乎 -------------------------------------

很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)

<西游记>中的唐僧团队历经千难万险,终于求得真经,目标明确.分工合理为这支队伍最终走向成功奠定了基础.唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇.悟空探路.八戒牵马.沙僧挑担,几位徒弟一起肩负着保护唐僧的任务.虽然性格迥异.各有缺点,但目标分解合理及成员分工合作,最终风雨同舟,取得真经. <西游记>的故事引申到实际团队技术管理中,也一样有借鉴意义,本文作者为CTO俱乐部会员.湖北同城一家网络科技有限公司开发总监杨斌,他结合自己多年经历谈谈

很多人都说给孩子吃零食不好,这点我也非常肯定

很多人都说给孩子吃零食不好,这点我也非常肯定,但是任何事物也都不是绝对.零食虽然通常都会含有大量的糖分.添加剂或者是油脂等等,对儿童的身体发育相当不利http://www.ximalaya.com/zhubo/27345094/ http://www.ximalaya.com/zhubo/27345095/ http://www.ximalaya.com/zhubo/27345096/ http://www.ximalaya.com/zhubo/27345098/ http://www.xima

很多人,被这句话害了一辈子

点击上方蓝字关注我们,夜读与你一起砥砺前行! 21君:小时候,你可听过“这孩子特聪明,就是学习不用心,他要是认真起来,学习成绩肯定好.”这句话么?是对你说的,还是对你身边的人说的?很多人都觉得这是一个夸奖,但其实给孩子这样的一个想法,其实是害了孩子.自作聪明的人,往往还没有学会正视自己与他人的努力和付出,就已经喜欢了那种轻盈获胜的姿态.为了姿态好看,他们宁可输,也不想通过努力制胜.来源:衷曲无闻(zhongquwuwen) 8:48 很多人,被这句话害了一辈子 来自21世纪经济报道   特别鸣谢