この記事では、Redis センチネル クラスターの実装手順を中心に紹介します。サンプル コードを通じて詳細に紹介しています。皆さんの学習や仕事の参考になる学習価値があります。一緒に見てみましょう。 ,皆さんが助けてくれることを願っています。
推奨学習: Redis ビデオ チュートリアル
1. Redis センチネル クラスターの概要
(1) Redis Sentinel の概要
*Sentinel Sentinel: これは分散システムです。このプロセスは、Redis クラスター内のマスター サーバーの動作ステータスを監視するために使用されます。マスター サーバーに障害が発生した場合、マスター サーバーの制御を実現できます。 2 番目のレベルのスイッチングにより、システムにマスター サーバーが存在することが保証され、Redis クラスターの高可用性が提供されます。これは Redis2.6 バージョンで追加され、2.8 バージョン以降で安定しました。 ##Redis Sentinel と Redis マスターとスレーブの違い:
Redis Sentinel: マスター サーバーに障害が発生した後は、マスター サーバーに代わるスレーブ サーバーが存在します
Redis マスター/スレーブ: マスター サーバーに障害が発生すると、スレーブ サーバーは何も行いません
( 2) Redis Sentinel の動作メカニズム
セントリーはマスターサーバーにデプロイするだけで済みます
##ワーカープロセス:
#監視: Sentinel は、ゴシップ プロトコルを通じてクラスター内の各サーバーが正常に動作しているかどうかを継続的にチェックします。
通知: Redis が監視されると、 Sentinel サーバーに問題が発生した場合、Sentinel は API (アプリケーション プログラミング インターフェイス) を通じて管理者または他のアプリケーションに通知を送信できます。
自動フェイルオーバー:クラスター内のマスター サーバーに障害が発生すると、Sentinel は投票プロトコル (合意プロトコル) を通じて自動障害移行操作を開始し、より完全なデータを持つスレーブ サーバーを選択してマスター サーバーにアップグレードします。マスターサーバーに障害が発生した場合、クラスターは新しいマスターサーバーのアドレスもクライアントに返します。これにより、クラスターは現在のマスターを使用して障害が発生したマスターを置き換えることができます。
マスターとスレーブが切り替わると、マスターの redis メイン構成ファイル、スレーブの redis メイン構成ファイル、センチネルの構成ファイルの内容がすべて変更されます。元のマスターの redis メイン設定ファイルにスレーブ サーバーの設定が 1 行追加され、Sentinel の監視対象が現在のマスター サーバー
に変更されます。
(3) Sentinel の 3 つのスケジュールされた監視タスク
各 Sentinel ノードは、10 秒ごとにマスター ノードとスレーブ ノードに info コマンドを送信して、Redis データ ノードの情報を取得します
機能:
マスターノードで info コマンドを実行して、スレーブノードの情報を取得します。監視スレーブ ノードを明示的に構成する必要はありません。新しいスレーブ ノードが参加すると即座に検出でき、ノードに到達できない場合やフェイルオーバー後は、info コマンドを使用してノード トポロジ情報をリアルタイムに更新できます。
各 Sentinel ノードは 1 秒ごとにマスター ノードとスレーブ ノードに ping コマンドを送信し、ハートビート チェックを行い、これらのノードが現在到達可能かどうかを確認します
マスター ノードがハングアップした場合、sentinel は比較的完全なデータを持つ残りのスレーブ ノードの 1 つをマスター ノードとして選択します
2. Redis Sentinel システムをデプロイします ( 1) 実験環境
システム
ip
ホスト名 | Redisバージョン | ポート | 役割を果たします |
|
##Centos7.4 |
192.168.100.202
マスター
Redis-5.0.4 |
Redis: 6379 Sentinel: 26379 |
Master |
| ##Centos7.4 | 192.168.100.203 | slave1
Redis-5.0.4 | Redis:6379 | スレーブ |
| Centos7.4 | 192.168.100.204 | slave2
Redis-5.0.4 | Redis: 6379 | スレーブ |
|
(2)实验步骤 -在每台服务器上都安装Redis
安装步骤相同,主机名、ip不同,下面只写Master配置
[root@Centos7 ~]# hostnamectl set-hostname master
[root@Centos7 ~]# su
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
setenforce: SELinux is disabled
[root@master ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
[root@master ~]# ll
总用量 1928
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 1966337 6月 9 01:16 redis-5.0.4.tar.gz
[root@master ~]# tar xf redis-5.0.4.tar.gz
[root@master ~]# cd redis-5.0.4
[root@master redis-5.0.4]# make
[root@master redis-5.0.4]# mkdir -p /usr/local/redis
[root@master redis-5.0.4]# cp /root/redis-5.0.4/src/redis-server /usr/local/redis/
[root@master redis-5.0.4]# cp /root/redis-5.0.4/src/redis-cli /usr/local/redis/
[root@master redis-5.0.4]# cp /root/redis-5.0.4/redis.conf /usr/local/redis/
[root@master redis-5.0.4]# vim /usr/local/redis/redis.conf #修改
。。。。。。
68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69 bind 192.168.100.202 #修改为本机地址,如果为127.0.0.1就只能本机访问
70
。。。。。。
87 # are explicitly listed using the "bind" directive.
88 protected-mode no #关闭redis的保护模式,如果为yes的话其他客户端就无法连接到此服务器
89
。。。。。。
135 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
136 daemonize yes #开启redis的后台守护程序,即在redis开启之后是放在后台运行的
137
。。。。。。
262 # Note that you must specify a directory here, not a file name.
263 dir /usr/local/redis/rdb
264
。。。。。。
506 #
507 requirepass 123123 #去掉注释,修改redis的密码为123123
508
#保存退出
[root@slave2 redis-5.0.4]# mkdir /usr/local/redis/rdb
[root@master redis-5.0.4]# vim /etc/init.d/redis
#!/bin/sh
# chkconfig: 2345 80 90
# description: Start and Stop redis
#PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/redis-server
REDIS_CLI=/usr/local/redis/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/usr/local/redis/redis.conf"
AUTH="123123"
LISTEN_IP=$(netstat -utpln |grep redis-server |awk '{print $4}'|awk -F':' '{print $1}')
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
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$REDIS_CLI -h $LISTEN_IP -p $REDISPORT -a $AUTH SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
[root@master redis-5.0.4]# chkconfig --add redis
[root@master redis-5.0.4]# chmod 755 /etc/init.d/redis
[root@master redis-5.0.4]# ln -s /usr/local/redis/* /usr/local/bin/
[root@master redis-5.0.4]# /etc/init.d/redis start
Starting Redis server...
5233:C 09 Jun 2021 01:25:53.069 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5233:C 09 Jun 2021 01:25:53.069 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=5233, just started
5233:C 09 Jun 2021 01:25:53.069 # Configuration loaded
Redis is running...
[root@master redis-5.0.4]# netstat -anpt | grep 6379
tcp 0 0 192.168.100.202:6379 0.0.0.0:* LISTEN 5234/redis-server 1
ログイン後にコピー
-做redis主从
******(1)Master配置
[root@master redis-5.0.4]# vim /usr/local/redis/redis.conf #修改
。。。。。。
292 #
293 masterauth 123123 #配置主服务器密码,哨兵有一个问题,就是当主服务器坏掉,切换到从服务器时,原来的主服务器可以正常运行之后,再次加入集群是加不进去的,因为哨兵没有配置主服务器的密码,所以无法连接,所以在使用哨兵集群时,要把每台的主服务器密码都配置上,每台redis的密码最好都一样
294
。。。。。。
456 #
457 min-replicas-to-write 1 #设置slave服务器的数量,当slave服务器少于这个数量时,Master主服务器会停止接收客户端的一切写请求
458 min-replicas-max-lag 10 #设置主服务器和从服务器之间同步数据的超时时间,当超过此时间时,master主服务器会停止客户端的一切写操作,单位为秒
459 #
。。。。。。
[root@master redis-5.0.4]# /etc/init.d/redis restart #重启redis
Stopping ...
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Redis stopped
Starting Redis server...
5291:C 09 Jun 2021 02:04:39.132 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5291:C 09 Jun 2021 02:04:39.132 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=5291, just started
5291:C 09 Jun 2021 02:04:39.132 # Configuration loaded
Redis is running...
******(2)Slave1配置
[root@slave1 redis-5.0.4]# vim /usr/local/redis/redis.conf
。。。。。。
285 #
286 replicaof 192.168.100.202 6379 #在从服务器上指定主服务器的ip和端口
287
。。。。。。
292 #
293 masterauth 123123 #指定主服务器上redis的密码
294
。。。。。。
#保存退出
[root@slave redis-5.0.4]# /etc/init.d/redis restart #重启服务
Stopping ...
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Redis stopped
Starting Redis server...
5304:C 09 Jun 2021 02:11:32.241 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5304:C 09 Jun 2021 02:11:32.241 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=5304, just started
5304:C 09 Jun 2021 02:11:32.241 # Configuration loaded
Redis is running...
******(3)Slave2配置
[root@slave2 redis-5.0.4]# vim /usr/local/redis/redis.conf
。。。。。。
286 replicaof 192.168.100.204 6379
287
288 # If the master is password protected (using the "requirepass" configuration
289 # directive below) it is possible to tell the replica to authenticate before
290 # starting the replication synchronization process, otherwise the master will
291 # refuse the replica request.
292 #
293 masterauth 123123
294
。。。。。。
#保存退出
[root@slave2 redis-5.0.4]# /etc/init.d/redis restart
Stopping ...
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Redis stopped
Starting Redis server...
5253:C 09 Jun 2021 17:50:25.680 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5253:C 09 Jun 2021 17:50:25.680 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=5253, just started
5253:C 09 Jun 2021 17:50:25.680 # Configuration loaded
Redis is running...
******(3)验证主从是否成功
[root@master ~]# redis-cli -h 192.168.100.202 -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.202:6379> set aaa bbb
OK
192.168.100.202:6379> set bbb ccc
OK
192.168.100.202:6379> keys *
1) "aaa"
2) "bbb"
[root@slave1 ~]# redis-cli -h 192.168.100.203 -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.203:6379> keys *
1) "bbb"
2) "aaa"
192.168.100.203:6379> set ttt fff
(error) READONLY You can't write against a read only replica. #从服务器无法写入数据
[root@slave2 redis-5.0.4]# redis-cli -h 192.168.100.204 -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.204:6379> keys *
1) "aaa"
2) "bbb"
192.168.100.204:6379> set ggg aaa
(error) READONLY You can't write against a read only replica.
#主从配置完成
ログイン後にコピー
-配置哨兵
******(1)在master上配置sentinel哨兵
[root@master ~]# cp redis-5.0.4/src/redis-sentinel /usr/local/redis/ #复制哨兵启动脚本
[root@master ~]# cp redis-5.0.4/sentinel.conf /usr/local/redis/ #复制哨兵配置文件
[root@master ~]# mkdir -p /var/redis/data #创建日志文件存放位置
[root@master ~]# vim /usr/local/redis/sentinel.conf #修改哨兵配置文件
。。。。。。
21 port 26379 #指定端口默认为26379
22
23 # By default Redis Sentinel does not run as a daemon. Use 'yes' if you need it.
24 # Note that Redis will write a pid file in /var/run/redis-sentinel.pid when
25 # daemonized.
26 daemonize yes #yes为放在后台运行,使用no放在前台运行可以看到主从切换时候的信息
27
。。。。。。
64 # unmounting filesystems.
65 dir /var/redis/data #指定日志存放位置,就是刚才创建的路径
66
。。。。。。
83 # The valid charset is A-z 0-9 and the three characters ".-_".
84 sentinel monitor mymaster 192.168.100.202 6379 1 #指定用户为mymaster,ip为202,端口为6379,1表示当有一台master出现故障时,就进行切换
85
86 # sentinel a
。。。。。。
112 # Default is 30 seconds.
113 sentinel down-after-milliseconds mymaster 3000 #指定master的失效时间,单位为毫秒3000为3秒,表示master超过3秒没响应就判定为故障
114
。。。。。。
145 # Default is 3 minutes.
146 sentinel failover-timeout mymaster 180000 #切换操作完成的超时时间,单位为毫秒180000为180秒,在主从切换超过这个时间就判定为切换失败
147
148 # SCRIPTS EXE
。。。。。。
102 #
103 sentinel auth-pass mymaster 123123 #连接master和slave的密码
104 sentinel config-epoch mymaster 1 #切换后最多有多少节点可以于新的master进行同步数据
105
#保存退出
[root@master ~]# /usr/local/redis/redis-sentinel /usr/local/redis/sentinel.conf #启动哨兵
1118:X 09 Jun 2021 18:09:29.027 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1118:X 09 Jun 2021 18:09:29.027 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1118, just started
1118:X 09 Jun 2021 18:09:29.027 # Configuration loaded
[root@master ~]# netstat -anpt | grep 26379
tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 1119/redis-sentinel
tcp6 0 0 :::26379 :::* LISTEN 1119/redis-sentinel
[root@master ~]# kill -9 1119 #先关闭哨兵
[root@master ~]# netstat -anpt | grep 26379
[root@master ~]# sed -i '26s/yes/no/g' /usr/local/redis/sentinel.conf #修改为前台启动
[root@master ~]# /usr/local/redis/redis-sentinel /usr/local/redis/sentinel.conf #再次开启哨兵,稍等一段时间会有提示
1129:X 09 Jun 2021 18:11:02.585 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1129:X 09 Jun 2021 18:11:02.585 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1129, just started
1129:X 09 Jun 2021 18:11:02.585 # Configuration loaded
1129:X 09 Jun 2021 18:11:02.586 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.4 (00000000/0) 64 bit
.-`` .-". "\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 1129
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
1129:X 09 Jun 2021 18:11:02.586 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1129:X 09 Jun 2021 18:11:02.586 # Sentinel ID is fce7776020cf12792fd239f6f9d34f2d3fdef98c
1129:X 09 Jun 2021 18:11:02.586 # +monitor master mymaster 192.168.100.202 6379 quorum 1
1129:X 09 Jun 2021 18:18:04.434 * +reboot slave 192.168.100.204:6379 192.168.100.204 6379 @ mymaster 192.168.100.202 6379 #看到新增两条消息,从服务器增加了203和204主服务器时202
1129:X 09 Jun 2021 18:18:14.478 * +reboot slave 192.168.100.203:6379 192.168.100.203 6379 @ mymaster 192.168.100.202 6379
#哨兵配置完成
ログイン後にコピー
-测试哨兵的故障切换
******(1)把master服务器在开启一个终端,在新开启的终端中关闭redis,测试是否可以主从切换
[root@master ~]# /etc/init.d/redis stop
Stopping ...
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Redis stopped
******(2)切换到开启哨兵的终端,查看新弹出的信息
1129:X 09 Jun 2021 18:20:36.588 # +failover-end master mymaster 192.168.100.202 6379
1129:X 09 Jun 2021 18:20:36.588 # +switch-master mymaster 192.168.100.202 6379 192.168.100.203 6379
1129:X 09 Jun 2021 18:20:36.588 * +slave slave 192.168.100.204:6379 192.168.100.204 6379 @ mymaster 192.168.100.203 6379 #发现主服务器变成了203
1129:X 09 Jun 2021 18:20:36.588 * +slave slave 192.168.100.202:6379 192.168.100.202 6379 @ mymaster 192.168.100.203 6379
1129:X 09 Jun 2021 18:20:39.607 # +sdown slave 192.168.100.202:6379 192.168.100.202 6379 @ mymaster 192.168.100.203 6379‘
******(3)在203上测试主从复制是否可以正常同步
[root@slave1 ~]# redis-cli -h 192.168.100.203 -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.203:6379> keys *
1) "aaa"
2) "bbb"
192.168.100.203:6379> set yyy aaa
OK
192.168.100.203:6379> keys *
1) "yyy"
2) "aaa"
3) "bbb"
[root@slave2 redis-5.0.4]# redis-cli -h 192.168.100.204 -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.204:6379> keys * #发现同步成功
1) "yyy"
2) "bbb"
3) "aaa"
******(4)此时重新开启202的redis,并且查看哨兵的提示消息
[root@master ~]# /etc/init.d/redis start
Starting Redis server...
1167:C 09 Jun 2021 18:23:39.756 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1167:C 09 Jun 2021 18:23:39.756 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1167, just started
1167:C 09 Jun 2021 18:23:39.756 # Configuration loaded
Redis is running...
1129:X 09 Jun 2021 18:23:50.324 * +convert-to-slave slave 192.168.100.202:6379 192.168.100.202 6379 @ mymaster 192.168.100.203 6379 #提示增加了一台slave
******(5)在202的新终端上查看redis的数据是否成功同步
[root@master ~]# redis-cli -h 192.168.100.202 -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.202:6379> keys * #发现已经成功同步
1) "bbb"
2) "aaa"
3) "yyy"
#测试故障切换缓存,发现在master主机出现故障然后重新连接到集群后,master角色不会进行转移
ログイン後にコピー
-哨兵日志分析
#把哨兵放在前台运行时,日志信息会直接输出到终端上,放到后台运行时,日志会写到指定的路径中
+reset-master <instance details> #当master被重置时.
+slave <instance details> #当检测到一个slave并添加进slave列表时.
+failover-state-reconf-slaves <instance details> #Failover状态变为reconf-slaves状态时
+failover-detected <instance details> #当failover发生时
+slave-reconf-sent <instance details> #sentinel发送SLAVEOF命令把它重新配置时
+slave-reconf-inprog <instance details> #slave被重新配置为另外一个master的slave,但数据复制还未发生时。
+slave-reconf-done <instance details> #slave被重新配置为另外一个master的slave并且数据复制已经与master同步时。
-dup-sentinel <instance details> #删除指定master上的冗余sentinel时,当一个sentinel重新启动时,可能会发生这个事件
+sentinel <instance details> #当master增加了一个sentinel时。
+sdown <instance details> #进入SDOWN状态时;
-sdown <instance details> #离开SDOWN状态时。
+odown <instance details> #进入ODOWN状态时。
-odown <instance details> #离开ODOWN状态时。
+new-epoch <instance details> #当前配置版本被更新时。
+try-failover <instance details> #达到failover条件,正等待其他sentinel的选举。
+elected-leader <instance details> #被选举为去执行failover的时候。
+failover-state-select-slave <instance details> #开始要选择一个slave当选新master时。
no-good-slave <instance details> #没有合适的slave来担当新master
selected-slave <instance details> #找到了一个适合的slave来担当新master
failover-state-send-slaveof-noone <instance details> #当把选择为新master的slave的身份进行切换的时候。
failover-end-for-timeout <instance details> #failover由于超时而失败时。
failover-end <instance details> #failover成功完成时。
switch-master <master name> <oldip> <oldport> <newip> <newport> #当master的地址发生变化时。通常这是客户端最感兴趣的消息了。
+tilt #进入Tilt模式。
-tilt #退出Tilt模式。
ログイン後にコピー
推荐学习:Redis视频教程
以上がRedis ステップ分析センチネル クラスターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。