redis+Centinel+keepalivedクラスタ高可用性を実現
6226 ワード
RedisバージョンRedis server v=3.2.12 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7897 e 7 d 0 e 13773 f
KeepalivedバージョンKeepalived v 1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
原理:
Keepalivedは重みの最大値から仮想アドレスを取得し、スクリプトの実行に失敗して重み50を下げる
Sentinal自動切替クラスタMaster Slave
ホスト名
ipアドレス
redis
Sentinel
keepalived
node01
172.16.50.111
インストール
インストール
インストール
node02
172.16.50.113
インストール
インストール
インストール
node03
172.16.50.115
インストール
インストール
インストール
Node 01 node 02 node 03インストール
Node 01構成redis
Node 02 node 03構成redis
Node 01 node 02 node 03ノードredisを起動
Node 01 slaveステータスの表示
Sentinalサービスの構成
Node 01 node 02 node 03それぞれSentineサービスを開始
Node 01 sentinelログの表示
sentinelが自動的に切り替えるかどうかをテストします
Node 01 redisを停止しsentinelログを表示
Redis Masterは自動的に172.16.5.0.115に切り替え、172.16.5.0.115にログインしてステータスを表示します.
テスト完了node 01 redisを起動しsentinelログを表示
Node 01 node 02 node 03 Keepalivedサービスの構成
スクリプト/etc/keepalived/check_redis.shの内容は以下の通りである.
Node 01 node 02 node 03それぞれKeepalivedサービスを開始
Redis Masterがあるノードにいると、仮想IPがこのノードにドリフトします.
KeepalivedバージョンKeepalived v 1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
原理:
Keepalivedは重みの最大値から仮想アドレスを取得し、スクリプトの実行に失敗して重み50を下げる
Sentinal自動切替クラスタMaster Slave
ホスト名
ipアドレス
redis
Sentinel
keepalived
node01
172.16.50.111
インストール
インストール
インストール
node02
172.16.50.113
インストール
インストール
インストール
node03
172.16.50.115
インストール
インストール
インストール
Node 01 node 02 node 03インストール
yum install redis keepalived -y
Node 01構成redis
bind 0.0.0.0
Node 02 node 03構成redis
bind 0.0.0.0
slaveof 172.16.50.111 6379
Node 01 node 02 node 03ノードredisを起動
systemctl enable redis && systemctl start redis
Node 01 slaveステータスの表示
redis-cli info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.50.113,port=6379,state=online,offset=211,lag=0
slave1:ip=172.16.50.115,port=6379,state=online,offset=211,lag=0
Sentinalサービスの構成
protected-mode no
sentinel monitor mymaster 172.16.50.111 6379 2
Node 01 node 02 node 03それぞれSentineサービスを開始
systemctl enable redis-sentinel && systemctl start redis-sentinel
Node 01 sentinelログの表示
12946:X 20 Feb 01:35:39.771 # Sentinel ID is 2c8b02a2536aa081f0b95e19e2948b5ac25e6306
12946:X 20 Feb 01:35:39.771 # +monitor master mymaster 172.16.50.111 6379 quorum 2
12946:X 20 Feb 01:35:39.772 * +slave slave 172.16.50.113:6379 172.16.50.113 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:35:39.789 * +slave slave 172.16.50.115:6379 172.16.50.115 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:36:25.103 * +sentinel sentinel 6eb0e3c142d97532d5558448cb09f5c038acc743 172.16.50.113 26379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:36:41.807 * +sentinel sentinel ed44244bb0357aa9cc70f3c3ddba466d30b4865c 172.16.50.115 26379 @ mymaster 172.16.50.111 6379
sentinelが自動的に切り替えるかどうかをテストします
Node 01 redisを停止しsentinelログを表示
12946:X 20 Feb 01:40:32.817 # +sdown master mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:32.870 # +odown master mymaster 172.16.50.111 6379 #quorum 2/2
12946:X 20 Feb 01:40:32.870 # +new-epoch 1
12946:X 20 Feb 01:40:32.870 # +try-failover master mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:32.888 # +vote-for-leader 2c8b02a2536aa081f0b95e19e2948b5ac25e6306 1
12946:X 20 Feb 01:40:32.961 # ed44244bb0357aa9cc70f3c3ddba466d30b4865c voted for 2c8b02a2536aa081f0b95e19e2948b5ac25e6306 1
12946:X 20 Feb 01:40:32.970 # 6eb0e3c142d97532d5558448cb09f5c038acc743 voted for 2c8b02a2536aa081f0b95e19e2948b5ac25e6306 1
12946:X 20 Feb 01:40:33.006 # +elected-leader master mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:33.006 # +failover-state-select-slave master mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:33.107 # +selected-slave slave 172.16.50.115:6379 172.16.50.115 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:33.107 * +failover-state-send-slaveof-noone slave 172.16.50.115:6379 172.16.50.115 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:33.174 * +failover-state-wait-promotion slave 172.16.50.115:6379 172.16.50.115 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:33.678 # +promoted-slave slave 172.16.50.115:6379 172.16.50.115 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:33.678 # +failover-state-reconf-slaves master mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:33.758 * +slave-reconf-sent slave 172.16.50.113:6379 172.16.50.113 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:34.092 # -odown master mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:34.662 * +slave-reconf-inprog slave 172.16.50.113:6379 172.16.50.113 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:35.724 * +slave-reconf-done slave 172.16.50.113:6379 172.16.50.113 6379 @ mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:35.800 # +failover-end master mymaster 172.16.50.111 6379
12946:X 20 Feb 01:40:35.800 # +switch-master mymaster 172.16.50.111 6379 172.16.50.115 6379
12946:X 20 Feb 01:40:35.800 * +slave slave 172.16.50.113:6379 172.16.50.113 6379 @ mymaster 172.16.50.115 6379
12946:X 20 Feb 01:40:35.801 * +slave slave 172.16.50.111:6379 172.16.50.111 6379 @ mymaster 172.16.50.115 6379
Redis Masterは自動的に172.16.5.0.115に切り替え、172.16.5.0.115にログインしてステータスを表示します.
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.50.113,port=6379,state=online,offset=17056,lag=1
テスト完了node 01 redisを起動しsentinelログを表示
12946:X 20 Feb 01:41:05.843 # +sdown slave 172.16.50.111:6379 172.16.50.111 6379 @ mymaster 172.16.50.115 6379
12946:X 20 Feb 01:42:56.146 # -sdown slave 172.16.50.111:6379 172.16.50.111 6379 @ mymaster 172.16.50.115 6379
12946:X 20 Feb 01:43:06.074 * +convert-to-slave slave 172.16.50.111:6379 172.16.50.111 6379 @ mymaster 172.16.50.115 6379
Node 01 node 02 node 03 Keepalivedサービスの構成
! Configuration File for keepalived
global_defs {
router_id node02
}
vrrp_script chk_redis {
script "/etc/keepalived/check_redis.sh"
interval 2
weight -50
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_redis
}
virtual_ipaddress {
172.16.50.135
}
}
スクリプト/etc/keepalived/check_redis.shの内容は以下の通りである.
#!/bin/bash
ALIVE=`/usr/bin/redis-cli PING`
rstatus=$(/usr/bin/redis-cli info Replication | grep "role" | awk -F ':' '{print $2}')
a=$(echo $rstatus | grep "master")
if [ "$ALIVE" == "PONG" ] && [ "$a" != "" ] ; then # redis , master
exit 0
else
exit 1
fi
Node 01 node 02 node 03それぞれKeepalivedサービスを開始
systemctl enable keepalived && systemctl start keepalived
Redis Masterがあるノードにいると、仮想IPがこのノードにドリフトします.