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構成
Redisプロファイル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台のサーバにコピー
歩哨配置
sentinelプロファイル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台のサーバに配布します.
Redisの起動
3台のサーバで別々に実行
Redisが正常に起動したかどうかを確認
または
歩哨を起動する.
3台のサーバで別々に実行
哨兵の起動が成功したかどうかを確認する
または
哨兵集団の状態の表示
私たちのRedisサービスと哨兵(sentinel)サービスは正常に起動しました.次に、クラスタが正常かどうかを検証する必要があります.
出力から分かるように、他の2人の哨兵は正常に運行している.
上出力で表示され、主Redisは正常です.
上から出力すると、サービスからRedisが正常に表示されます.
歩哨集団常用命令
redis起動スクリプト
sentinel起動スクリプト
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