zoukankan      html  css  js  c++  java
  • 14.5、redis-sentinel高可用


    1、redis主从同步配置:

    (0)主机配置:

    服务器名称

    ip地址

    实例6379

    实例6380

    实例6381

    controller-node1

    172.16.1.90



    (1)确定主从:

    1)将redis 6379实例确定为redis主服务器;

    修改redis 6379的"/data/6379/redis.conf"参数如下:

    requirepass root

    #redis安全保护模式认证密码设置为root;

    2)将redis 6380实例和redis 6381实例确定为redis从服务器;

    修改redis 6380和redis 6381实例的redis.conf文件,修改参数如下:

    vim /data/6380/redis.conf | vim /data/6381/redis.conf

    requirepass root

    #redis安全保护模式认证密码设置为root;

    replicaof 172.16.1.90 6379

    #设置主从同步主库的ip和端口号;

    masterauth root

    #设置主从同步主库的密码;

    (2)启动redis:

    for nu in 79 80 81;do /data/63$nu/redis.sh start;done

    START REDIS [ 确定 ]

    START REDIS [ 确定 ]

    START REDIS [ 确定 ]

    netstat -tunlp | grep -E "6379|6380|6381"

    tcp 0 0 172.16.1.90:6379 0.0.0.0:* LISTEN 1894/redis-server 1

    tcp 0 0 172.16.1.90:6380 0.0.0.0:* LISTEN 1906/redis-server 1

    tcp 0 0 172.16.1.90:6381 0.0.0.0:* LISTEN 1918/redis-server 1

    (3)验证:

    1)主6379实例:

    172.16.1.90:6379> info replication

    # Replication

    role:master

    connected_slaves:2

    slave0:ip=172.16.1.90,port=6381,state=online,offset=364,lag=0

    slave1:ip=172.16.1.90,port=6380,state=online,offset=364,lag=1

    172.16.1.90:6379> set lc1 1

    OK

    172.16.1.90:6379> keys *

    1) "lc1"

    2)从6380实例:

    172.16.1.90:6380> info replication

    # Replication

    role:slave

    master_host:172.16.1.90

    master_port:6379

    master_link_status:up

    172.16.1.90:6380> keys *

    1) "lc1"

    3)从6381实例:

    172.16.1.90:6381> info replication

    # Replication

    role:slave

    master_host:172.16.1.90

    master_port:6379

    master_link_status:up

    172.16.1.90:6381> keys *

    1) "lc1"

    2、redis主从同步手动切换主从:

    (1)关闭主redis 6379实例:

    172.16.1.90:6379> shutdown

    not connected>

    172.16.1.90:6380> info replication

    # Replication

    role:slave

    master_host:172.16.1.90

    master_port:6379

    master_link_status:down

    172.16.1.90:6381> info replication

    # Replication

    role:slave

    master_host:172.16.1.90

    master_port:6379

    master_link_status:down

    (2)将redis 6380实例提升为主:

    172.16.1.90:6380> slaveof no one

    OK

    删除"/data/6380/redis.conf"文件的参数为"replicaof 172.16.1.90 6379";

    (3)修改redis 6381实例指向新的主:

    172.16.1.90:6381> slaveof 172.16.1.90 6380

    OK

    修改"/data/6381/redis.conf"文件的参数为"replicaof 172.16.1.90 6380";

    (4)验证:

    1)redis 6380实例:

    172.16.1.90:6380> info replication

    # Replication

    role:master

    connected_slaves:1

    slave0:ip=172.16.1.90,port=6381,state=online,offset=1102,lag=0

    2)redis 6381实例:

    172.16.1.90:6381> info replication

    # Replication

    role:slave

    master_host:172.16.1.90

    master_port:6380

    master_link_status:up

    (5)修复redis 6379实例:

    修改"/data/6379/redis.conf"文件的参数为"replicaof 172.16.1.90 6380、masterauth root"

    重启redis 6379实例,该实例就加入到了主从复制的集群中了;

    3、redis主从同步自动切换主从:

    将环境恢复到未手动切换主从前一步;

    修改redis 6379实例"/data/6379/redis.conf"文件的参数为"masterauth root",并重启redis 6379实例;

    (1)redis sentinel介绍:

    redis sentinel是redis官方推荐的高可用解决方案,当用redis做master-slave的高可用方案时,加入master宕机了,reids本

    身(包括它的很多客户端)都没有实现主备切换,而redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集

    群,发现master宕机后能进行自动切换,实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障

    的Redis部署。

    (2)功能:

    1)监控:

    Sentinel不断的检查master和slave是否正常的运行;

    2)通知:

    如果发现某个redis节点运行出现问题,可以通过API通知系统管理员和其他的应用程序;

    3)自动故障转移:

    能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave中的一个来作为新

    的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址,sentinel会

    修改相应redis实例的redis.conf文件添加或删除"replicaof <master-IP> <master-port>"配置;

    4)配置提供者:

    哨兵作为Redis客户端发现的权威来源,客户端连接到哨兵请求当前可靠的master的地址,如果发生故

    障,哨兵将报告新地址;

    5)sentinel的分布式特性:

    很显然,只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也

    有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要使用sentinel

    集群,这样有几个好处:即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;如果只有

    一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换

    如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。

    6)sentinel的自动发现机制:

    A、sentinel集群中各个sentinel都互相连接彼此来检查对方的可用性以及互相发送消息;

    B、不需要在sentinel中配置某个master的所有slave的地址,sentinel会通过询问master来得到这些slave的地址的;

    C、每个sentinel发送的消息中也包含了其当前维护的最新的master配置,如果某个sentinel发现自己的配置版本低于接收到的配

    置版本,则会用新的配置更新自己的master配置;

    D、当检测到了新的sentinel,则将其加入到自身维护的master监控列表中;

    7)通常使用sentinel集群(每个redis实例设置一个sentinel)监控reids集群;

    (3)配置:

    1)复制编译包中的sentinel.conf文件到各个redis实例的目录:

    sed -ri.bak "/#|^$/d" /application/redis/sentinel.conf

    for nu in 79 80 81;do cp -a /application/redis/sentinel.conf /data/63$nu/;done

    2)修改各个参数:

    A、实例6379:

    vim /data/6379/sentinel.conf

    bind 172.16.1.90

    port 26379

    daemonize yes

    pidfile "/data/6379/redis-sentinel.pid"

    logfile "/data/6379/redis-sentinel.log"

    dir "/tmp"

    sentinel monitor mymaster 172.16.1.90 6379 2

    sentinel auth-pass mymaster root

    sentinel parallel-syncs mymaster 1

    sentinel down-after-milliseconds mymaster 30000

    sentinel failover-timeout mymaster 180000

    sentinel deny-scripts-reconfig yes

    B、实例6380:

    vim /data/6380/sentinel.conf

    bind 172.16.1.90

    port 26380

    daemonize yes

    pidfile "/data/6380/redis-sentinel.pid"

    logfile "/data/6380/redis-sentinel.log"

    dir "/tmp"

    sentinel monitor mymaster 172.16.1.90 6379 2

    sentinel auth-pass mymaster root

    sentinel parallel-syncs mymaster 1

    sentinel down-after-milliseconds mymaster 30000

    sentinel failover-timeout mymaster 180000

    sentinel deny-scripts-reconfig yes

    C、实例6381:

    vim /data/6381/sentinel.conf

    bind 172.16.1.90

    port 26381

    daemonize yes

    pidfile "/data/6381/redis-sentinel.pid"

    logfile "/data/6381/redis-sentinel.log"

    dir "/tmp"

    sentinel monitor mymaster 172.16.1.90 6379 2

    sentinel auth-pass mymaster root

    sentinel parallel-syncs mymaster 1

    sentinel down-after-milliseconds mymaster 30000

    sentinel failover-timeout mymaster 180000

    sentinel deny-scripts-reconfig yes

    D、参数说明:

    cat /data/6379/sentinel.conf

    bind 172.16.1.90

    #绑定的ip;

    port 26379

    #sentinel监听的端口号;

    daemonize yes

    #sentinel以守护进程的方式运行;

    pidfile /data/6379/redis-sentinel.pid

    #sentinel以守护进程运行生成的pid文件路径;

    logfile /data/6379/redis-sentinel.log

    #sentinel日志文件;

    dir /tmp

    #进程工作的目录;

    sentinel monitor mymaster 172.16.1.90 6379 2

    #######################################################

    #指定监控的master,2表示要2个sentinel认为redis

    #主实例宕机才有效;

    #######################################################

    sentinel auth-pass mymaster root

    #连接redis验证密码,该密码和redis.cof中配置的安全验证密码一致;

    sentinel down-after-milliseconds mymaster 30000

    #超过30000毫秒(30s)后认为redis主实例宕机;

    sentinel parallel-syncs mymaster 1

    ########################################################

    #发生主备切换时有1个slave同时对新的master进行同步,通常

    #将这个值设为1来保证每次只有一个slave 处于不能处理命令请

    #求的状态;

    #########################################################

    sentinel failover-timeout mymaster 180000

    #当主从切换超过180000毫秒(180s)后认为主从切换失败;

    sentinel deny-scripts-reconfig yes

    #########################################################

    #不允许使用SENTINEL SET设置notification-script和

    #client-reconfig-script;

    #########################################################

    (4)配置sentinel脚本文件:

    vim /data/6379/sentinel.sh

    #!/bin/sh

    . /etc/init.d/functions

    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

    IP="172.16.1.90"

    PORT="6379"

    SENTINEL_PORT="26379"

    SENTINEL_HOME="/application/redis/src/redis-sentinel"

    CONFIG="/data/$PORT/sentinel.conf"

    SENTINEL_ADMIN="redis-cli -h $IP -p ${SENTINEL_PORT}"

    SENTINEL_PID="/data/$PORT/redis-sentinel.pid"


    [ $UID -eq 0 ] || {

    echo "please use root"

    exit 1

    }


    function usage (){

    echo "USAGE:sh $0 |start|stop|restart|"

    }


    RETVAL=0

    function check() {

    RETVAL="$?"

    if [ $RETVAL -eq 0 ]; then

    action "$1" /bin/true

    else

    action "$1" /bin/false

    fi

    }


    function start() {

    if [ -f ${SENTINEL_PID} ]; then

    echo "SENTINEL_${SENTINEL_PORT} IS RUNNIG......"

    else

    ${SENTINEL_HOME} $CONFIG

    check "START SENTINEL_${SENTINEL_PORT}"

    fi

    }


    function stop() {

    if [ -f ${SENTINEL_PID} ]; then

    ${SENTINEL_ADMIN} shutdown &>/dev/null

    check "STOP SENTINEL_${SENTINEL_PORT}"

    else

    echo "SENTINEL_${SENTINEL_PORT} IS STOP......"

    fi

    }


    function main(){

    if [ $# -eq 1 ]; then

    case "$1" in

    start)

    start

    sleep 2

    ;;

    stop)

    stop

    sleep 2

    ;;

    restart)

    stop

    start

    ;;

    *)

    usage

    ;;

    esac

    else

    usage

    fi

    }


    main $*

    chmod u+x sentinel.sh

    说明:仿照上面的脚本,完成redis 6380实例、redis 6381实例的sentinel脚本;

    (5)启动各个sentinel实例:

    for nu in 79 80 81;do /data/63$nu/sentinel.sh start;done

    netstat -tunlp | egrep "26379|26380|26381"

    tcp 0 0 172.16.1.90:26379 0.0.0.0:* LISTEN 2475/redis-sentinel

    tcp 0 0 172.16.1.90:26380 0.0.0.0:* LISTEN 2477/redis-sentinel

    tcp 0 0 172.16.1.90:26381 0.0.0.0:* LISTEN 2485/redis-sentinel

    (6)验证:

    1)关闭主redis 6379实例:

    172.16.1.90:6379> shutdown

    not connected>

    2)通过sentinel日志查看主从接替过程:

    tailf /data/6380/redis-sentinel.log

    2673:X 17 May 2019 23:21:03.206 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6379

    2673:X 17 May 2019 23:21:33.363 * +slave slave 172.16.1.90:6381 172.16.1.90 6381 @ mymaster 172.16.1.90 6379

    2673:X 17 May 2019 23:26:45.840 # +sdown master mymaster 172.16.1.90 6379

    2673:X 17 May 2019 23:26:45.907 # +new-epoch 1

    2673:X 17 May 2019 23:26:45.909 # +vote-for-leader 73b994f2ff6ab006c450f8c5662861ab90ee1c04 1

    2673:X 17 May 2019 23:26:45.911 # +odown master mymaster 172.16.1.90 6379 #quorum 2/2

    2673:X 17 May 2019 23:26:45.911 # Next failover delay: I will not start a failover before Fri May 17 23:32:46 2019

    2673:X 17 May 2019 23:26:46.384 # +config-update-from sentinel 73b994f2ff6ab006c450f8c5662861ab90ee1c04 172.16.1.90 26381 @ mymaster 172.16.1.90 6379

    2673:X 17 May 2019 23:26:46.384 # +switch-master mymaster 172.16.1.90 6379 172.16.1.90 6381

    2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6381

    2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381

    2673:X 17 May 2019 23:27:16.424 # +sdown slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381

    3)查看主从信息:

    A、redis 6380实例:

    172.16.1.90:6380> info replication

    # Replication

    role:slave

    master_host:172.16.1.90

    master_port:6381

    master_link_status:up

    B、redis 6381实例:

    172.16.1.90:6381> info replication

    #Replication

    role:master

    connected_slaves:1

    slave0:ip=172.16.1.90,port=6380,state=online,offset=974710,lag=1

    (7)将redis 6379实例启动:

    启动redis 6379实例后,sentinel 3个运行进程中的一个会在"/data/6379/redis.conf"配置文件最后一行

    追加"replicaof 172.16.1.90 6381" 配置,然后重启redis 6379实例,这样redis 6379实例就会被加入到集

    群中作从服务器;

    (8)sentinel命令:

    1)SENTINEL get-master-addr-by-name <master name>:

    返回给定名字的主服务器的 IP 地址和端口号。

    例:

    [root@controller-node1 ~]# redis-cli -h 172.16.1.90 -p 26380

    172.16.1.90:26380> sentinel get-master-addr-by-name mymaster

    1) "172.16.1.90"

    2) "6381"

    2)PING :

    返回 PONG;

    3)SENTINEL masters:

    列出所有被监视的主服务器,以及这些主服务器的当前状态;

    4)SENTINEL master <master name>:

    显示指定master的信息和状态;

    5)SENTINEL slaves <master name>:

    列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;

    6)SENTINEL reset <pattern>:

    重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置

    操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主

    服务器的所有从服务器和 Sentinel;

    7)SENTINEL failover <master name>:

    当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移(不过发起故障转

    移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新);

    3、将redis和sentinel脚本加入开机自启动:

    chmod +x /etc/rc.d/rc.local

    vim /etc/rc.d/rc.local

    /data/6379/redis.sh start &>/dev/null

    /data/6380/redis.sh start &>/dev/null

    /data/6381/redis.sh start &>/dev/null

    /data/6379/sentinel.sh start &>/dev/null

    /data/6380/sentinel.sh start &>/dev/null

    /data/6381/sentinel.sh start &>/dev/null

    加入开机自启动在启动的时候可能由于主节点不能及时启动,可能导致主节点转换,但这都不是问题,

    sentinel能做好任何故障的转移,除了sentinel选举票数(宕机较多)不够;

    4、sentinel模式下主从同步集群扩容:

    以redis 6381实例为主库为例;

    (1)建立新的redis 6382实例:

    mkdir -p /data/6382/

    cp -a /data/6379/sentinel.conf /data/6382/

    cp -a /data/6379/sentinel.sh /data/6382/

    cp -a /data/6379/redis.conf /data/6382/

    cp -a /data/6379/redis.sh /data/6382/

    (2)修改sentinel.sh、redis.conf、redis.sh文件的参数为对应实例的端口号和路径并确保sedis.conf配置文件中

    有以下参数:

    requirepass root

    #redis安全保护模式认证密码设置为root;

    replicaof 172.16.1.90 6381

    #设置主从同步主库的ip和端口号;

    masterauth root

    #设置主从同步主库的密码;

    (3)修改sentinel.conf的配置文件指向新的主:

    bind 172.16.1.90

    port 26382

    daemonize yes

    pidfile "/data/6382/redis-sentinel.pid"

    logfile "/data/6382/redis-sentinel.log"

    dir "/tmp"

    sentinel monitor mymaster 172.16.1.90 6381 2

    sentinel auth-pass mymaster root

    sentinel parallel-syncs mymaster 1

    sentinel down-after-milliseconds mymaster 30000

    sentinel failover-timeout mymaster 180000

    sentinel deny-scripts-reconfig yes

    (4)将新的redis 6382实例加入到开机自启动即可;

    5、小结:

    (1)集群有密码验证的情况下每个redis实例必须要有的参数:

    requirepass root

    #redis安全保护模式认证密码设置为root;

    masterauth root

    #设置主从同步主库的密码;

    哪个redis实例为主,哪个redis实例为从,由sentinel选举,然后在各个实例redis.conf文件中增删

    replicaof <master ip> <master prot>参数来决定;

    (2)从节点的只读是默认的(是对从节点的一种保护,有助于主从的一致性),但是需要在redis 实例的

    redis.conf文件中设置replicaof <master ip> <master prot>参数从节点只读才能生效;

    (3)redis主从同步是实时异步增量同步;







  • 相关阅读:
    阅读任务-阅读笔记-4
    阅读任务-阅读提问-3
    阅读任务-阅读笔记-3
    阅读任务-阅读提问-2
    阅读任务-阅读提问-1
    构建之法:现代软件工程-阅读笔记1
    个人编程作业1-GIT应用
    《构建之法:现代软件工程-阅读笔记》
    课后作业-阅读任务-阅读提问-1
    结对编程项目作业5
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12321317.html
Copyright © 2011-2022 走看看