• redis主从+ 哨兵模式(sentinel)+漂移VIP实现高可用系统


    原文:https://www.jianshu.com/p/c2ab606b00b7

    客户端程序

    客户端程序(如PHP程序)连接redis时需要ip和port,但redis-server进行故障转移时,主redis是变化的,所以ip地址也是变化的。客户端程序如何感知当前主redis的ip地址和端口呢?
    redis-sentinel提供了接口,请求任何一个sentinel,发送SENTINEL get-master-addr-by-name <master name>就能得到当前主redis的ip和port。
    获取当前主redis的ip和port:

    客户端每次连接redis前,先向sentinel发送请求,获得主redis的ip和port,然后用返回的ip和port连接redis。

    这种方法的缺点是显而易见的,每次操作redis至少需要发送两次连接请求,第一次请求sentinel,第二次请求redis。

    php请求sentinel程序代码可参见:https://github.com/huyanping/redis-sentinel

    更好的办法是使用VIP,当然这对配置的环境有一定的要求,比如redis搭建在阿里云服务器上,可能不支持VIP。

    VIP方案是,redis系统对外始终是同一ip地址,当redis进行故障转移时,需要做的是将VIP从之前的redis服务器漂移到现在新的主redis服务器上。

    比如:当前redis系统中主redis的ip地址是192.168.56.101,那么VIP(192.168.56.250)指向192.168.56.101,客户端程序用VIP(192.168.56.250)地址连接redis,实际上连接的就是当前主redis,这样就避免了向sentinel发送请求。

    当主redis宕机,进行故障转移时,192.168.56.102这台服务器上的redis提升为主,这时VIP(192.168.56.250)指向192.168.56.102,这样客户端程序不需要修改任何代码,连接的是192.168.56.102这台主redis。

    VIP指向192.168.56.101:

     
    故障转移后,VIP漂移指向192.168.56.102:
     

    漂移VIP

    那么现在的问题是,如何在进行redis故障转移时,将VIP漂移到新的主redis服务器上。

    这里可以使用redis sentinel的一个参数client-reconfig-script,这个参数配置执行脚本,sentinel在做failover的时候会执行这个脚本,并且传递6个参数<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中<to-ip>是新主redis的IP地址,可以在这个脚本里做VIP漂移操作。

    sentinel client-reconfig-script master8000   /opt/notify_master6800.sh

    修改三个服务器的redis-sentinel配置文件/etc/sentinel.conf,增加上面一行。然后在/opt/目录下创建notify_master6800.sh脚本文件,这个脚本做VIP漂移操作,内容如下:

    #notify_master6800.sh脚本内容
    #!/bin/bash
    MASTER_IP=$6  #第六个参数是新主redis的ip地址
    LOCAL_IP='192.168.56.101'  #其他两个服务器上为192.168.56.102192.168.56.103
    VIP='192.168.56.250'
    NETMASK='24'
    INTERFACE='eth1'
    if [ ${MASTER_IP} = ${LOCAL_IP} ];then   
        /sbin/ip  addr  add ${VIP}/${NETMASK}  dev ${INTERFACE}  #将VIP绑定到该服务器上
        /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
        exit 0
    else 
       /sbin/ip  addr del  ${VIP}/${NETMASK}  dev ${INTERFACE}   #将VIP从该服务器上删除
       exit 0
    fi
    exit 1  #如果返回1,sentinel会一直执行这个脚本

    现在当前主redis是192.168.56.102,需要手动绑定VIP到该服务器上。

    /sbin/ip  addr add 192.168.56.250/24 dev eth1
    /sbin/arping -q   -c 3 -A 192.168.56.250 -I eth1 

    然后,去另一个服务器上通过VIP地址连接redis-server和redis-sentinel。

    通过VIP连接redis:

    从上面也可以看出当前主redis是192.168.56.102。

    下面关闭这台redis服务,看看VIP是否漂移到另一台服务器上。

    redis-cli -h 192.168.56.102 -p 8000 shutdown

    通过查询sentinel发现192.168.56.103提升为主。
     

    通过访问VIP连接redis,发现VIP确实指向了192.168.56.103。

    总结

    通过上面的操作,使用redis主从 + 哨兵(sentinel)+ 漂移VIP的方案搭建了一个redis高可用系统,但这个系统保证的是单个redis实例的高可用,所以适合业务比较小的应用。如果业务比较大,并发量比较高,建议搭建redis集群,比如官方redis cluster,还有开源的codings集群。

    另外,漂移VIP可以使用keepalived软件来实现,这里就不多介绍了。

     
     
     
  • 相关阅读:
    RMAN01009: syntax error: found "dot" 解决方法
    Oracle 11g 新特性 DB_ULTRA_SAFE 参数 说明
    Oracle 11g 新特性 Result Cache(结果高速缓存)说明
    Oracle 11g 新特性 DB_ULTRA_SAFE 参数 说明
    /dev/sdxx is apparently in use by the system; will not make a filesystem here! 解决方法
    CSDN博客之星 投票说明
    Oracle 11g 新特性 – ACFS 说明
    Oracle 与 iptables 和 SELinux 禁用关系 说明
    Vbox 安装 windows Server 2008 R2 报错 Info: An unexpected error has occurred 解决方法
    Oracle 11g 新特性 SecureFiles 说明
  • 原文地址:https://www.cnblogs.com/-wenli/p/11379606.html
Copyright © 2020-2023  润新知