拓扑结构介绍:
192.168.43.70 redis01 (Mater + 哨兵)
192.168.43.71 redis02 (Slave + 哨兵)
192.168.43.72 redis03 (Slave + 哨兵)
OS : CentOS Linux release 7.7.1908 (Core)
Redis : redis-5.0.9.tar.gz
模式 : 1主2从3哨兵结构
一、系统基本配置(所有节点)
1.安装基础软件
[root@redis01 src]# yum install vim wget curl ntp net-tools -y
2.设置Selinux及关闭防火墙
[root@redis01 src]# grep '^SELINUX' /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
[root@redis01 src]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
3.修改/etc/hosts文件
[root@redis01 src]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.43.70 redis01
192.168.43.71 redis02
192.168.43.72 redis03
[root@redis01 src]#
4.启用ntpd服务
[root@redis01 src]# grep '^server' /etc/ntp.conf
server ntp.aliyun.com
[root@redis01 src]# date
Tue Sep 1 10:36:27 CST 2020
[root@redis01 src]#
二、配置redis主从复制
1.修改redis配置文件
redis01 -> Master上:
[root@redis01 src]# pwd
/opt/redis/src
[root@redis01 src]# cat ../redis.conf
bind 192.168.43.70
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/var/log/redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis
masterauth "test.123"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass "test.123"
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
[root@redis01 src]#
redis02 -> Slave上:
[root@redis02 src]# pwd
/opt/redis/src
[root@redis02 src]# cat ../redis.conf
bind 192.168.43.71
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/var/log/redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis
masterauth "test.123"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass "test.123"
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
slaveof 192.168.43.70 6379
[root@redis02 src]#
redis03 -> Slave上:
[root@redis03 src]# pwd
/opt/redis/src
[root@redis03 src]# cat ../redis.conf
bind 192.168.43.72
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/var/log/redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis
masterauth "test.123"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass "test.123"
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
slaveof 192.168.43.70 6379
[root@redis03 src]#
2.启动redis(所有节点执行)
[root@redis01 src]# ./redis-server ../redis.conf
[root@redis01 src]# ps -ef | grep redis
root 24152 1 0 10:12 ? 00:00:03 ./redis-server 192.168.43.70:6379
root 24183 1238 0 10:26 pts/0 00:00:00 grep --color=auto redis
[root@redis01 src]# netstat -anultp | grep 6379
tcp 0 0 192.168.43.70:6379 0.0.0.0:* LISTEN 24152/./redis-serve
3.查看主从复制状态
Master上:
[root@redis01 src]# ./redis-cli -h 192.168.43.70 -p 6379 -a test.123
192.168.43.70:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.43.72,port=6379,state=online,offset=30096,lag=1
slave1:ip=192.168.43.71,port=6379,state=online,offset=30096,lag=1
master_replid:e94b07c81145e92a9a172b30f67025f5ecbbf6e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:30378
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:30378
192.168.43.70:6379>
Slave上:
[root@redis02 src]# ./redis-cli -h 192.168.43.71 -p 6379 -a test.123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.43.71:6379> info replication
# Replication
role:slave
master_host:192.168.43.70
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:32084
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e94b07c81145e92a9a172b30f67025f5ecbbf6e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:32084
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:32084
192.168.43.71:6379>
Slave上:
[root@redis03 src]# ./redis-cli -h 192.168.43.72 -p 6379 -a test.123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.43.72:6379> info replication
# Replication
role:slave
master_host:192.168.43.70
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:32521
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e94b07c81145e92a9a172b30f67025f5ecbbf6e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:32521
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:32521
192.168.43.72:6379>
4.测试数据同步情况
Master上写:
192.168.43.70:6379> keys *
(empty list or set)
192.168.43.70:6379> set test "test for redis master-slave"
OK
192.168.43.70:6379> get test
"test for redis master-slave"
192.168.43.70:6379>
Slave上读:
192.168.43.71:6379> get test
"test for redis master-slave"
192.168.43.71:6379> set name test
(error) READONLY You can't write against a read only replica.
192.168.43.71:6379>
Slave上读
192.168.43.72:6379> get test
"test for redis master-slave"
192.168.43.72:6379> set name test
(error) READONLY You can't write against a read only replica.
192.168.43.72:6379>
三、配置哨兵模式
1.修改sentinel配置文件
redis01上:
[root@redis01 src]# cat ../sentinel.conf
bind 192.168.43.70
protected-mode no
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis-sentinel.log"
dir "/tmp"
sentinel myid b5d6f6efc7aac83d98c041c0595cc5b223d2eed9
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.43.70 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 2
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster test.123
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.43.72 6379
sentinel known-replica mymaster 192.168.43.71 6379
sentinel known-sentinel mymaster 192.168.43.71 26379 4d7f54e8c107073be0a52c40fb06255645da67e0
sentinel known-sentinel mymaster 192.168.43.72 26379 1e6cad9f7170f19eedc314edee00f4c954c4518e
sentinel current-epoch 0
[root@redis01 src]#
redis02上:
[root@redis02 src]# pwd
/opt/redis/src
[root@redis02 src]# cat ../sentinel.conf
bind 192.168.43.71
protected-mode no
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis-sentinel.log"
dir "/tmp"
sentinel myid 4d7f54e8c107073be0a52c40fb06255645da67e0
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.43.70 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 2
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster test.123
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.43.71 6379
sentinel known-replica mymaster 192.168.43.72 6379
sentinel known-sentinel mymaster 192.168.43.70 26379 b5d6f6efc7aac83d98c041c0595cc5b223d2eed9
sentinel known-sentinel mymaster 192.168.43.72 26379 1e6cad9f7170f19eedc314edee00f4c954c4518e
sentinel current-epoch 0
[root@redis02 src]#
redis03上:
[root@redis03 src]# pwd
/opt/redis/src
[root@redis03 src]# cat ../sentinel.conf
bind 192.168.43.72
protected-mode no
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis-sentinel.log"
dir "/tmp"
sentinel myid 1e6cad9f7170f19eedc314edee00f4c954c4518e
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.43.70 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 2
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster test.123
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.43.72 6379
sentinel known-replica mymaster 192.168.43.71 6379
sentinel known-sentinel mymaster 192.168.43.70 26379 b5d6f6efc7aac83d98c041c0595cc5b223d2eed9
sentinel known-sentinel mymaster 192.168.43.71 26379 4d7f54e8c107073be0a52c40fb06255645da67e0
sentinel current-epoch 0
[root@redis03 src]#
2.启动sentinel(所有节点)
[root@redis03 src]# ./redis-sentinel ../sentinel.conf --sentinel
[root@redis03 src]# ps -ef | grep redis-sentinel
root 16017 1 0 10:14 ? 00:00:09 ./redis-sentinel 192.168.43.72:26379 [sentinel]
root 16042 1263 0 10:40 pts/0 00:00:00 grep --color=auto redis-sentinel
[root@redis03 src]# netstat -anultp | grep 26379
tcp 0 0 192.168.43.72:26379 0.0.0.0:* LISTEN 16017/./redis-senti
tcp 0 0 192.168.43.72:50408 192.168.43.71:26379 ESTABLISHED 16017/./redis-senti
tcp 0 0 192.168.43.72:26379 192.168.43.70:56574 ESTABLISHED 16017/./redis-senti
tcp 0 0 192.168.43.72:41486 192.168.43.70:26379 ESTABLISHED 16017/./redis-senti
tcp 0 0 192.168.43.72:26379 192.168.43.71:44420 ESTABLISHED 16017/./redis-senti
[root@redis03 src]#
3.查看sentinel状态
[root@redis01 src]# ./redis-cli -h 192.168.43.70 -p 26379
192.168.43.70:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.43.70:6379,slaves=2,sentinels=3
192.168.43.70:26379>
4.观察配置文件sentinel.conf的变化
sentinel配置完成后配置文件被重写:
redis01上:
[root@redis01 src]# tail -n 10 ../sentinel.conf
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster test.123
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.43.72 6379
sentinel known-replica mymaster 192.168.43.71 6379
sentinel known-sentinel mymaster 192.168.43.71 26379 4d7f54e8c107073be0a52c40fb06255645da67e0
sentinel known-sentinel mymaster 192.168.43.72 26379 1e6cad9f7170f19eedc314edee00f4c954c4518e
sentinel current-epoch 0
[root@redis01 src]#
redis02上:
[root@redis02 src]# tail -n 10 ../sentinel.conf
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster test.123
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.43.71 6379
sentinel known-replica mymaster 192.168.43.72 6379
sentinel known-sentinel mymaster 192.168.43.70 26379 b5d6f6efc7aac83d98c041c0595cc5b223d2eed9
sentinel known-sentinel mymaster 192.168.43.72 26379 1e6cad9f7170f19eedc314edee00f4c954c4518e
sentinel current-epoch 0
[root@redis02 src]#
redis03上:
[root@redis03 src]# tail -n 10 ../sentinel.conf
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster test.123
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.43.72 6379
sentinel known-replica mymaster 192.168.43.71 6379
sentinel known-sentinel mymaster 192.168.43.70 26379 b5d6f6efc7aac83d98c041c0595cc5b223d2eed9
sentinel known-sentinel mymaster 192.168.43.71 26379 4d7f54e8c107073be0a52c40fb06255645da67e0
sentinel current-epoch 0
[root@redis03 src]#
5.观察sentinel日志情况:
redis01上:
[root@redis01 src]# cat /var/log/redis-sentinel.log
24163:X 01 Sep 2020 10:14:16.814 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24163:X 01 Sep 2020 10:14:16.814 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=24163, just started
24163:X 01 Sep 2020 10:14:16.814 # Configuration loaded
24164:X 01 Sep 2020 10:14:16.819 * Increased maximum number of open files to 10032 (it was originally set to 1024).
24164:X 01 Sep 2020 10:14:16.821 * Running mode=sentinel, port=26379.
24164:X 01 Sep 2020 10:14:16.822 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
24164:X 01 Sep 2020 10:14:16.828 # Sentinel ID is b5d6f6efc7aac83d98c041c0595cc5b223d2eed9
24164:X 01 Sep 2020 10:14:16.829 # +monitor master mymaster 192.168.43.70 6379 quorum 2
24164:X 01 Sep 2020 10:14:16.831 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.70 6379
24164:X 01 Sep 2020 10:14:16.832 * +slave slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
24164:X 01 Sep 2020 10:14:18.811 * +sentinel sentinel 1e6cad9f7170f19eedc314edee00f4c954c4518e 192.168.43.72 26379 @ mymaster 192.168.43.70 6379
24164:X 01 Sep 2020 10:14:18.819 * +sentinel sentinel 4d7f54e8c107073be0a52c40fb06255645da67e0 192.168.43.71 26379 @ mymaster 192.168.43.70 6379
[root@redis01 src]#
redis02上:
[root@redis02 src]# cat /var/log/redis-sentinel.log
15994:X 01 Sep 2020 10:14:16.846 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
15994:X 01 Sep 2020 10:14:16.846 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=15994, just started
15994:X 01 Sep 2020 10:14:16.846 # Configuration loaded
15995:X 01 Sep 2020 10:14:16.852 * Increased maximum number of open files to 10032 (it was originally set to 1024).
15995:X 01 Sep 2020 10:14:16.854 * Running mode=sentinel, port=26379.
15995:X 01 Sep 2020 10:14:16.854 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
15995:X 01 Sep 2020 10:14:16.859 # Sentinel ID is 4d7f54e8c107073be0a52c40fb06255645da67e0
15995:X 01 Sep 2020 10:14:16.859 # +monitor master mymaster 192.168.43.70 6379 quorum 2
15995:X 01 Sep 2020 10:14:16.872 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 10:14:16.874 * +slave slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 10:14:18.853 * +sentinel sentinel 1e6cad9f7170f19eedc314edee00f4c954c4518e 192.168.43.72 26379 @ mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 10:14:18.877 * +sentinel sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.70 6379
[root@redis02 src]#
redis03上:
[root@redis03 src]# cat /var/log/redis-sentinel.log
16016:X 01 Sep 2020 10:14:16.828 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16016:X 01 Sep 2020 10:14:16.828 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=16016, just started
16016:X 01 Sep 2020 10:14:16.828 # Configuration loaded
16017:X 01 Sep 2020 10:14:16.834 * Increased maximum number of open files to 10032 (it was originally set to 1024).
16017:X 01 Sep 2020 10:14:16.835 * Running mode=sentinel, port=26379.
16017:X 01 Sep 2020 10:14:16.835 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
16017:X 01 Sep 2020 10:14:16.843 # Sentinel ID is 1e6cad9f7170f19eedc314edee00f4c954c4518e
16017:X 01 Sep 2020 10:14:16.843 # +monitor master mymaster 192.168.43.70 6379 quorum 2
16017:X 01 Sep 2020 10:14:16.849 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 10:14:16.854 * +slave slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 10:14:18.844 * +sentinel sentinel 4d7f54e8c107073be0a52c40fb06255645da67e0 192.168.43.71 26379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 10:14:18.858 * +sentinel sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.70 6379
[root@redis03 src]#
四、sentinel的高可用测试
说明:
哨兵作为对redis实例的监控,通过选举算法保证哨兵的鲁棒性和高可用,所以哨兵至少要部署3台,符合半数原则,
需要5或者7,超过一半,不包含一半存活的时候,才能够选举出leader,才能进行主从的切换功能。
redis服务,至少需要存活一台,才能保证服务正常运行sentinel选择新master的原则是最近可用且数据最新且优先级最高且活跃最久!
(一)测试redis-server高可用性
1.分析当前的拓扑结构
[root@redis01 src]# ./redis-cli -h 192.168.43.70 -p 6379 -a test.123 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.43.72,port=6379,state=online,offset=852567,lag=0
slave1:ip=192.168.43.71,port=6379,state=online,offset=852426,lag=1
master_replid:e94b07c81145e92a9a172b30f67025f5ecbbf6e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:852567
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:852567
[root@redis01 src]#
可以观察知道:Master -> 192.168.43.70 | Slave -> 192.168.43.71 192.168.43.72
2.模拟故障,现在关闭Master,测试一下Master的转移情况
[root@redis01 src]# ps -ef | grep redis
root 24152 1 0 10:12 ? 00:00:22 ./redis-server 192.168.43.70:6379
root 24164 1 0 10:14 ? 00:00:26 ./redis-sentinel 192.168.43.70:26379 [sentinel]
root 24257 1238 0 11:25 pts/0 00:00:00 grep --color=auto redis
[root@redis01 src]# kill -9 24152
[root@redis01 src]# ps -ef | grep redis
root 24164 1 0 10:14 ? 00:00:26 ./redis-sentinel 192.168.43.70:26379 [sentinel]
root 24259 1238 0 11:26 pts/0 00:00:00 grep --color=auto redis
[root@redis01 src]#
3.查看Master信息
[root@redis02 src]# ./redis-cli -h 192.168.43.71 -p 6379 -a test.123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.43.71:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.43.72,port=6379,state=online,offset=947972,lag=1
master_replid:205f6c06b9ef52837fda1a83d0496887be1a2522
master_replid2:e94b07c81145e92a9a172b30f67025f5ecbbf6e9
master_repl_offset:947972
second_repl_offset:897700
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:947972
192.168.43.71:6379>
可以观察得知:192.168.43.71已经被切换为MAster角色
4.观察日志情况
192.168.43.71上:
15995:X 01 Sep 2020 11:26:03.004 # +new-epoch 1
15995:X 01 Sep 2020 11:26:03.004 # +try-failover master mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 11:26:03.007 # +vote-for-leader 4d7f54e8c107073be0a52c40fb06255645da67e0 1
15995:X 01 Sep 2020 11:26:03.010 # 1e6cad9f7170f19eedc314edee00f4c954c4518e voted for b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 1
15995:X 01 Sep 2020 11:26:03.011 # b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 voted for b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 1
15995:X 01 Sep 2020 11:26:04.121 # +config-update-from sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 11:26:04.121 # +switch-master mymaster 192.168.43.70 6379 192.168.43.71 6379
15995:X 01 Sep 2020 11:26:04.122 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.71 6379
15995:X 01 Sep 2020 11:26:04.122 * +slave slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
15995:X 01 Sep 2020 11:26:09.123 # +sdown slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
192.168.43.72上:
16017:X 01 Sep 2020 11:26:02.853 # +sdown master mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 11:26:03.020 # +new-epoch 1
16017:X 01 Sep 2020 11:26:03.022 # +vote-for-leader b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 1
16017:X 01 Sep 2020 11:26:03.965 # +odown master mymaster 192.168.43.70 6379 #quorum 3/2
16017:X 01 Sep 2020 11:26:03.965 # Next failover delay: I will not start a failover before Tue Sep 1 11:26:33 2020
16017:X 01 Sep 2020 11:26:04.134 # +config-update-from sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 11:26:04.134 # +switch-master mymaster 192.168.43.70 6379 192.168.43.71 6379
16017:X 01 Sep 2020 11:26:04.135 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.71 6379
16017:X 01 Sep 2020 11:26:04.135 * +slave slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
16017:X 01 Sep 2020 11:26:09.192 # +sdown slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
(二)测试redis-sentinel高可用
1.分析当前的拓扑结构
[root@redis02 src]# ./redis-cli -h 192.168.43.70 -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.43.71:6379,slaves=2,sentinels=3
[root@redis02 src]#
观察分析:redis-sentinel节点:192.168.43.70 192.168.43.71 192.168.43.72
2.故障模拟,关闭redis01上的redis-sentinel
[root@redis01 src]# ps -ef | grep redis-sentinel
root 24164 1 0 10:14 ? 00:00:31 ./redis-sentinel 192.168.43.70:26379 [sentinel]
root 24275 1238 0 11:38 pts/0 00:00:00 grep --color=auto redis-sentinel
[root@redis01 src]# kill -9 24164
[root@redis01 src]# ps -ef | grep redis-sentinel
root 24277 1238 0 11:38 pts/0 00:00:00 grep --color=auto redis-sentinel
[root@redis01 src]#
3.观察日志
[root@redis02 src]# tail -f /var/log/redis-sentinel.log
15995:X 01 Sep 2020 11:38:45.681 # +sdown sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.71 6379
[root@redis03 src]# tail -f /var/log/redis-sentinel.log
15995:X 01 Sep 2020 11:38:45.681 # +sdown sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.71 6379
4.继续关闭redis02上的redis-server(此时为MASTER)测试MASTER切换情况
[root@redis02 src]# ps -ef | grep redis-server
root 15983 1 0 10:12 ? 00:00:28 ./redis-server 192.168.43.71:6379
[root@redis02 src]# kill -9 15983
[root@redis02 src]# ps -ef | grep redis-server
root 16097 16074 0 11:45 pts/1 00:00:00 grep --color=auto redis-server
[root@redis02 src]#
[root@redis02 src]# tail -f /var/log/redis-sentinel.log
15995:X 01 Sep 2020 11:38:45.681 # +sdown sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.71 6379
15995:X 01 Sep 2020 11:45:20.260 # +sdown master mymaster 192.168.43.71 6379
15995:X 01 Sep 2020 11:45:20.375 # +new-epoch 2
15995:X 01 Sep 2020 11:45:20.377 # +vote-for-leader 1e6cad9f7170f19eedc314edee00f4c954c4518e 2
15995:X 01 Sep 2020 11:45:21.403 # +odown master mymaster 192.168.43.71 6379 #quorum 2/2
15995:X 01 Sep 2020 11:45:21.404 # Next failover delay: I will not start a failover before Tue Sep 1 11:45:50 2020
15995:X 01 Sep 2020 11:45:21.464 # +config-update-from sentinel 1e6cad9f7170f19eedc314edee00f4c954c4518e 192.168.43.72 26379 @ mymaster 192.168.43.71 6379
15995:X 01 Sep 2020 11:45:21.464 # +switch-master mymaster 192.168.43.71 6379 192.168.43.72 6379
15995:X 01 Sep 2020 11:45:21.464 * +slave slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:45:21.464 * +slave slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:45:26.534 # +sdown slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.72 6379
[root@redis03 src]# tail -f /var/log/redis-sentinel.log
16017:X 01 Sep 2020 11:26:03.022 # +vote-for-leader b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 1
16017:X 01 Sep 2020 11:26:03.965 # +odown master mymaster 192.168.43.70 6379 #quorum 3/2
16017:X 01 Sep 2020 11:26:03.965 # Next failover delay: I will not start a failover before Tue Sep 1 11:26:33 2020
16017:X 01 Sep 2020 11:26:04.134 # +config-update-from sentinel b5d6f6efc7aac83d98c041c0595cc5b223d2eed9 192.168.43.70 26379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 11:26:04.134 # +switch-master mymaster 192.168.43.70 6379 192.168.43.71 6379
16017:X 01 Sep 2020 11:26:04.135 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.71 6379
16017:X 01 Sep 2020 11:26:04.135 * +slave slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
16017:X 01 Sep 2020 11:26:09.192 # +sdown slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
16017:X 01 Sep 2020 11:33:34.733 # -sdown slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
16017:X 01 Sep 2020 11:33:44.700 * +convert-to-slave slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.71 6379
[root@redis01 src]# ./redis-cli -h 192.168.43.70 -p 6379 -a test.123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.43.70:6379> info replication
# Replication
role:slave
master_host:192.168.43.72
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1132929
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:80729c0ca7747cf09d33cd957c1848c4cbc99b82
master_replid2:205f6c06b9ef52837fda1a83d0496887be1a2522
master_repl_offset:1132929
second_repl_offset:1111265
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:994388
repl_backlog_histlen:138542
192.168.43.70:6379>
可以看出:Master已经转移到redis03上(192.168.43.72)
5.继续关闭redis03(Master)上的redis-server,这样仅剩下redis01上的redis-server存活,我们观察MASTER是否切换?
理清:现在redis-server存活2台 :redis01,redis03
现在redis-sentinel存活2台:redis02,redis03
开始关闭redis03上的redis-server,观察 MASTER切换情况
[root@redis03 ~]# ps -ef | grep redis-server
root 16005 1 0 10:12 ? 00:00:30 ./redis-server 192.168.43.72:6379
root 16100 16080 0 11:52 pts/1 00:00:00 grep --color=auto redis-server
[root@redis03 ~]# kill -9 16005
[root@redis03 ~]# ps -ef | grep redis-server
root 16102 16080 0 11:52 pts/1 00:00:00 grep --color=auto redis-server
[root@redis03 ~]#
注意观察其余2台(redis02,redis03)的sentinel日志:
redis02上的日志:
15995:X 01 Sep 2020 11:52:47.435 # +sdown master mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:47.501 # +odown master mymaster 192.168.43.72 6379 #quorum 2/2
15995:X 01 Sep 2020 11:52:47.501 # +new-epoch 3
15995:X 01 Sep 2020 11:52:47.501 # +try-failover master mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:47.503 # +vote-for-leader 4d7f54e8c107073be0a52c40fb06255645da67e0 3
15995:X 01 Sep 2020 11:52:47.507 # 1e6cad9f7170f19eedc314edee00f4c954c4518e voted for 4d7f54e8c107073be0a52c40fb06255645da67e0 3
15995:X 01 Sep 2020 11:52:47.571 # +elected-leader master mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:47.571 # +failover-state-select-slave master mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:47.630 # +selected-slave slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:47.630 * +failover-state-send-slaveof-noone slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:47.722 * +failover-state-wait-promotion slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:48.256 # +promoted-slave slave 192.168.43.70:6379 192.168.43.70 6379 @ mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:48.257 # +failover-state-reconf-slaves master mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:48.330 # +failover-end master mymaster 192.168.43.72 6379
15995:X 01 Sep 2020 11:52:48.330 # +switch-master mymaster 192.168.43.72 6379 192.168.43.70 6379
15995:X 01 Sep 2020 11:52:48.330 * +slave slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 11:52:48.331 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 11:52:53.416 # +sdown slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.70 6379
15995:X 01 Sep 2020 11:52:53.417 # +sdown slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
redis03上的日志:
16017:X 01 Sep 2020 11:52:47.419 # +sdown master mymaster 192.168.43.72 6379
16017:X 01 Sep 2020 11:52:47.523 # +new-epoch 3
16017:X 01 Sep 2020 11:52:47.525 # +vote-for-leader 4d7f54e8c107073be0a52c40fb06255645da67e0 3
16017:X 01 Sep 2020 11:52:48.352 # +config-update-from sentinel 4d7f54e8c107073be0a52c40fb06255645da67e0 192.168.43.71 26379 @ mymaster 192.168.43.72 6379
16017:X 01 Sep 2020 11:52:48.352 # +switch-master mymaster 192.168.43.72 6379 192.168.43.70 6379
16017:X 01 Sep 2020 11:52:48.353 * +slave slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 11:52:48.353 * +slave slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 11:52:53.425 # +sdown slave 192.168.43.72:6379 192.168.43.72 6379 @ mymaster 192.168.43.70 6379
16017:X 01 Sep 2020 11:52:53.425 # +sdown slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
[root@redis01 src]# ./redis-cli -h 192.168.43.70 -p 6379 -a test.123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.43.70:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:64b82fdf94bf58a8411959bc526224eef56765fd
master_replid2:80729c0ca7747cf09d33cd957c1848c4cbc99b82
master_repl_offset:1188066
second_repl_offset:1173380
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:994388
repl_backlog_histlen:193679
192.168.43.70:6379>
现在的情况是:3台redis-server仅存活redis01这台,并且在这种情况下成功转化为master角色
6.我们开启全部的redis-server,关闭redis02的sentinel,这样只存活redis03的sentinel,我们再关闭redis01的redis-server,观察分析是否会进行MASTER切换呢?
理论上是不能,下面我们来测试!
1)开启全部的redis-server
[root@redis01 src]# ps -ef | grep redis
root 24264 1 0 11:33 ? 00:00:07 ./redis-server 192.168.43.70:6379
root 24307 1238 0 12:03 pts/0 00:00:00 grep --color=auto redis
[root@redis01 src]#
[root@redis02 src]# ps -ef | grep redis
root 15995 1 0 10:14 ? 00:00:38 ./redis-sentinel 192.168.43.71:26379 [sentinel]
root 16062 1245 0 11:37 pts/0 00:00:00 tail -f /var/log/redis-sentinel.log
root 16106 1 1 11:57 ? 00:00:00 ./redis-server 192.168.43.71:6379
root 16111 16074 0 11:57 pts/1 00:00:00 grep --color=auto redis
[root@redis02 src]#
[root@redis03 src]# ps -ef | grep redis
root 16017 1 0 10:14 ? 00:00:37 ./redis-sentinel 192.168.43.72:26379 [sentinel]
root 16067 1263 0 11:38 pts/0 00:00:00 tail -f /var/log/redis-sentinel.log
root 16104 1 0 11:58 ? 00:00:00 ./redis-server 192.168.43.72:6379
root 16109 16080 0 11:58 pts/1 00:00:00 grep --color=auto redis
2)关闭redis02的sentinel
[root@redis02 src]# kill -9 15995
[root@redis02 src]# ps -ef | grep redis
root 16062 1245 0 11:37 pts/0 00:00:00 tail -f /var/log/redis-sentinel.log
root 16106 1 0 11:57 ? 00:00:01 ./redis-server 192.168.43.71:6379
root 16128 16074 0 12:04 pts/1 00:00:00 grep --color=auto redis
[root@redis02 src]#
3)观察日志
15995:X 01 Sep 2020 11:57:39.517 # -sdown slave 192.168.43.71:6379 192.168.43.71 6379 @ mymaster 192.168.43.70 6379
4)关闭redis01的redis-server
[root@redis01 src]# kill -9 24264
[root@redis01 src]# ps -ef | grep redis
root 24312 1238 0 12:05 pts/0 00:00:00 grep --color=auto redis
[root@redis01 src]#
5)我们测试redis02与redis03是否进行选主?
[root@redis02 src]# ./redis-cli -h 192.168.43.71 -p 6379 -a test.123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.43.71:6379> info replication
# Replication
role:slave
master_host:192.168.43.70
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1273046
master_link_down_since_seconds:97
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:64b82fdf94bf58a8411959bc526224eef56765fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1273046
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1215421
repl_backlog_histlen:57626
192.168.43.71:6379>
[root@redis02 src]# ./redis-cli -h 192.168.43.72 -p 6379 -a test.123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.43.72:6379> info replication
# Replication
role:slave
master_host:192.168.43.70
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1273046
master_link_down_since_seconds:117
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:64b82fdf94bf58a8411959bc526224eef56765fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1273046
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1219998
repl_backlog_histlen:53049
192.168.43.72:6379>
可以看到:redis01的redis-server已经挂掉,但是redis01仍然是Master,没有进行选主,所以,在仅存一台sentinel的情况下是不能进行Master的切换的。
参阅:https://www.cnblogs.com/fly-piglet/p/9836314.html