试验环境:
- centos7.6x64位,CentOS-7-x86_64-Minimal-1810.iso
百度网盘下载地址:https://pan.baidu.com/s/1ckjQS_DGuI-7GGvmvhLNKQ 提取码: 6gfc
linux的安装参照:centos7.6最小化安装 - redis-5.0.5.tar.gz
官网下载地址:http://download.redis.io/releases/redis-5.0.5.tar.gz
百度网盘下载地址:https://pan.baidu.com/s/1ipnB043h5Tvk7cYGKxSr8g 提取码: bdkh
参照:
一、redis拓扑图
说明:
- 试验中采用一个linux虚拟机,运行6个redis进程,其中三个哨兵、三个数据
- 一个linux中运行多个redis进程很简单,参照试验:redis入门(5):单个linux上运行多个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
解释上面关于哨兵的配置:
- sentinel monitor mymaster 127.0.0.1 6500 2 : 哨兵最开始只需要监控主节点(127.0.0.1 6500)即可,其他的从节点和哨兵会自动感知;当存在两个sentinel不通的时候认为客观下线(真的挂了),其中mymaster是自定义的主节点的名称
- sentinel failover-timeout mymaster 180000 :执行任务失败时间,用在多个地方
- sentinel down-after-milliseconds mymaster 300000 :当300秒还不通的就认为主观下线了(只是自己认为下线)
- 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上的数据同步更新了,并且不能写入数据,因为从节点只读。
试验完毕!