redis入门(7):redis哨兵机制试验

试验环境:

参照:

一、redis拓扑图

说明:

二、准备配置文件

在redis的bin目录下新建6个配置文件redis-6500.conf、redis-6501.conf、redis-6502.conf、sentinel-5000.conf、sentinel-5001.conf、sentinel-5002.conf

redis-6500.conf:

port 6500
daemonize yes
pidfile "/var/run/redis_6500.pid"
logfile "/usr/local/redis/bin/redis-6500.log"
dir "/usr/local/redis/bin"
dbfilename "dump-6500.rdb"
requirepass "123456"

redis-6501.conf:

port 6501
daemonize yes
pidfile "/var/run/redis_6501.pid"
logfile "/usr/local/redis/bin/redis-6501.log"
dir "/usr/local/redis/bin"
dbfilename "dump-6501.rdb"
requirepass "123456"

slaveof 127.0.0.1 6500
masterauth 123456
slave-read-only yes

redis-6502.conf:

port 6502
daemonize yes
pidfile "/var/run/redis_6502.pid"
logfile "/usr/local/redis/bin/redis-6502.log"
dir "/usr/local/redis/bin"
dbfilename "dump-6502.rdb"
requirepass "123456"

slaveof 127.0.0.1 6500
masterauth 123456
slave-read-only yes

sentinel-5000.conf:

port 5000
daemonize yes
pidfile "/var/run/sentinel_5000.pid"
logfile "/usr/local/redis/bin/sentinel-5000.log"

sentinel monitor mymaster 127.0.0.1 6500 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 300000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel-5001.conf:

port 5001
daemonize yes
pidfile "/var/run/sentinel_5001.pid"
logfile "/usr/local/redis/bin/sentinel-5001.log"

sentinel monitor mymaster 127.0.0.1 6500 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 300000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel-5002.conf:

port 5002
daemonize yes
pidfile "/var/run/sentinel_5002.pid"
logfile "/usr/local/redis/bin/sentinel-5002.log"

sentinel monitor mymaster 127.0.0.1 6500 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 300000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

解释上面关于哨兵的配置:

  1. sentinel monitor mymaster 127.0.0.1 6500 2 : 哨兵最开始只需要监控主节点(127.0.0.1 6500)即可,其他的从节点和哨兵会自动感知;当存在两个sentinel不通的时候认为客观下线(真的挂了),其中mymaster是自定义的主节点的名称
  2. sentinel failover-timeout mymaster 180000 :执行任务失败时间,用在多个地方
  3. sentinel down-after-milliseconds mymaster 300000 :当300秒还不通的就认为主观下线了(只是自己认为下线)
  4. sentinel parallel-syncs mymaster 1 :当主节点变化时允许从主节点同步数据的并发节点数

此时:redis的bin目录结构应该为:
在这里插入图片描述

三、启动redis服务和redis哨兵

3.1 启动redis服务(先主后从)

[root@localhost bin]# pwd
/usr/local/redis/bin
[root@localhost bin]# ./redis-server ./redis-6500.conf 
[root@localhost bin]# ./redis-server ./redis-6501.conf 
[root@localhost bin]# ./redis-server ./redis-6502.conf

3.2 验证redis服务

  • 主节点:6500
[root@localhost bin]# ./redis-cli -p 6500 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6500> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6501,state=online,offset=42,lag=0
slave1:ip=127.0.0.1,port=6502,state=online,offset=42,lag=0
master_replid:f9b51050b9aedd5a0fa0272c17c986d21f2f16d6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> set name xiaoming
OK
127.0.0.1:6500> get name
"xiaoming"

可以看到,主从已经启动成功, info replication显示当前节点是master并且有两个从节点。这里插入了数据:name=xiaoming

  • 从节点:6501
[root@localhost bin]# ./redis-cli -p 6501 -a 123456
127.0.0.1:6501> keys *
1) "name"
127.0.0.1:6501> get name
"xiaoming"
127.0.0.1:6501> set name 123
(error) READONLY You can't write against a read only replica.

可以看到,从节点可以获取name数据但是不能设置值

四、启动redis哨兵

4.1 分别启动哨兵5000、哨兵5001、哨兵5002即可

[root@localhost bin]# ./redis-sentinel ./sentinel-5000.conf 
[root@localhost bin]# ./redis-sentinel ./sentinel-5001.conf 
[root@localhost bin]# ./redis-sentinel ./sentinel-5002.conf 

4.2 启动后查看日志(哨兵5000):

8069:X 24 Aug 2019 09:29:51.368 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8069:X 24 Aug 2019 09:29:51.368 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=8069, just started
8069:X 24 Aug 2019 09:29:51.368 # Configuration loaded
8070:X 24 Aug 2019 09:29:51.374 * Increased maximum number of open files to 10032 (it was originally set to 1024).
8070:X 24 Aug 2019 09:29:51.376 * Running mode=sentinel, port=5000.
8070:X 24 Aug 2019 09:29:51.377 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8070:X 24 Aug 2019 09:29:51.382 # Sentinel ID is 899463938c7f99a0969a581a756f31338aaf054a
8070:X 24 Aug 2019 09:29:51.382 # +monitor master mymaster 127.0.0.1 6500 quorum 2
8070:X 24 Aug 2019 09:29:51.384 * +slave slave 127.0.0.1:6501 127.0.0.1 6501 @ mymaster 127.0.0.1 6500
8070:X 24 Aug 2019 09:29:51.411 * +slave slave 127.0.0.1:6502 127.0.0.1 6502 @ mymaster 127.0.0.1 6500
8070:X 24 Aug 2019 09:29:57.308 * +sentinel sentinel bb4a185984a02288884e7fb93424d1dc0587f302 127.0.0.1 5001 @ mymaster 127.0.0.1 6500
8070:X 24 Aug 2019 09:30:00.845 * +sentinel sentinel 4b9ebf491b284df29af7f6d9b320067f6d4cd4ad 127.0.0.1 5002 @ mymaster 127.0.0.1 6500

可以看到日志显示哨兵监测到的主节点6500,以及感知到的从节点6501和6502,还有后续监测到新加入的哨兵5001和5002

4.3 哨兵常用命令

4.3.1 获取redis主节点地址:sentinel get-master-addr-by-name mymaster

[root@localhost bin]# ./redis-cli -p 5000
127.0.0.1:5000> sentinel get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6500"

可以看到,能查询到redis主节点的ip和端口号

4.3.2 查看redis主节点描述:sentinel master mymaster

127.0.0.1:5000> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "127.0.0.1"
 5) "port"
 6) "6500"
 7) "runid"
 8) "e5436e8269174dc647bac161f12351901d914366"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "146"
19) "last-ping-reply"
20) "146"
21) "down-after-milliseconds"
22) "300000"
23) "info-refresh"
24) "4884"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "547479"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"

4.3.3 其他命令

  • sentinel slaves mymaster:显示从节点信息
  • sentinel sentinels mymaster:显示哨兵信息

五、测试哨兵功能

5.1 杀死redis主节点:6500

[root@localhost bin]# ps -aux|grep redis
root       8215  0.3  0.2 145352  2352 ?        Ssl  10:08   0:01 ./redis-server *:6500
root       8220  0.2  0.2 145288  2336 ?        Ssl  10:08   0:01 ./redis-server *:6501
root       8226  0.2  0.2 145272  2340 ?        Ssl  10:08   0:01 ./redis-server *:6502
root       8238  0.5  0.2 144144  2308 ?        Ssl  10:11   0:01 ./redis-sentinel *:5000 [sentinel]
root       8243  0.5  0.2 144144  2296 ?        Ssl  10:11   0:01 ./redis-sentinel *:5001 [sentinel]
root       8248  0.5  0.2 144140  2280 ?        Ssl  10:11   0:01 ./redis-sentinel *:5002 [sentinel]
root       8255  0.0  0.0 112724   992 pts/0    R+   10:14   0:00 grep --color=auto redis
[root@localhost bin]# kill -9 8215

注意:此处等待大约5分钟(300秒)(可修改上面哨兵的配置参数达到短时间内故障恢复的目的)

5.2 经过上面等待后,重新获取redis主节点地址

[root@localhost bin]# ./redis-cli -p 5000 sentinel get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6501"

可以看到:redis的主节点已从6500自动切换到了6501

5.2.1 观察哨兵的日志文件:5000

在这里插入图片描述

可以从上面的日志看出redis主节点6500下线、6501上线

5.2.2 连接到redis新主节点6501并设置值

[root@localhost bin]# ./redis-cli -p 6501 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6501> get name
"xiaoming"
127.0.0.1:6501> set name 123
OK
127.0.0.1:6501> get name
"123"

可以看到,设置name值成功,因为现在是主节点了,所以也自动去掉了只读。

5.2.3 连接到redis从节点6502测试功能

[root@localhost bin]# ./redis-cli -p 6502 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6502> get name
"123"
127.0.0.1:6502> set name 456
(error) READONLY You can't write against a read only replica.

可以看到,从节点6502能获取到改变后的name值,但是仍然不能修改name值,因为6502仍然是个从节点。

5.2.3 现在重新启动redis节点6500

先修改redis-6500.conf:

port 6500
daemonize yes
pidfile "/var/run/redis_6500.pid"
logfile "/usr/local/redis/bin/redis-6500.log"
dir "/usr/local/redis/bin"
dbfilename "dump-6500.rdb"
requirepass "123456"

slaveof 127.0.0.1 6501
masterauth 123456
slave-read-only yes

启动redis6500:./redis-server redis-6500.conf
查看redis6500日志:
在这里插入图片描述

通过上面的日志可以看到,redis6500已经变成了redis6501的从节点

5.2.4 通过哨兵5000查看主从节点情况

[root@localhost bin]# ./redis-cli -p 5000 sentinel slaves mymaster
1)  1) "name"
    2) "127.0.0.1:6502"
    3) "ip"
    4) "127.0.0.1"
    5) "port"
    6) "6502"
    7) "runid"
    8) "cd45c946215d5fbfd4390c6c573a57421434d096"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "262"
   19) "last-ping-reply"
   20) "262"
   21) "down-after-milliseconds"
   22) "300000"
   23) "info-refresh"
   24) "9369"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "1968122"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "127.0.0.1"
   35) "master-port"
   36) "6501"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "429063"
2)  1) "name"
    2) "127.0.0.1:6500"
    3) "ip"
    4) "127.0.0.1"
    5) "port"
    6) "6500"
    7) "runid"
    8) "e24fe46b487303fef916d78eec5905ba77770c83"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "262"
   19) "last-ping-reply"
   20) "262"
   21) "down-after-milliseconds"
   22) "300000"
   23) "info-refresh"
   24) "59"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "1028119"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "127.0.0.1"
   35) "master-port"
   36) "6501"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "431043"

可以查询到6500确实变成了6501的从节点

5.2.5 观察redis6500上的数据情况

首先在redis6501(主节点)上更新name数据:

[root@localhost bin]# ./redis-cli -p 6501 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6501> get name
"123"
127.0.0.1:6501> set name 456
OK

在redis6500(从节点)上查看数据:

[root@localhost bin]# ./redis-cli -p 6500 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6500> get name
"456"
127.0.0.1:6500> set name 789
(error) READONLY You can't write against a read only replica.

可以看到从节点6500上的数据同步更新了,并且不能写入数据,因为从节点只读。


试验完毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值