Redis哨兵集団


哨兵集団の紹介
Redisの哨兵(sentinel)は、複数のRedisサーバを管理するのによく使われています.主に以下の3つのタスクを実行します.監視(Monitoring):哨兵(sentinel)は、MasterとSlaveが正常に動作しているかどうかを絶えずチェックします.注意(Notification):監視されているRedisに問題が発生した場合、哨兵(sentinel)はAPIを通じて管理者または他のアプリケーションに通知を送信することができます.
自動フェイルオーバ(Automatic failover):1つのMasterが正常に動作しない場合、歩哨(sentinel)は自動フェイルオーバ操作を開始し、Master障害後の1つのSlaveを新しいMasterにアップグレードし、Master障害後のSlaveを新しいMasterにコピーするように変更します.クライアントが障害のMasterに接続しようとすると、クラスタはまた、障害のMasterの代わりに新しいMasterを使用することができるように、新しいMasterのアドレスをクライアントに返す.
哨兵(sentinel)は分散システムであり、1つのアーキテクチャで複数の哨兵(sentinel)プロセスを実行することができ、これらのプロセスはデマプロトコル(gossipprotocols)を使用してMasterがオフラインであるかどうかに関する情報を受信し、投票プロトコル(agreement protocols)を使用して自動フェイルオーバを実行するかどうか、新しいMasterとしてどのSlaveを選択するかを決定する.各哨兵(sentinel)は、他の哨兵(sentinel)、master、slaveにタイミングよくメッセージを送信し、相手が「生きている」かどうかを確認し、指定された時間(構成可能)内に応答していないことを発見した場合、一時的に相手が停止していると判断する(いわゆる「主観的にダウンタイム」Subjective Down、略称sdown).「哨兵群」の多くのsentinelが、あるMasterが応答していないことを報告すると、システムはそのMasterが「徹底的に死亡した」(すなわち、客観的な真のdown機、Objective Down、odownと略称する)と判断し、一定のvoteアルゴリズムを通じて、残りのslaveノードから1台を選択してmasterに昇格し、自動的に関連配置を修正する.歩哨(sentinel)は単独の実行可能ファイルredis-sentinelとして解放されたが、実際には特殊なモードで実行されるRedisサーバにすぎず、通常のRedisサーバを起動するときに--sentinelオプションを指定することで歩哨(sentinel)を起動することができる.
サーバ計画
Redisインストール
公式インストールパッケージをダウンロード:https://redis.io/download
1.Redisサポートパッケージのインストール
   Redis    C     ,        gcc
[root@rocketmq-nameserver1 ~]# yum install -y gcc automake autoconf libtool make
2、      Redis    ,     ,    ,   3       。
[root@rocketmq-nameserver1 redis-5.0.4]# make install
       2    ,    。。。。。。
  :               ,               make MALLOC=libc install    。
3、   Redis       /usr/bin   
[root@rocketmq-nameserver1 redis-5.0.4]# cd src/
[root@rocketmq-nameserver1 src]# cp redis-cli redis-sentinel redis-server /usr/bin

redis構成
Redisプロファイルredisをフィルタする.conf
[root@rocketmq-nameserver1 redis-5.0.4]# grep -Ev "^#|^$" redis.conf

bind 192.168.2.177protected-mode yesport 6379tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile/wdata/redis/data/redis.pidloglevel noticelogfile "/wdata/redis/logs/redis.log"databases 16always-show-logo yessave 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir/wdata/redisreplicaof 192.168.2.177 6379replica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noreplica-priority 100lazyfree-lazy-eviction nolazyfree-lazy-expire nolazyfree-lazy-server-del noreplica-lazy-flush noappendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yesaof-use-rdb-preamble yeslua-time-limit 5000
slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000stream-node-max-bytes 4096stream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit replica 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesaof-rewrite-incremental-fsync yesrdb-save-incremental-fsync yes
Redisプロファイルの変更は、上の赤い部分を変更するだけで、他のオプションは自分の必要に応じて変更できます.次の2つは
daemonize yes:Redis起動時にバックグラウンドで実行する設定
Replicaof 192.168.2.1177 6379:クラスタMasterサーバのアドレスとポートを設定します.注意:192.168.2.1177プライマリRedisサーバでこのコメントを表示します.
変更したプロファイルを他の2台のサーバにコピー
for i in 178 180; do scp redis.conf [email protected].$i:/wdata/redis/config; done

歩哨配置
sentinelプロファイルsentinelをフィルタします.conf
[root@rocketmq-nameserver1 redis-5.0.4]# grep -Ev "^#|^$" sentinel.conf

bind 192.168.2.177
port 26379daemonize yespidfile/wdata/redis-sentinel.pidlogfile "/wdata/redis/logs/sentinel.log"dir/wdata/redissentinel monitor mymaster 192.168.2.177 6379 2sentinel down-after-milliseconds mymaster 30000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000sentinel deny-scripts-reconfig yes
一般的に、私たちは上の赤い部分を修正するだけで、他のオプションは実際の必要に応じて修正します.その中で、下の意向の意味は
sentinel monitor mymaster 192.168.2.1177 6379 2:哨兵監視を設置するメインサーバは192.168.2.1177、ポートは6379、2は同時に2人の哨兵がこのメインサーバにアクセスできないと判断した場合、フェイルオーバを行うことを示す.
変更したsentinelプロファイルを他の2台のサーバに配布します.
for i in 178 180; do scp sentinel.conf [email protected].$i:/wdata/redis/config; done

Redisの起動
3台のサーバで別々に実行
[root@rocketmq-nameserver1 ~]# service redis start

Redisが正常に起動したかどうかを確認
[root@rocketmq-nameserver1 ~]# ps -ef | grep redis

または
[root@rocketmq-nameserver1 ~]# service redis status

歩哨を起動する.
3台のサーバで別々に実行
[root@rocketmq-nameserver1 ~]# service sentinel start

哨兵の起動が成功したかどうかを確認する
[root@rocketmq-nameserver1 ~]# ps -ef | grep sentinel

または
[root@rocketmq-nameserver1 ~]# service sentinel status

哨兵集団の状態の表示
私たちのRedisサービスと哨兵(sentinel)サービスは正常に起動しました.次に、クラスタが正常かどうかを検証する必要があります.
[root@rocketmq-nameserver1 ~]# redis-cli -h 192.168.2.177 -p 26379
192.168.2.177:26379> SENTINEL sentinels mymaster
1)  1) "name"
    2) "648ced6a4a5126ffe053c7190a7787ce8507122d"
    3) "ip"
    4) "192.168.2.178"
    5) "port"
    6) "26379"
    7) "runid"
    8) "648ced6a4a5126ffe053c7190a7787ce8507122d"
    9) "flags"
   10) "sentinel"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "203"
   19) "last-ping-reply"
   20) "203"
   21) "down-after-milliseconds"
   22) "30000"
   23) "last-hello-message"
   24) "425"
   25) "voted-leader"
   26) "?"
   27) "voted-leader-epoch"
   28) "0"
2)  1) "name"
    2) "25133c581dc5a5dcc41ed40d720bf417b70d6449"
    3) "ip"
    4) "192.168.2.180"
    5) "port"
    6) "26379"
    7) "runid"
    8) "25133c581dc5a5dcc41ed40d720bf417b70d6449"
    9) "flags"
   10) "sentinel"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "203"
   19) "last-ping-reply"
   20) "203"
   21) "down-after-milliseconds"
   22) "30000"
   23) "last-hello-message"
   24) "870"
   25) "voted-leader"
   26) "?"
   27) "voted-leader-epoch"
   28) "0"

出力から分かるように、他の2人の哨兵は正常に運行している.
192.168.2.177:26379> SENTINEL masters
1)     1) "name"
     2) "mymaster"
     3) "ip"
     4) "192.168.2.177"
     5) "port"
     6) "6379"
     7) "runid"
     8) "f2c92c055ec129186fec93d0b394a99ad120fd1d"
     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) "800"
    19) "last-ping-reply"
    20) "800"
    21) "down-after-milliseconds"
    22) "30000"
    23) "info-refresh"
    24) "10034"
    25) "role-reported"
    26) "master"
    27) "role-reported-time"
    28) "120535"
    29) "config-epoch"
    30) "0"
    31) "num-slaves"
    32) "2"
    33) "num-other-sentinels"
    34) "2"
    35) "quorum"
    36) "2"
    37) "failover-timeout"
    38) "180000"
    39) "parallel-syncs"
    40) "1"

上出力で表示され、主Redisは正常です.
192.168.2.177:26379> SENTINEL slaves mymaster
1)     1) "name"
     2) "192.168.2.180:6379"
     3) "ip"
     4) "192.168.2.180"
     5) "port"
     6) "6379"
     7) "runid"
     8) "2675617f208ace5c13161e133819be75f7079946"
     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) "448"
    19) "last-ping-reply"
    20) "448"
    21) "down-after-milliseconds"
    22) "30000"
    23) "info-refresh"
    24) "4606"
    25) "role-reported"
    26) "slave"
    27) "role-reported-time"
    28) "235584"
    29) "master-link-down-time"
    30) "0"
    31) "master-link-status"
    32) "ok"
    33) "master-host"
    34) "192.168.2.177"
    35) "master-port"
    36) "6379"
    37) "slave-priority"
    38) "100"
    39) "slave-repl-offset"
    40) "47120"
2)     1) "name"
     2) "192.168.2.178:6379"
     3) "ip"
     4) "192.168.2.178"
     5) "port"
     6) "6379"
     7) "runid"
     8) "803d8178c44a4380243523248dca0838c7964299"
     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) "448"
    19) "last-ping-reply"
    20) "448"
    21) "down-after-milliseconds"
    22) "30000"
    23) "info-refresh"
    24) "4606"
    25) "role-reported"
    26) "slave"
    27) "role-reported-time"
    28) "235627"
    29) "master-link-down-time"
    30) "0"
    31) "master-link-status"
    32) "ok"
    33) "master-host"
    34) "192.168.2.177"
    35) "master-port"
    36) "6379"
    37) "slave-priority"
    38) "100"
    39) "slave-repl-offset"
    40) "47120"

上から出力すると、サービスからRedisが正常に表示されます.
歩哨集団常用命令
SENTINEL masters                            #        master,    master  
SENTINEL master                       #     master
SENTINEL slaves                       #    master   slave  slave  
SENTINEL sentinels                     #       master   sentinel
SENTINEL get-master-addr-by-name              #    master       IP      
SENTINEL reset                         #      pattern    master  
SENTINEL failover                      # msater   ,        Sentinel       ,             ,       sentinel         ,  sentinel           
SENTINEL ckquorum                      #    sentinel           master     ,        sentinel      ,    ok
SENTINEL flushconfig                                                   #  sentinel          ,    sentinel  

redis起動スクリプト
#!/bin/sh
#chkconfig: 2345 55 25
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO
source /etc/init.d/functions

REDISPORT=6379
EXEC=/usr/bin/redis-server
CLIEXEC=/usr/bin/redis-cli

PIDFILE=/wdata/redis/data/redis.pid
CONF="/wdata/redis/config/redis.conf"

AUTH=""
BIND_IP='192.168.2.177'

start(){
    if [ -f $PIDFILE ]
    then
            echo "$PIDFILE exists, process is already running or crashed"
    else
            echo "Starting Redis server..."
            $EXEC $CONF
    fi

    if [ "$?"="0" ]
    then
        echo "Redis is running..." 
    else
        echo "Redis not running !"
    fi
}

stop(){
    if [ ! -f $PIDFILE ]
    then
        echo "$PIDFILE does not exist, process is not running"
    else
        PID=$(cat $PIDFILE)
        echo "Stopping ..."
        #$CLIEXEC -h $BIND_IP -a $AUTH -p $REDISPORT shutdown
        $CLIEXEC -h $BIND_IP -p $REDISPORT shutdown
        while [ -x /proc/${PID} ]
        do
            echo "Waiting for Redis to shutdown ..."
            sleep 1
        done
        echo "Redis stopped."
    fi
}
status(){
    ps -ef | grep redis-server | grep -v grep >/dev/null 2>&1

    if [ $? -eq 0 ];then

        echo "redis server is running."

    else
        echo "redis server is stopped."

    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
            ;;
    status)
        status
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

sentinel起動スクリプト
#!/bin/sh
#chkconfig: 2345 55 25
#
# Simple Sentinel init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Sentinel data structure server
# Description:          Sentinel data structure server. See https://redis.io
### END INIT INFO
source /etc/init.d/functions

REDISPORT=26379
EXEC=/usr/bin/redis-sentinel
CLIEXEC=/usr/bin/redis-cli

PIDFILE=/wdata/redis/data/redis-sentinel.pid
CONF="/wdata/redis/config/sentinel.conf"

AUTH=""
BIND_IP='192.168.2.177'

start(){
    if [ -f $PIDFILE ]
    then
            echo "$PIDFILE exists, process is already running or crashed"
    else
            echo "Starting Sentinel server..."
            $EXEC $CONF
    fi

    if [ "$?"="0" ]
    then
        echo "Sentinel is running..." 
    else
        echo "Sentinel not running !"
    fi
}

stop(){
    if [ ! -f $PIDFILE ]
    then
        echo "$PIDFILE does not exist, process is not running"
    else
        PID=$(cat $PIDFILE)
        echo "Stopping ..."
        #$CLIEXEC -h $BIND_IP -a $AUTH -p $REDISPORT shutdown
        $CLIEXEC -h $BIND_IP -p $REDISPORT shutdown
        while [ -x /proc/${PID} ]
        do
            echo "Waiting for Sentinel to shutdown ..."
            sleep 1
        done
        echo "Sentinel stopped."
    fi
}
status(){
    ps -ef | grep redis-sentinel | grep -v grep >/dev/null 2>&1

    if [ $? -eq 0 ];then

        echo "Sentinel server is running."

    else
        echo "Sentinel server is stopped."

    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
            ;;
    status)
        status
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac