• Redis高可用之Sentinel哨兵


    一,单实例模式

    当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行。

    image_1d0e2ab6s1pib1k5s17khdr2vq9.png-235.1kB

     

    二,主从模式

    由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份。当一台redis出现问题了,另一台redis可以继续提供服务。

    image_1d0e2bkk81e4e17m775mhf38bgm.png-390.2kB

     

    三,自动故障转移机制

    虽然上面redis做了备份,看上去很完美。但由于redis目前只支持主从复制备份(不支持主主复制),当主redis挂了,从redis只能提供读服务,无法提供写服务。所以,还得想办法,当主redis挂了,让从redis升级成为主redis。

    这就需要自动故障转移,redis sentinel带有这个功能,当一个主redis不能提供服务时,redis sentinel可以将一个从redis升级为主redis,并对其他从redis进行配置,让他们使用新的主redis进行复制备份。

    Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。它的主要功能有以下几点

    实时地监控redis是否按照预期良好地运行;

    如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);

    能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其他的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。

    image_1d0e2ct821roc11rb1uhb1b19t3g13.png-574.1kB

     

    四,redis的主从复制部署

     

    源码包下载

    链接:https://pan.baidu.com/s/1yEMChN6Cm3Hh1-lAVVpQ-A 
    提取码:ttun

     

    4.1 环境描述

    redis-server 说明 redis-sentinel说明

    这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为6800,修改默认端口是安全的第一步。

    IP主机名
    192.168.200.70:8000 redis-master
    192.168.200.105:8000 redis-slaveA
    192.168.200.106:8000 redis-slaveB
     

    部署环境

    cat /etc/redhat-release

    uname -r

    image_1d0e3c1id1p9obv8h605te1ktd1g.png-21.4kB

     

    关闭防火墙和selinux

    systemctl stop firewalld

    systemctl disable firewalld

    setenforce 0

    image_1d0e3d6llhdc5d61h3ubk51lt21t.png-25.7kB

     

    4.2 redis-server端的部署

     

    三台服务器上都进行如下编译安装

    yum -y install gcc gcc-c++ make automake autoconf

    ls

    tar xf redis-4.0.11.tar.gz -C /usr/src/

    cd /usr/src/redis-4.0.11/

    make MALLOC=jemalloc

    make PREFIX=/usr/local/redis install

    mkdir -p /usr/local/redis/conf

    cp redis.conf /usr/local/redis/conf/

    cp sentinel.conf /usr/local/redis/conf/

    ln -s /usr/local/redis/bin/* /usr/local/bin/

    image_1d0e3pdre1h1cpe91q2lt7je622a.png-172.8kB


    image_1d0e3r3jlerre6ro3m3661est2n.png-27.4kB


    image_1d0e43n311rso1seof5qdjlt7q9.png-47kB


    image_1d0e45df41cba12c268p1h4i1c0gm.png-25.2kB


    image_1d0e510r16c31t2dl471hd5q4l13.png-22.9kB

     

    4.3 redis.conf配置文件修改

     

    三台服务器都备份和简化配置文件

    cd /usr/local/redis/

    cp conf/redis.conf{,.bak}

    egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf

    image_1d0eafh9i15b71joc1blfq4l943p.png-80.7kB

     

    redis-master配置文件修改

    vim conf/redis.conf

    cat -n conf/redis.conf | sed -n '1p;3p;7p;9p;11p'

     
    1. port 8000
    2. daemonize yes
    3. bind 0.0.0.0
    4. pidfile /var/run/redis-8000.pid
    5. logfile /var/log/redis/redis-8000.log

    image_1d0eegll1142sinlmntmql15ce6l.png-24.3kB

     

    redis-slave配置文件修改

    vim conf/redis.conf

    cat -n conf/redis.conf | sed -n '1p;3p;7p;9p;11p;59p'

     
    1. port 8000
    2. daemonize yes
    3. bind 0.0.0.0
    4. pidfile /var/run/redis-8000.pid
    5. logfile /var/log/redis/redis-8000.log
    6. slaveof 192.168.200.70 8000 #比redis主多这行

    image_1d0eeib8o1dpj1q561l17m9h1srb72.png-28.5kB


    image_1d0eejgl817ja13qlhk91r2c1ajs7f.png-27.7kB

     

    4.4 redis-server的启动

     

    先启动redis-master再启动两个从

    redis-server /usr/local/redis/conf/redis.conf

    image_1d0ec61r242t1aiar2cvs1b9p2d.png-10.6kB

     

    查看redis-slave的日志,同步是否成功

    tail /var/log/redis/redis-8000.log

    image_1d0ecionqo9p16122u9c1pkdr3k.png-64.5kB


    image_1d0ecj3oaoaar2d1u27v5r1vl741.png-65.6kB

     

    在master主机上通过命令查看主从复制情况

    redis-cli -p 8000 info replication

    image_1d0eesdsl1ai31gcm19to1n5v12547s.png-43.4kB

     

    4.5 进行redis同步测试

     

    redis-master上执行

    redis-cli -p 8000 set aaa 111

    image_1d0eclbj6mf0e241nfh16bmse34e.png-10.6kB

     

    redis-slave上执行

    redis-cli -p 8000 get aaa

    redis-cli -p 8000 get aaa

    image_1d0ecljukmhi1h7qnl9npt1d204r.png-11.4kB


    image_1d0ecm34b181613nb1lo8pfsqq68.png-10.7kB

     

    五,redis的高可用部署(redis-sentinel)

     

    (1)三台都修改sentinel.conf配置文件

     

    修改配置文件以下行

    cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'

     
    1. 21 port 26379
    2. 69 sentinel monitor mymaster 127.0.0.1 6379 2
    3. 98 sentinel down-after-milliseconds mymaster 30000
    4. 106 sentinel parallel-syncs mymaster 1
    5. 131 sentinel failover-timeout mymaster 180000

    image_1d0efumig116dvtausl1up4af489.png-27.8kB

     

    修改成如下内容

    vim /usr/local/redis/conf/sentinel.conf

    cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'

     
    1. 21 port 6800
    2. 69 sentinel monitor master8000 192.168.200.70 8000 2
    3. 98 sentinel down-after-milliseconds master8000 5000
    4. 106 sentinel parallel-syncs master8000 1
    5. 131 sentinel failover-timeout master8000 15000

    image_1d0eg2tar12vvp3j22s1mpb1s658m.png-31.8kB

     

    再在sentinel.conf的最后追加以下四句话

    vim /usr/local/redis/conf/sentinel.conf

    tail -4 /usr/local/redis/conf/sentinel.conf

     
    1. daemonize yes #守护进程模式
    2. logfile "/var/log/sentinel.log"
    3. pidfile "/var/run/sentinel.pid"
    4. protected-mode no #关闭保护模式,不关闭是修改不了只读状态

    image_1d0eg4onnjet1t2e1aastpbqs093.png-22.2kB

     

    配置文件说明

     
    1. sentinel monitor master8000 192.168.200.70 8000 2
    2. master8000:监控的主节点名字(随便写)
    3. 192.168.200.70 8000 :主节点的IP和端口
    4. 2:一共有两台Sentinel发现有问题就会发生故障转移
    5. sentinel down-after-milliseconds master8000 5000(5秒)
    6. master8000节点宕机后多久进行检查
    7. sentinel parallel-syncs master8000 1
    8. 设定sentinel并发还是串行,1代表每次只能复制一个,可以减轻master压力
    9. sentinel failover-timeout master8000 1500015秒)
    10. 表示故障转移的超时时间
     

    把master的sentinel配置文件scp到另外两台从上

    scp /usr/local/redis/conf/sentinel.conf 192.168.200.105:/usr/local/redis/conf/

    scp /usr/local/redis/conf/sentinel.conf 192.168.200.106:/usr/local/redis/conf/

    image_1d0eg7tpdl1s1pq516q0t90fjm9g.png-94.1kB

     

    (2)启动redis-sentinel

     

    三台都启动

    redis-sentinel /usr/local/redis/conf/sentinel.conf &

    image_1d0eg9ufg1p8m1ti8234dlqohr9t.png-12.3kB


    image_1d0ega7r8a6bf6g34pk3p1bbkaa.png-13.5kB


    image_1d0egafpb1qia1q3r3ds13ltjbban.png-12.6kB

     

    启动以后,查看sentinel信息

    redis-cli -p 6800 info sentinel

     
    1. # Sentinel
    2. sentinel_masters:1 #1个master
    3. sentinel_tilt:0
    4. sentinel_running_scripts:0
    5. sentinel_scripts_queue_length:0
    6. sentinel_simulate_failure_flags:0
    7. master0:name=master8000,status=ok,address=192.168.200.70:8000,slaves=2,sentinels=3
    8. #2从3sentinel

    image_1d0egbo981thm1q1s1evhbevafkbj.png-26.7kB

     

    (3)进行redis-master的宕机测试

    我们宕掉redis-master的redis-server服务,然后查看sentinel日志

     

    停掉redis-master

    redis-cli -p 8000 shutdown

    image_1d0egdvjp8pqtttan61ehj1vtmc0.png-7.8kB

     

    查看redis-sentinel日志

    cat /var/log/sentinel.log

    redis-cli -p 8000 info replication

    image_1d0eggem9nmlprl132s1mjc1284cq.png-134.4kB


    image_1d0egjq4no0okv1mp4oo61cqcdk.png-44.7kB

     

    查看sentinel信息

    redis-cli -p 6800 info sentinel

     
    1. # Sentinel
    2. sentinel_masters:1
    3. sentinel_tilt:0
    4. sentinel_running_scripts:0
    5. sentinel_scripts_queue_length:0
    6. sentinel_simulate_failure_flags:0
    7. master0:name=master8000,status=ok,address=192.168.200.106:8000,slaves=2,sentinels=3
    8. #已经切换到192.168.200.106为主了

    image_1d0eghblmjvl1d3e1ttg1dh71jd7.png-26.9kB

     

    启动redis-master

    redis-server /usr/local/redis/conf/redis.conf

    image_1d0ego63s10hgc4m225u836fue1.png-10.5kB

     

    然后再停掉192.168.200.106服务器的redis-server

    redis-cli -p 8000 shutdown

    image_1d0egq0g97eo1rbn1oe48fqcs9ee.png-11kB

     

    查看sentinel信息

    redis-cli -p 6800 info sentinel

     
    1. # Sentinel
    2. sentinel_masters:1
    3. sentinel_tilt:0
    4. sentinel_running_scripts:0
    5. sentinel_scripts_queue_length:0
    6. sentinel_simulate_failure_flags:0
    7. master0:name=master8000,status=ok,address=192.168.200.105:8000,slaves=2,sentinels=3
    8. #redis-master恢复为192.168.200.105了

    image_1d0egqoksnv7tdkb182ci572er.png-26.8kB

     

    恢复宕机的服务器

    redis-server /usr/local/redis/conf/redis.conf

    image_1d0eh0fflfilav61kfq18bum2mf8.png-11.6kB

     

    并在主上查看sentinel信息(恢复只需要重新启动服务即可)

    redis-cli -p 8000 info replication

    image_1d0eh1ce31fmgpju1cl2s1s1kncfl.png-48.7kB

     

    六,redis-sentinel的VIP漂移

    假如在redis上,我们也建立一个VIP机制,一旦redis-master宕机,那么本来在master上的VIP就会飘逸到新的master上。

    如此一来开发在连接redis的时候,即便redis-master发生切换,那么开发也不需要修改代码了。

    这里我们可以使用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.conf里增加一句话

    vim /usr/local/redis/conf/sentinel.conf

    sed -n '170,175p' /usr/local/redis/conf/sentinel.conf

    sentinel client-reconfig-script master8000 /usr/local/redis/notify_master6800.sh

     
    1. # CLIENTS RECONFIGURATION SCRIPT
    2. #
    3. # sentinel client-reconfig-script <master-name> <script-path>
    4. sentinel client-reconfig-script master8000 /usr/local/redis/notify_master6800.sh
    5. #增加漂移脚本路径
    6. # When the master changed because of a failover a script can be called in

    image_1d0elh7ggpi51s2d1cd51urf1mnug2.png-30.6kB


    image_1d0elidt060m10ov1lvi6gegbdgf.png-31.5kB


    image_1d0eljrrr1851h8f3i1715eehgs.png-31.1kB

     

    三台都需要写一个漂移脚本

    vim /usr/local/redis/notify_master6800.sh

    cat /usr/local/redis/notify_master6800.sh

     
    1. #!/bin/bash
    2. MASTER_IP=$6 #第六个参数就是sentinel传入进行来的新master的IP
    3. LOCAL_IP="192.168.200.70" #脚本所在服务器的本地IP(每个服务器都不同)
    4. VIP="192.168.200.244"
    5. NETMASK="24"
    6. INTERFACE="ens32"
    7. if [[ "${MASTER_IP}" == "${LOCAL_IP}" ]];then
    8. /usr/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
    9. /usr/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    10. exit 0
    11. else
    12. /usr/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
    13. exit 0
    14. fi
    15. exit 1

    image_1d0elmn0lrcmuve1e6n17n71qk9h9.png-50.9kB


    image_1d0elqndo552odcj0215h91k47hm.png-51.5kB


    image_1d0elrtvk1g05ls7a4eqd12bei3.png-51.4kB

     

    三台都给脚本加x权限

    cd /usr/local/redis/

    chmod +x notify_master6800.sh

    ll -d notify_master6800.sh

    image_1d0elvvt51cl1e621840j8ai72ig.png-22kB


    image_1d0em0p62r9214gk188b18qnr0tit.png-22.4kB


    image_1d0em1gcj1kf41kbd14k1a9lujmja.png-22.7kB

     

    重新启动所有的redis-sentinel进程

    pkill redis-sentinel

    redis-sentinel /usr/local/redis/conf/sentinel.conf

    image_1d0em6jniv4e15ts1f8c1b76omljn.png-13.7kB

     

    第一次时手动给master添加VIP

    ip addr add 192.168.200.244/24 dev ens32

    ip a

    image_1d0emck4712aucv01c0b1d7u1bvvk4.png-62.3kB

     

    让ip地址即刻生效

    arping -q -c 3 -A 192.168.200.244 -I ens32

    image_1d0emehrp1ri373717ufj62cqjl1.png-11.4kB

     

    接下来我们进行ip漂移测试

     

    查看VIP所在服务器

    ip addr show ens32

    image_1d0emgnr0cov1fkk1c0m1of12sdle.png-39.9kB

     

    查看redis-master所属服务器

    redis-cli -p 6800 info sentinel

    redis-cli -p 8000 info replication

    image_1d0emik05oqg1dmegi3gs31pk5lr.png-70.2kB

     

    停止70服务器的redis-server服务

    redis-cli -p 8000 shutdown

    image_1d0emkvhervm14fv1mmcehv1gtim8.png-9.9kB

     

    查看redis-master的所属服务器

    redis-cli -p 6800 info sentinel

     
    1. # Sentinel
    2. sentinel_masters:1
    3. sentinel_tilt:0
    4. sentinel_running_scripts:0
    5. sentinel_scripts_queue_length:0
    6. sentinel_simulate_failure_flags:0
    7. master0:name=master8000,status=ok,address=192.168.200.105:8000,slaves=2,sentinels=3
    8. #mater被切换到了105

    image_1d0emlipc1i0u1dvi1crn81a1heqml.png-27.2kB

     

    在105服务器上查看VIP情况

    ip addr show ens32

     
    1. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    2. link/ether 00:0c:29:03:ee:e5 brd ff:ff:ff:ff:ff:ff
    3. inet 192.168.200.140/24 brd 192.168.200.255 scope global dynamic ens32
    4. valid_lft 1416sec preferred_lft 1416sec
    5. inet 192.168.200.244/24 scope global secondary ens32 #VIP飘逸到了140上
    6. valid_lft forever preferred_lft forever
    7. inet6 fe80::20c:29ff:fe03:eee5/64 scope link
    8. valid_lft forever preferred_lft forever

    image_1d0emqt8r124nl4h8f2sj0rkin2.png-40.8kB

     

    在105服务器主从复制情况

    redis-cli -p 8000 info replication

     
    1. # Replication
    2. role:master #105是主
    3. connected_slaves:1
    4. slave0:ip=192.168.200.106,port=8000,state=online,offset=7897768,lag=0 #106是从
    5. master_replid:3be1d64af444e02aabc486f83a07f0b66c2671d1
    6. master_replid2:9d70bc1f8d6c0fd720b6f35dc9a8a900593d6577
    7. master_repl_offset:7897914
    8. second_repl_offset:7857768
    9. repl_backlog_active:1
    10. repl_backlog_size:1048576
    11. repl_backlog_first_byte_offset:6849339
    12. repl_backlog_histlen:1048576

    image_1d0emskpfgg21to689a215frnf.png-45kB

    至此redis-sentinel的VIP漂移测试成功。redis-sentinel可以持续高可用的哦。

  • 相关阅读:
    读写文本文件 ---字符行式读取
    【编程之美挑战赛第一场】活动中心
    Jetty开发指导:框架
    Java实现BASE64编解码
    关于BT下载的一点事儿
    R语言学习笔记
    完毕port(CompletionPort)具体解释
    微软2014校园招聘笔试试题
    hdu-4857-逃生-拓扑排序
    概率论高速学习03:概率公理补充
  • 原文地址:https://www.cnblogs.com/linyaonie/p/11238229.html
Copyright © 2020-2023  润新知