Redis哨兵模式

拓扑结构介绍:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。