1. 引子
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
2. 哨兵
当主节点发生故障时,Redis Sentinel能够自动完成故障发现和故障转移,并通知应用方,实现真正的高可用。示例过程如下:
从上图三个过程可以看出Redis Sentinel具备下面几个功能:
监控:Redis Sentinel节点定期见检测Redis主从数据节点和其他Sentinel节点
通知:Redis Sentinel节点会将故障转移的结果通知给应用方
主节点故障转移:从节点晋升为主节点并维护后续的主从关系
配置提供者:Redis Sentinel结构中客户端连接的是Sentinel节点集合,从中获取主节点信息
3. 安装与部署
3.1 部署主从复制节点
-
首先部署一个主节点,端口号为6379,使用配置文件如下:
port 6379 daemonize yes logfile "/Users/yubuyun/tools/redis-4.0.8/6379.log" dbfilename "dump-6379.rdb" dir "/Users/yubuyun/tools/redis-4.0.8/data/"
然后启动:
./redis-server ../redis-6379.conf
-
接着启动两个从节点,端口号分别为6380,6381,配置文件分别为:
port 6380 daemonize yes logfile "/Users/yubuyun/tools/redis-4.0.8/6380.log" dbfilename "dump-6380.rdb" dir "/Users/yubuyun/tools/redis-4.0.8/data/" slaveof 127.0.0.1 6379
port 6381 daemonize yes logfile "/Users/yubuyun/tools/redis-4.0.8/6381.log" dbfilename "dump-6381.rdb" dir "/Users/yubuyun/tools/redis-4.0.8/data/" slaveof 127.0.0.1 6379
其中slaveof属性表示他们是6379的从节点。
分别启动这两个从节点:
./redis-server ../redis-6380.conf ./redis-server ../redis-6381.conf
主节点视角查看主从关系
启动一个客户端并查看6379节点相关信息:
./redis-cli -h 127.0.0.1 -p 6379 info replication
打印结果如下:
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=406,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=406,lag=1
master_replid:7b693bd5ca019687c7a3e97d5bd435bb1b5a353d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:406
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:406
看出它有两个从节点,端口号是为6380和6381。
-
从节点视角查看主从关系
启动一个客户端并查看6380节点的相关信息:
./redis-cli -h 127.0.0.1 -p 6380 info replication
打印如下:
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:840
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:7b693bd5ca019687c7a3e97d5bd435bb1b5a353d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:840
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:840
可以看到它的主节点是6379端口。
最终一个主从复制结构就形成了:
3.2 部署sentinel节点
预期想部署三个哨兵节点,先看下第一个哨兵配置如下:
port 26379
daemonize yes
logfile "/Users/yubuyun/tools/redis-4.0.8/26379.log"
dir "/Users/yubuyun/tools/redis-4.0.8/data/"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
其中:
-
sentinel monitor mymaster 127.0.0.1 6379 2
这句配置表示,此哨兵将监控localhost的6379端口,并且判断主节点失败至少要2个sentinel节点同意才行。另外给这个主节点取了个名为mymaster的别名。 - down-after-milliseconds:每个sentinel节点定期发送ping命令来判断redis数据节点和其他节点哨兵节点是否可用,如果超过了down-after-milliseconds指定的时间没有响应,认定其不可用。
- parallel-syncs:该参数的意思是:当主节点故障不可用时,进行故障转移时哨兵节点选举出新的主节点,其他从节点向主节点同时进行复制的个数,如parallel-syncs个数为1,表示一次只能有一个从节点去复制,即轮询,parallel-syncs为3,表示可同时有三个从节点同时进行复制。该值太大的话会给主节点机器的网络和IO造成压力。
- Failover-timeout:故障转移超时时间
另外两个哨兵配置如下:
port 26380
daemonize yes
logfile "/Users/yubuyun/tools/redis-4.0.8/26380.log"
dir "/Users/yubuyun/tools/redis-4.0.8/data/"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
port 26381
daemonize yes
logfile "/Users/yubuyun/tools/redis-4.0.8/26381.log"
dir "/Users/yubuyun/tools/redis-4.0.8/data/"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
写好配置文件后就可以通过下述方法启动三个哨兵了:
./redis-sentinel ../redis-sentinel-26379.conf
./redis-sentinel ../redis-sentinel-26380.conf
./redis-sentinel ../redis-sentinel-26381.conf
如果不指定配置文件启动:./redis-sentinel。在启动的时候使用的安装包中的默认配置文件sentinel.conf。
可执行下面的命令查看第一个哨兵的信息:
./redis-cli -h 127.0.0.1 -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=127.0.0.1:6379,slaves=2,sentinels=3
从打印看出,有一个主节点,两个从节点,总共有3个哨兵等信息。
最终Redis Sentinel就搭建好了。