暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis Sentinel 介绍与部署

DBA小记 2020-10-27
1794

Redis Sentinel 介绍与部署

一、Sentinel介绍

主从复制的问题

Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用:

·一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。

·扩展主节点的读能力,分担主节点读压力。

但是问题来了:

·一旦主节点宕机,从节点晋升成主节点,同时需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。

·主节点的写能力受到单机的限制。

·主节点的存储能力受到单机的限制。

第一个问题,我们接下来讲的Sentinel就可以解决。而后两个问题,Redis也给出了方案Redis Cluster

Redis Sentinel的高可用

Redis Sentinel是一个分布式架构,包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当发现节点不可达时,会对节点做下线标识。

如果被标识的是主节点,他还会选择和其他Sentinel节点进行“协商”,当大多数的Sentinel节点都认为主节点不可达时,他们会选举出一个Sentinel节点来完成自动故障转移工作,同时将这个变化通知给Redis应用方。

整个过程完全自动,不需要人工介入,所以可以很好解决Redis的高可用问题。

接下来就通过部署一个Redis Sentinel实例来了解整体框架。

二、部署

环境介绍

分别有3个Sentinel节点,1个主节点,2个从节点组成一个Redis Sentinel

    集群机器                 redis服务                 哨兵(sentinel)               节点描述
    虚拟机:172.16.86.79    安装redis服务,端口6379     安装sentinel服务,端口26379     主节点
    虚拟机:172.16.86.80    安装redis服务,端口6379     安装sentinel服务,端口26379     从节点
    虚拟机:172.16.86.81    安装redis服务, 端口6379    安装sentinel服务,端口26379     从节点



    主节点(79)安装redis

    1)安装路径

    /app/redis

    2)安装过程

    上传文件redis-3.2.1.tar.gz到/app/tools-conf下

      [root@DFJK-TEST-25 ~]# mkdir -p app/redis/
      [root@DFJK-TEST-25 ~]# cd app/tools-conf/
      [root@DFJK-TEST-25 tools-conf]# tar zxvf redis-3.2.1.tar.gz
      [root@DFJK-TEST-25 tools-conf]# cd redis-3.2.1
      [root@DFJK-TEST-25 redis-3.2.1]# make
      [root@DFJK-TEST-25 redis-3.2.1]# make PREFIX=/app/redis install


      3)更改配置文件

        [root@DFJK-TEST-25 ~]# mkdir -p etc/redis
        [root@DFJK-TEST-25 ~]# cd etc/red
        [root@DFJK-TEST-25 ~]# cd etc/redis/
        [root@DFJK-TEST-25 redis]# vi redis.conf
        [root@DFJK-TEST-25 redis]# cat redis.conf
        ################################ GENERAL #####################################


        daemonize yes
        pidfile "/var/run/redis.pid"
        port 6379
        tcp-backlog 511
        timeout 0
        tcp-keepalive 60
        loglevel notice
        logfile "/app/redis/redis_log"
        databases 16


        ################################ SNAPSHOTTING ################################


        save 600 5000
        stop-writes-on-bgsave-error no
        rdbcompression no
        rdbchecksum yes
        dbfilename "dump.rdb"
        dir "/app/redis/dump"


        ################################# REPLICATION #################################


        # slaveof
        masterauth "dfjk_qwe"
        slave-serve-stale-data yes
        slave-read-only no
        repl-diskless-sync no
        repl-diskless-sync-delay 5
        repl-ping-slave-period 10
        repl-disable-tcp-nodelay no
        # repl-backlog-size 1mb
        # repl-backlog-ttl 3600
        slave-priority 100
        # min-slaves-to-write 3
        # min-slaves-max-lag 10
        # min-slaves-max-lag is set to 10.


        ################################## SECURITY ###################################


        requirepass "dfjk_qwe"


        ################################### LIMITS ####################################


        # maxclients 10000
        maxmemory 5859375kb
        # maxmemory-policy noeviction
        # maxmemory-samples 5


        ############################## APPEND ONLY MODE ###############################


        appendonly no
        appendfilename "appendonly.aof"
        # appendfsync always
        appendfsync everysec
        # appendfsync no
        no-appendfsync-on-rewrite no
        auto-aof-rewrite-percentage 100
        auto-aof-rewrite-min-size 64mb
        aof-load-truncated yes
        ################################ LUA SCRIPTING ###############################


        lua-time-limit 5000


        ################################## SLOW LOG ###################################


        slowlog-log-slower-than 10000
        slowlog-max-len 128


        ################################ LATENCY MONITOR ##############################


        latency-monitor-threshold 0


        ############################# EVENT NOTIFICATION ##############################


        notify-keyspace-events ""


        ############################### ADVANCED CONFIG ###############################


        hash-max-ziplist-entries 512
        hash-max-ziplist-value 64
        list-max-ziplist-entries 512
        list-max-ziplist-value 64
        set-max-intset-entries 512
        zset-max-ziplist-entries 128
        zset-max-ziplist-value 64
        hll-sparse-max-bytes 3000
        activerehashing yes
        client-output-buffer-limit normal 0 0 0
        client-output-buffer-limit slave 256mb 64mb 60
        client-output-buffer-limit pubsub 32mb 8mb 60
        hz 150
        aof-rewrite-incremental-fsync yes
        # Generated by CONFIG REWRITE






        4)编辑系统启动文件

          [root@DFJK-TEST-25 redis]## vi etc/profile
          添加:
          export PATH="$PATH:/app/redis/bin"


          [root@DFJK-TEST-25 redis]# cat etc/init.d/redis
          #!/bin/sh
          #chkconfig: 2345 80 90
          # Simple Redis init.d script conceived to work on Linux systems
          # as it does use of the proc filesystem.
          PASSWD=dfjk_qwe
          REDISPORT=6379
          EXEC=/app/redis/bin/redis-server
          CLIEXEC=/app/redis/bin/redis-cli


          PIDFILE=/var/run/redis.pid
          CONF="/etc/redis/redis.conf"


          case "$1" in
          start)
          if [ -f $PIDFILE ]
          then
          echo "$PIDFILE exists, process is already running or crashed"
          else
          echo "Starting Redis server..."
          $EXEC $CONF &
          fi
          ;;
          stop)
          if [ ! -f $PIDFILE ]
          then
          echo "$PIDFILE does not exist, process is not running"
          else
          PID=$(cat $PIDFILE)
          echo "Stopping ..."
          $CLIEXEC -p $REDISPORT -a $PASSWD shutdown
          while [ -x proc/${PID} ]
          do
          echo "Waiting for Redis to shutdown ..."
          sleep 1
          done
          echo "Redis stopped"
          fi
          ;;
          *)
          echo "Please use start or stop as first argument"
          ;;
          Esac




          5)sentinel配置


            cat /etc/redis/sentinel.conf
            # sentinel.conf
            protected-mode no #关闭保护模式
            daemonize yes
            logfile "/app/redis/sentinel.log"
            port 26379
            #myid是自动生成(配置时不需要填写)
            sentinel myid 6b3609b66b93922a036927591eba3622f39a5f6c
            #自动生成
            sentinel monitor mymaster 172.16.86.79 6379 2
            #2表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,单sentinel节点无效(自己测试发现的)
            sentinel down-after-milliseconds mymaster 5000
            #如果5s内mymaster无响应,则认为mymaster宕机了
            sentinel failover-timeout mymaster 15000
            #如果15秒后,mysater仍没活过来,则启动failover
            sentinel auth-pass mymaster dfjk_qwe
            #redis主节点密码
            dir "/app/redis/tmp"
            #指定工作目录


            # Generated by CONFIG REWRITE
            sentinel config-epoch mymaster 38
            sentinel leader-epoch mymaster 2134
            #以下是自动生成(配置时不需要填写)
            sentinel known-slave mymaster 172.16.86.81 6379
            sentinel known-slave mymaster 172.16.86.80 6379
            sentinel known-sentinel mymaster 172.16.86.80 26379 4a1c268f5be39d175d78b583cbfaaae7cdcc71d5
            sentinel known-sentinel mymaster 172.16.86.81 26379 b2022311b7e37e3fac9d404a3918b08d1bbea140
            sentinel current-epoch 2134


            从节点80安装

            1)安装路径

            /app/redis

            2)安装过程

            上传文件redis-3.2.1.tar.gz到/app/tools-conf下

              [root@DFJK-TEST-26 ~]# mkdir -p app/redis/
              [root@DFJK-TEST-26 ~]# cd app/tools-conf/
              [root@DFJK-TEST-26 tools-conf]# tar zxvf redis-3.2.1.tar.gz
              [root@DFJK-TEST-26 tools-conf]# cd redis-3.2.1
              [root@DFJK-TEST-26 redis-3.2.1]# make
              [root@DFJK-TEST-26 redis-3.2.1]# make PREFIX=/app/redis install


              3)更改配置文件

                [root@DFJK-TEST-26 ~]# mkdir -p etc/redis
                [root@DFJK-TEST-26 ~]# cd etc/redis/
                [root@DFJK-TEST-26 redis]# vi redis.conf
                ################################ GENERAL #####################################


                daemonize yes
                pidfile "/var/run/redis.pid"
                port 6379
                tcp-backlog 511
                timeout 0
                tcp-keepalive 60
                loglevel notice
                logfile "/app/redis/redis_log"
                databases 16


                ################################ SNAPSHOTTING ################################


                save 600 5000
                stop-writes-on-bgsave-error no
                rdbcompression no
                rdbchecksum yes
                dbfilename "dump.rdb"
                dir "/app/redis/dump"


                ################################# REPLICATION #################################


                # slaveof <masterip> <masterport>
                masterauth "dfjk_qwe"
                slave-serve-stale-data yes
                slave-read-only no
                repl-diskless-sync no
                repl-diskless-sync-delay 5
                repl-ping-slave-period 10
                repl-disable-tcp-nodelay no
                # repl-backlog-size 1mb
                # repl-backlog-ttl 3600
                slave-priority 100
                # min-slaves-to-write 3
                # min-slaves-max-lag 10
                # min-slaves-max-lag is set to 10.


                ################################## SECURITY ###################################
                requirepass "dfjk_qwe"
                ################################### LIMITS ####################################
                # maxclients 10000
                maxmemory 5859375kb
                # maxmemory-policy noeviction
                # maxmemory-samples 5
                ############################## APPEND ONLY MODE ###############################
                appendonly no
                appendfilename "appendonly.aof"
                # appendfsync always
                appendfsync everysec
                # appendfsync no
                no-appendfsync-on-rewrite no
                auto-aof-rewrite-percentage 100
                auto-aof-rewrite-min-size 64mb
                aof-load-truncated yes
                ################################ LUA SCRIPTING  ###############################
                lua-time-limit 5000
                ################################## SLOW LOG ###################################
                slowlog-log-slower-than 10000
                slowlog-max-len 128
                ################################ LATENCY MONITOR ##############################
                latency-monitor-threshold 0
                ############################# EVENT NOTIFICATION ##############################
                notify-keyspace-events ""
                ############################### ADVANCED CONFIG ###############################
                hash-max-ziplist-entries 512
                hash-max-ziplist-value 64
                list-max-ziplist-entries 512
                list-max-ziplist-value 64
                set-max-intset-entries 512
                zset-max-ziplist-entries 128
                zset-max-ziplist-value 64
                hll-sparse-max-bytes 3000
                activerehashing yes
                client-output-buffer-limit normal 0 0 0
                client-output-buffer-limit slave 256mb 64mb 60
                client-output-buffer-limit pubsub 32mb 8mb 60
                hz 150
                aof-rewrite-incremental-fsync yes
                # Generated by CONFIG REWRITE
                slaveof 172.16.86.79 6379



                4)编辑系统启动文件


                  [root@DFJK-TEST-26 redis]# vi etc/profile
                  添加:
                  export PATH="$PATH:/app/redis/bin"
                  [root@DFJK-TEST-26 redis]# . etc/profile


                  [root@DFJK-TEST-26 redis]# cat etc/init.d/redis
                  #!/bin/sh
                  #chkconfig: 2345 80 90
                  # Simple Redis init.d script conceived to work on Linux systems
                  # as it does use of the proc filesystem.
                  PASSWD=dfjk_qwe
                  REDISPORT=6379
                  EXEC=/app/redis/bin/redis-server
                  CLIEXEC=/app/redis/bin/redis-cli


                  PIDFILE=/var/run/redis.pid
                  CONF="/etc/redis/redis.conf"


                  case "$1" in
                  start)
                  if [ -f $PIDFILE ]
                  then
                  echo "$PIDFILE exists, process is already running or crashed"
                  else
                  echo "Starting Redis server..."
                  $EXEC $CONF &
                  fi
                  ;;
                  stop)
                  if [ ! -f $PIDFILE ]
                  then
                  echo "$PIDFILE does not exist, process is not running"
                  else
                  PID=$(cat $PIDFILE)
                  echo "Stopping ..."
                  $CLIEXEC -p $REDISPORT -a $PASSWD shutdown
                  while [ -x proc/${PID} ]
                  do
                  echo "Waiting for Redis to shutdown ..."
                  sleep 1
                  done
                  echo "Redis stopped"
                  fi
                  ;;
                  *)
                  echo "Please use start or stop as first argument"
                  ;;
                  Esac









                  5)sentinel配置



                    [root@DFJK-TEST-26 ~]# vi etc/redis/sentinel.conf 
                    # sentinel.conf
                    protected-mode no #关闭保护模式
                    daemonize yes
                    logfile "/app/redis/sentinel.log"
                    port 26379
                    #myid是自动生成(配置时不需要填写)
                    sentinel myid 4a1c268f5be39d175d78b583cbfaaae7cdcc71d5
                    sentinel monitor mymaster 172.16.86.79 6379 2
                    #2表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,单sentinel节点无效(自己测试发现的)


                    sentinel down-after-milliseconds mymaster 5000
                    #如果5s内mymaster无响应,则认为mymaster宕机了


                    #redis主节点密码
                    dir "/app/redis/tmp"
                    #指定工作目录


                    # Generated by CONFIG REWRITE
                    sentinel failover-timeout mymaster 15000
                    #如果15秒后,mysater仍没活过来,则启动failover


                    sentinel auth-pass mymaster dfjk_qwe
                    sentinel config-epoch mymaster 38


                    sentinel leader-epoch mymaster 38
                    #以下是自动生成(配置时不需要填写)


                    sentinel known-slave mymaster 172.16.86.81 6379
                    sentinel known-slave mymaster 172.16.86.80 6379
                    sentinel known-sentinel mymaster 172.16.86.81 26379 b2022311b7e37e3fac9d404a3918b08d1bbea140
                    sentinel known-sentinel mymaster 172.16.86.79 26379 6b3609b66b93922a036927591eba3622f39a5f6c
                    sentinel current-epoch 2134



                    从节点81安装

                    1)安装路径

                    /app/redis

                    2)安装过程

                    上传文件redis-3.2.1.tar.gz到/app/tools-conf下

                      [root@DFJK-TEST-27 ~]# mkdir -p app/redis/
                      [root@DFJK-TEST-27 ~]# cd /app/tools-conf/
                      [root@DFJK-TEST-27 tools-conf]# tar zxvf redis-3.2.1.tar.gz
                      [root@DFJK-TEST-27 tools-conf]# cd redis-3.2.1
                      [root@DFJK-TEST-27 redis-3.2.1]# make
                      [root@DFJK-TEST-27 redis-3.2.1]# make PREFIX=/app/redis install

                      3)更改配置文件


                        [root@DFJK-TEST-27 ~]# mkdir -p etc/redis
                        [root@DFJK-TEST-27 ~]# cd /etc/redis/
                        [root@DFJK-TEST-27 redis]# vi redis.conf
                        ################################ GENERAL  #####################################
                        daemonize yes
                        pidfile "/var/run/redis.pid"
                        port 6379
                        tcp-backlog 511
                        timeout 0
                        tcp-keepalive 60
                        loglevel notice
                        logfile "/app/redis/redis_log"
                        databases 16


                        ################################ SNAPSHOTTING ################################
                        save 600 5000
                        stop-writes-on-bgsave-error no
                        rdbcompression no
                        rdbchecksum yes
                        dbfilename "dump.rdb"
                        dir "/app/redis/dump"
                        ################################# REPLICATION #################################
                        # slaveof
                        masterauth "dfjk_qwe"
                        slave-serve-stale-data yes
                        slave-read-only no
                        repl-diskless-sync no
                        repl-diskless-sync-delay 5
                        repl-ping-slave-period 10
                        repl-disable-tcp-nodelay no
                        # repl-backlog-size 1mb
                        # repl-backlog-ttl 3600
                        slave-priority 100
                        # min-slaves-to-write 3
                        # min-slaves-max-lag 10
                        # min-slaves-max-lag is set to 10.
                        ################################## SECURITY ###################################
                        requirepass "dfjk_qwe"
                        ################################### LIMITS ####################################
                        # maxclients 10000
                        maxmemory 5859375kb
                        # maxmemory-policy noeviction
                        # maxmemory-samples 5
                        ############################## APPEND ONLY MODE ###############################
                        appendonly no
                        appendfilename "appendonly.aof"
                        # appendfsync always
                        appendfsync everysec
                        # appendfsync no
                        no-appendfsync-on-rewrite no
                        auto-aof-rewrite-percentage 100
                        auto-aof-rewrite-min-size 64mb
                        aof-load-truncated yes
                        ################################ LUA SCRIPTING ###############################
                        lua-time-limit 5000
                        ################################## SLOW LOG ###################################
                        slowlog-log-slower-than 10000
                        slowlog-max-len 128
                        ################################ LATENCY MONITOR ##############################
                        latency-monitor-threshold 0
                        ############################# EVENT NOTIFICATION ##############################
                        notify-keyspace-events ""
                        ############################### ADVANCED CONFIG ###############################
                        hash-max-ziplist-entries 512
                        hash-max-ziplist-value 64
                        list-max-ziplist-entries 512
                        list-max-ziplist-value 64
                        set-max-intset-entries 512
                        zset-max-ziplist-entries 128
                        zset-max-ziplist-value 64
                        hll-sparse-max-bytes 3000
                        activerehashing yes
                        client-output-buffer-limit normal 0 0 0
                        client-output-buffer-limit slave 256mb 64mb 60
                        client-output-buffer-limit pubsub 32mb 8mb 60
                        hz 150
                        aof-rewrite-incremental-fsync yes
                        # Generated by CONFIG REWRITE
                        slaveof 172.16.86.79 6379



                        4)编辑系统启动文件

                          [root@DFJK-TEST-27 redis]# vi etc/profile
                          添加:
                          export PATH="$PATH:/app/redis/bin"
                          [root@DFJK-TEST-27 redis]# . etc/profile
                          [root@DFJK-TEST-27 redis]# cat etc/init.d/redis
                          #!/bin/sh
                          #chkconfig: 2345 80 90
                          # Simple Redis init.d script conceived to work on Linux systems
                          # as it does use of the proc filesystem.
                          PASSWD=dfjk_qwe
                          REDISPORT=6379
                          EXEC=/app/redis/bin/redis-server
                          CLIEXEC=/app/redis/bin/redis-cli
                          PIDFILE=/var/run/redis.pid
                          CONF="/etc/redis/redis.conf"
                          case "$1" in
                          start)
                          if [ -f $PIDFILE ]
                          then
                          echo "$PIDFILE exists, process is already running or crashed"
                          else
                          echo "Starting Redis server..."
                          $EXEC $CONF &
                          fi
                          ;;
                          stop)
                          if [ ! -f $PIDFILE ]
                          then
                          echo "$PIDFILE does not exist, process is not running"
                          else
                          PID=$(cat $PIDFILE)
                          echo "Stopping ..."
                          $CLIEXEC -p $REDISPORT -a $PASSWD shutdown
                          while [ -x proc/${PID} ]
                          do
                          echo "Waiting for Redis to shutdown ..."
                          sleep 1
                          done
                          echo "Redis stopped"
                          fi
                          ;;
                          *)
                          echo "Please use start or stop as first argument"
                          ;;
                          esac


                          5)sentinel配置


                            [root@DFJK-TEST-26 ~]# vi etc/redis/sentinel.conf
                            cat /etc/redis/sentinel.conf
                            # sentinel.conf
                            protected-mode no #关闭保护模式
                            daemonize yes
                            logfile "/app/redis/sentinel.log"
                            port 26379
                            sentinel monitor mymaster 172.16.86.79 6379 2
                            #2表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,单sentinel节点无效(自己测试发现的)
                            sentinel down-after-milliseconds mymaster 5000
                            #如果5s内mymaster无响应,则认为mymaster宕机了
                            sentinel failover-timeout mymaster 15000
                            #如果15秒后,mysater仍没活过来,则启动failover
                            sentinel auth-pass mymaster dfjk_qwe
                            #redis主节点密码
                            dir "/app/redis/tmp"
                            #指定工作目录


                            # Generated by CONFIG REWRITE
                            sentinel config-epoch mymaster 38
                            sentinel leader-epoch mymaster 38
                            sentinel known-slave mymaster 172.16.86.80 6379
                            sentinel known-slave mymaster 172.16.86.81 6379
                            sentinel known-sentinel mymaster 172.16.86.80 26379 4a1c268f5be39d175d78b583cbfaaae7cdcc71d5
                            sentinel known-sentinel mymaster 172.16.86.79 26379 6b3609b66b93922a036927591eba3622f39a5f6c
                            sentinel current-epoch 2134



                            启动并检测

                            1)redis(79)启动

                              [root@DFJK-TEST-25 ~]# chmod +x etc/init.d/redis
                              [root@DFJK-TEST-25 ~]# mkdir -p app/redis/dump
                              [root@DFJK-TEST-25 redis]# mkdir -p app/redis/tmp
                              [root@DFJK-TEST-25 redis]# service redis start
                              Starting Redis server...
                              [root@DFJK-TEST-25 redis]# ps -ef |grep -v grep |grep redis
                              root 27816 1 0 09:53 ? 00:00:00 app/redis/bin/redis-server *:6379

                              2)redis(79)启动sentinel

                                [root@DFJK-TEST-25 redis]# redis-sentinel etc/redis/sentinel.conf
                                [root@DFJK-TEST-25 redis]# ps -ef |grep -v grep |grep sentinel
                                root 27823 1 0 09:53 ? 00:00:00 redis-sentinel *:26379 [sentinel]

                                3)redis(80)启动

                                  [root@DFJK-TEST-26 ~]# chmod +x etc/init.d/redis
                                  [root@DFJK-TEST-26 ~]# mkdir -p app/redis/dump
                                  [root@DFJK-TEST-26 redis]# mkdir -p app/redis/tmp
                                  [root@DFJK-TEST-26 redis]# service redis start
                                  Starting Redis server...
                                  [root@DFJK-TEST-26 redis]# ps -ef |grep -v grep |grep redis
                                  root 20247 1 0 09:54 ? 00:00:00 app/redis/bin/redis-server *:6379

                                  4)redis(80)启动sentinel


                                    [root@DFJK-TEST-26 redis]# redis-sentinel etc/redis/sentinel.conf
                                    [root@DFJK-TEST-26 redis]# ps -ef |grep -v grep |grep sentinel
                                    root     20261     1  0 09:55 ?        00:00:00 redis-sentinel *:26379 [sentinel]


                                    5)redis(81)启动

                                      [root@DFJK-TEST-27 ~]# chmod +x etc/init.d/redis
                                      [root@DFJK-TEST-27 ~]# mkdir -p app/redis/dump
                                      [root@DFJK-TEST-27 redis]# mkdir -p app/redis/tmp
                                      [root@DFJK-TEST-27 redis]# service redis start
                                      Starting Redis server...
                                      [root@DFJK-TEST-27 ~]# ps -ef |grep -v grep |grep redis
                                      root 10869 1 0 09:55 ? 00:00:00 /app/redis/bin/redis-server *:6379

                                      6)redis(81)启动sentinel


                                        [root@DFJK-TEST-27 ~]# redis-sentinel /etc/redis/sentinel.conf
                                        [root@DFJK-TEST-27 ~]# ps -ef |grep -v grep |grep sentinel
                                        root 10882 1 0 09:56 ? 00:00:00 redis-sentinel *:26379 [sentinel]


                                        7)ping命令查看是否启动

                                          [root@DFJK-TEST-25 ~]# redis-cli  -h 172.16.86.80 -p 6379 -a "dfjk_qwe" ping
                                          PONG
                                          [root@DFJK-TEST-25 ~]redis-cli  -h 172.16.86.81 -p 6379 -a "dfjk_qweping
                                          PONG
                                          [root@DFJK-TEST-25 ~]redis-cli  -h 172.16.86.79 -p 6379 -a "dfjk_qweping
                                          PONG

                                          确定主从关系

                                          部署三个Sentinel节点之后,真个拓扑结构如图所示:

                                          验证复制

                                          1)主节点视角

                                            [root@DFJK-TEST-25 ~]# redis-cli  -h 172.16.86.79 -p 6379 -a "dfjk_qwe" INFO replication
                                            # Replication
                                            role:master
                                            connected_slaves:2
                                            slave0:ip=172.16.86.80,port=6379,state=online,offset=57709,lag=1
                                            slave1:ip=172.16.86.81,port=6379,state=online,offset=57995,lag=0
                                            master_repl_offset:58138
                                            repl_backlog_active:1
                                            repl_backlog_size:1048576
                                            repl_backlog_first_byte_offset:2
                                            repl_backlog_histlen:58137



                                            2)
                                            从节点1视角

                                              [root@DFJK-TEST-26 ~]# redis-cli  -h 172.16.86.80 -p 6379 -a "dfjk_qwe" INFO replication
                                              # Replication
                                              role:slave
                                              master_host:172.16.86.79
                                              master_port:6379
                                              master_link_status:up
                                              master_last_io_seconds_ago:2
                                              master_sync_in_progress:0
                                              slave_repl_offset:62027
                                              slave_priority:100
                                              slave_read_only:0
                                              connected_slaves:0
                                              master_repl_offset:0
                                              repl_backlog_active:0
                                              repl_backlog_size:1048576
                                              repl_backlog_first_byte_offset:0
                                              repl_backlog_histlen:0



                                              3)
                                              从节点2视角

                                                [root@DFJK-TEST-27 ~]# redis-cli  -h 172.16.86.81 -p 6379 -a "dfjk_qwe" INFO replication
                                                Replication
                                                role:slave
                                                master_host:172.16.86.79
                                                master_port:6379
                                                master_link_status:up
                                                master_last_io_seconds_ago:1
                                                master_sync_in_progress:0
                                                slave_repl_offset:68075
                                                slave_priority:100
                                                slave_read_only:0
                                                connected_slaves:0
                                                master_repl_offset:0
                                                repl_backlog_active:0
                                                repl_backlog_size:1048576
                                                repl_backlog_first_byte_offset:0
                                                repl_backlog_histlen:0


                                                主写入:

                                                [root@DFJK-TEST-25 ~]# redis-cli  -h 172.16.86.79 -p 6379 -a "dfjk_qwe"

                                                172.16.86.79:6379> set name xiaoming

                                                OK

                                                172.16.86.79:6379> get name

                                                "xiaoming"


                                                从查看:

                                                [root@DFJK-TEST-26 ~]# redis-cli  -h 172.16.86.80 -p 6379 -a "dfjk_qwe"

                                                172.16.86.80:6379> get name

                                                "xiaoming"

                                                [root@DFJK-TEST-27 ~]# redis-cli  -h 172.16.86.81 -p 6379 -a "dfjk_qwe"

                                                172.16.86.81:6379> get name

                                                "xiaoming"

                                                故障验证

                                                故障转移实验


                                                主停止redis:

                                                [root@DFJK-TEST-25 ~]# service redis stop

                                                主sentinel日志:

                                                  27823:X 24 May 10:07:17.912 # +sdown master mymaster 172.16.86.79 6379
                                                  27823:X 24 May 10:07:17.912 # +odown master mymaster 172.16.86.79 6379 #quorum 1/1
                                                  27823:X 24 May 10:07:17.912 # +new-epoch 2135
                                                  27823:X 24 May 10:07:17.912 # +try-failover master mymaster 172.16.86.79 6379
                                                  27823:X 24 May 10:07:17.913 # +vote-for-leader 6b3609b66b93922a036927591eba3622f39a5f6c 2135
                                                  27823:X 24 May 10:07:28.713 # -failover-abort-not-elected master mymaster 172.16.86.79 6379
                                                  27823:X 24 May 10:07:28.771 # Next failover delay: I will not start a failover before Thu May 24 10:07:48 2018
                                                  27823:X 24 May 10:07:48.750 # +new-epoch 2136
                                                  27823:X 24 May 10:07:48.750 # +try-failover master mymaster 172.16.86.79 6379
                                                  27823:X 24 May 10:07:48.751 # +vote-for-leader 6b3609b66b93922a036927591eba3622f39a5f6c 2136
                                                  27823:X 24 May 10:07:59.020 # -failover-abort-not-elected master mymaster 172.16.86.79 6379
                                                  27823:X 24 May 10:07:59.075 # Next failover delay: I will not start a failover before Thu May 24 10:08:18 2018
                                                  27823:X 24 May 10:08:18.996 # +new-epoch 2137
                                                  27823:X 24 May 10:08:18.996 # +try-failover master mymaster 172.16.86.79 6379
                                                  27823:X 24 May 10:08:18.998 # +vote-for-leader 6b3609b66b93922a036927591eba3622f39a5f6c 2137
                                                  27823:X 24 May 10:08:29.936 # -failover-abort-not-elected master mymaster 172.16.86.79 6379
                                                  27823:X 24 May 10:08:29.994 # Next failover delay: I will not start a failover before Thu May 24 10:08:49 2018






                                                  从1的sentinel日志:

                                                    20261:X 24 May 10:07:17.938 # +sdown master mymaster 172.16.86.79 6379
                                                    20261:X 24 May 10:07:19.079 # +new-epoch 2135
                                                    20261:X 24 May 10:07:50.122 # +new-epoch 2136
                                                    20261:X 24 May 10:08:19.166 # +new-epoch 2137
                                                    20261:X 24 May 10:08:50.772 # +new-epoch 2138

                                                    从2的sentinel日志:

                                                      10882:X 24 May 10:07:17.990 # +sdown master mymaster 172.16.86.79 6379
                                                      10882:X 24 May 10:07:19.078 # +new-epoch 2135
                                                      10882:X 24 May 10:07:50.121 # +new-epoch 2136
                                                      10882:X 24 May 10:08:19.165 # +new-epoch 2137
                                                      10882:X 24 May 10:08:50.777 # +new-epoch 2138




                                                      此时,Redis Sentinel
                                                      对主节点进行客观下线(Objectively Down, 简称 ODOWN)的判断,确认主节点不可达,则通知从节点中止复制主节点的操作。


                                                      当主节点下线时长超过配置的下线时长5
                                                      000
                                                      毫秒
                                                      Redis Sentinel
                                                      执行故障转移操作。

                                                      查看一下Sentinel节点监控的主节点信息:

                                                        [root@DFJK-TEST-25 ~]# redis-cli  -h 172.16.86.79 -p 26379
                                                        172.16.86.79:26379> sentinel masters
                                                        1) 1) "name"
                                                        2) "mymaster"
                                                        3) "ip"
                                                        4) "172.16.86.80"
                                                        5) "port"
                                                        6) "6379"
                                                        7) "runid"
                                                        8) "1ece1ee74e6a172c4522a34a2de0df8c94f24fed"
                                                        9) "flags"
                                                        10) "master"
                                                        11) "link-pending-commands"
                                                        12) "0"
                                                        13) "link-refcount"
                                                        14) "1"
                                                        15) "last-ping-sent"
                                                        16) "0"
                                                        17) "last-ok-ping-reply"
                                                        18) "231"
                                                        19) "last-ping-reply"
                                                        20) "231"
                                                        21) "down-after-milliseconds"
                                                        22) "5000"
                                                        23) "info-refresh"
                                                        24) "5219"
                                                        25) "role-reported"
                                                        26) "master"
                                                        27) "role-reported-time"
                                                        28) "35728"
                                                        29) "config-epoch"
                                                        30) "2158"
                                                        31) "num-slaves"
                                                        32) "2"
                                                        33) "num-other-sentinels"
                                                        34) "2"
                                                        35) "quorum"
                                                        36) "1"
                                                        37) "failover-timeout"
                                                        38) "15000"
                                                        39) "parallel-syncs"
                                                        40) "1"



                                                        看一下Sentinel节点监控的从节点信息:

                                                          172.16.86.79:26379> sentinel slaves mymaster
                                                          1) 1) "name"
                                                          2) "172.16.86.79:6379"
                                                          3) "ip"
                                                          4) "172.16.86.79"
                                                          5) "port"
                                                          6) "6379"
                                                          7) "runid"
                                                          8) ""
                                                          9) "flags"
                                                          10) "s_down,slave,disconnected" //端口79:6379的原主节点已经断开了连接
                                                          11) "link-pending-commands"
                                                          12) "2"
                                                          13) "link-refcount"
                                                          14) "1"
                                                          15) "last-ping-sent"
                                                          16) "227506"
                                                          17) "last-ok-ping-reply"
                                                          18) "227506"
                                                          19) "last-ping-reply"
                                                          20) "227506"
                                                          21) "s-down-time"
                                                          22) "222473"
                                                          23) "down-after-milliseconds"
                                                          24) "5000"
                                                          25) "info-refresh"
                                                          26) "1527129371700"
                                                          27) "role-reported"
                                                          28) "slave"
                                                          29) "role-reported-time"
                                                          30) "227506"
                                                          31) "master-link-down-time"
                                                          32) "0"
                                                          33) "master-link-status"
                                                          34) "err"
                                                          35) "master-host"
                                                          36) "?"
                                                          37) "master-port"
                                                          38) "0"
                                                          39) "slave-priority"
                                                          40) "100"
                                                          41) "slave-repl-offset"
                                                          42) "0"
                                                          2) 1) "name"
                                                          2) "172.16.86.81:6379"
                                                          3) "ip"
                                                          4) "172.16.86.81"
                                                          5) "port"
                                                          6) "6379"
                                                          7) "runid"
                                                          8) "b8dd9e7be4c1ea13e15f19f50b4a81647568b571"
                                                          9) "flags"
                                                          10) "slave"
                                                          11) "link-pending-commands"
                                                          12) "0"
                                                          13) "link-refcount"
                                                          14) "1"
                                                          15) "last-ping-sent"
                                                          16) "0"
                                                          17) "last-ok-ping-reply"
                                                          18) "338"
                                                          19) "last-ping-reply"
                                                          20) "338"
                                                          21) "down-after-milliseconds"
                                                          22) "5000"
                                                          23) "info-refresh"
                                                          24) "6713"
                                                          25) "role-reported"
                                                          26) "slave"
                                                          27) "role-reported-time"
                                                          28) "227506"
                                                          29) "master-link-down-time"
                                                          30) "0"
                                                          31) "master-link-status"
                                                          32) "ok"
                                                          33) "master-host"
                                                          34) "172.16.86.80"
                                                          35) "master-port"
                                                          36) "6379"
                                                          37) "slave-priority"
                                                          38) "100"
                                                          39) "slave-repl-offset"
                                                          40) "46732"



                                                          由以上信息可得,端口为
                                                          80
                                                          的Redis数据节点成为新的主节点,端口为79
                                                          的旧主节点断开连接。如图所示:


                                                          重启79
                                                          的数据节点


                                                            [root@DFJK-TEST-25 ~]# service redis start
                                                            Starting Redis server...

                                                            查看下变化:

                                                              172.16.86.79:26379> sentinel slaves mymaster
                                                              1) 1) "name"
                                                              2) "172.16.86.79:6379" //79的节点重启后,变成了"活"的从节点
                                                              3) "ip"
                                                              4) "172.16.86.79"
                                                              5) "port"
                                                              6) "6379"
                                                              7) "runid"
                                                              8) "30876d99252c019af65ba40de62c42c5bc39d0dd"
                                                              9) "flags"
                                                              10) "slave"
                                                              11) "link-pending-commands"
                                                              12) "0"
                                                              13) "link-refcount"
                                                              14) "1"
                                                              15) "last-ping-sent"
                                                              16) "0"
                                                              17) "last-ok-ping-reply"
                                                              18) "605"
                                                              19) "last-ping-reply"
                                                              20) "605"
                                                              21) "down-after-milliseconds"
                                                              22) "5000"
                                                              23) "info-refresh"
                                                              24) "7726"
                                                              25) "role-reported"
                                                              26) "slave"
                                                              27) "role-reported-time"
                                                              28) "37834"
                                                              29) "master-link-down-time"
                                                              30) "0"
                                                              31) "master-link-status"
                                                              32) "ok"
                                                              33) "master-host"
                                                              34) "172.16.86.80"
                                                              35) "master-port"
                                                              36) "6379"
                                                              37) "slave-priority"
                                                              38) "100"
                                                              39) "slave-repl-offset"
                                                              40) "112149"
                                                              2) 1) "name"
                                                              2) "172.16.86.81:6379" //81的节点无变化,还是从节点
                                                              3) "ip"
                                                              4) "172.16.86.81"
                                                              5) "port"
                                                              6) "6379"
                                                              7) "runid"
                                                              8) "b8dd9e7be4c1ea13e15f19f50b4a81647568b571"
                                                              9) "flags"
                                                              10) "slave"
                                                              11) "link-pending-commands"
                                                              12) "0"
                                                              13) "link-refcount"
                                                              14) "1"
                                                              15) "last-ping-sent"
                                                              16) "0"
                                                              17) "last-ok-ping-reply"
                                                              18) "606"
                                                              19) "last-ping-reply"
                                                              20) "606"
                                                              21) "down-after-milliseconds"
                                                              22) "5000"
                                                              23) "info-refresh"
                                                              24) "3912"
                                                              25) "role-reported"
                                                              26) "slave"
                                                              27) "role-reported-time"
                                                              28) "536124"
                                                              29) "master-link-down-time"
                                                              30) "0"
                                                              31) "master-link-status"
                                                              32) "ok"
                                                              33) "master-host"
                                                              34) "172.16.86.80"
                                                              35) "master-port"
                                                              36) "6379"
                                                              37) "slave-priority"
                                                              38) "100"
                                                              39) "slave-repl-offset"
                                                              40) "113033"


                                                              79被降为80的从节点:


                                                                [root@DFJK-TEST-25 ~]# redis-cli  -h 172.16.86.79 -p 6379 -a "dfjk_qwe"  INFO replication
                                                                # Replication
                                                                role:slave
                                                                master_host:172.16.86.80
                                                                master_port:6379
                                                                master_link_status:up
                                                                master_last_io_seconds_ago:2
                                                                master_sync_in_progress:0
                                                                slave_repl_offset:133604
                                                                slave_priority:100
                                                                slave_read_only:0
                                                                connected_slaves:0
                                                                master_repl_offset:0
                                                                repl_backlog_active:0
                                                                repl_backlog_size:1048576
                                                                repl_backlog_first_byte_offset:0
                                                                repl_backlog_histlen:0


                                                                [root@DFJK-TEST-25 ~]# redis-cli -h 172.16.86.80 -p 6379 -a "dfjk_qwe" INFO replication
                                                                # Replication
                                                                role:master
                                                                connected_slaves:2
                                                                slave0:ip=172.16.86.81,port=6379,state=online,offset=151565,lag=0
                                                                slave1:ip=172.16.86.79,port=6379,state=online,offset=151710,lag=0
                                                                master_repl_offset:152000
                                                                repl_backlog_active:1
                                                                repl_backlog_size:1048576
                                                                repl_backlog_first_byte_offset:2
                                                                repl_backlog_histlen:151999


                                                                [root@DFJK-TEST-25 ~]# redis-cli -h 172.16.86.81 -p 6379 -a "dfjk_qwe" INFO replication
                                                                # Replication
                                                                role:slave
                                                                master_host:172.16.86.80
                                                                master_port:6379
                                                                master_link_status:up
                                                                master_last_io_seconds_ago:1
                                                                master_sync_in_progress:0
                                                                slave_repl_offset:152870
                                                                slave_priority:100
                                                                slave_read_only:0
                                                                connected_slaves:0
                                                                master_repl_offset:0
                                                                repl_backlog_active:0
                                                                repl_backlog_size:1048576
                                                                repl_backlog_first_byte_offset:0
                                                                repl_backlog_histlen:0

                                                                从上面的逻辑架构和故障转移试验中,可以看出Redis Sentinel的以下几个功能。

                                                                ·监控Sentinel节点会定期检测Redis数据节点和其余Sentinel节点是否可达。

                                                                ·通知Sentinel节点会将故障转移通知给应用方。

                                                                ·主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。

                                                                ·配置提供者:在Redis Sentinel结构中,客户端在初始化的时候连接的是Sentinel节点集合,从中获取主节点信息。

                                                                Sentinel配置说明

                                                                ·sentinel monitor mymaster 127.0.0.1 6379 2

                                                                ·当前Sentinel节点监控 127.0.0.1:6379 这个主节点

                                                                ·2代表判断主节点失败至少需要2个Sentinel节点节点同意

                                                                ·mymaster是主节点的别名

                                                                ·sentinel down-after-milliseconds mymaster 30000

                                                                ·每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达

                                                                ·sentinel parallel-syncs mymaster 1

                                                                ·当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1。

                                                                ·sentinel failover-timeout mymaster 180000

                                                                ·故障转移超时时间为180000

                                                                ·sentinel auth-pass \ \ 

                                                                ·如果Sentinel
                                                                监控的主节点配置了密码,可以通过sentinel auth-pass
                                                                配置通过添加主节点的密码,防止Sentinel
                                                                节点无法对主节点进行监控。

                                                                ·例如:sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

                                                                ·sentinel notification-script \ \ 

                                                                ·在故障转移期间,当一些警告级别的Sentinel
                                                                事件发生(指重要事件,如主观下线,客观下线等)时,会触发对应路径的脚本,想脚本发送相应的事件参数。

                                                                ·例如:sentinel notification-script mymaster /var/redis/notify.sh

                                                                ·sentinel client-reconfig-script \ \ 

                                                                ·在故障转移结束后,触发应对路径的脚本,并向脚本发送故障转移结果的参数。

                                                                ·例如:sentinel client-reconfig-script mymaster /var/redis/reconfig.sh


                                                                文章转载自DBA小记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                评论