Linux-sentinel实现redis主从高可用
sentinel的工作过程:
sentinel安装在另外的主机上,sentinel主机既能监控又能提供配置功能,向sentinel指明主redis服务器即可(仅监控主服务器),sentinel可以从主服务中获取主从架信息,并分辨从节点,sentinel可以监控当前整个主从服务器架构的工作状态,一旦发现master离线的情况,sentinel会从多个从服务器中选择并提升一个从节点成为主节点,当主节点被从节点取代以后,那么IP地址则发生了,客户所连接之前的主节点IP则不无法连接,此时可以向sentinel发起查询请求,sentinel会告知客户端新的主节点的IP,所以sentinel是redis在主从架构中实现高可用的解决方,sentinel为了误判和单点故障,sentinel也应该组织为集群,sentinel多个节点同时监控redis主从架构,一旦有一个sentinel节点发现redis的主节点不在线时,sentinel会与其他的sentinel节点协商其他的sentinel节点是否也为同样发现redis的主节点不在线的情况,如果sentinel的多个点节点都发现redis的主节点都为离线的情况,那么则判定redis主节点为离线状态,以此方式避免误判,同样也避免了单点故障
sentinel特点:
用于管理多个redis服务实现HA;
监控多个redis服务节点
自动故障转移
sentinel也是一个分布式系统,可以在一个架构中运行多个sentinel进程,多个进程之间使用“流言协议”接收redis主节点是否离线,并使用“投票协议”是否实现故障转移,选择哪一个redis的从服务器成为主服务器
启用sentinel:
redis-sentinel可以理解为运行有着特殊代码的redis,redis自身也可以运行为sentinel,sentinel也依赖配置文件,用于保存sentinel不断收集的状态信息
程序:
redis-sentinel /path/to/file.conf
redis-server /path/to/file.conf --sentinel
运行sentinel的步骤:
(1) 服务器自身初始化(运行redis-server中专用于sentinel功能的代码);
(2) 初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表;
(3) 创建连向master的连接;
专用配置文件:/etc/redis-sentinel.conf
(1) # sentinel monitor <master-name> <ip> <redis-port> <quorum> //此项可以出现多次,可以监控多组redis主从架构,此项用于监控主节点 <master-name> 自定义的主节点名称,<ip> 主节点的IP地址,<redis-port>主节点的端口号,<quorum>主节点对应的quorum法定数量,用于定义sentinel的数量,是一个大于值尽量使用奇数,如果sentinel有3个,则指定为2即可,如果有4个,不能够指定为2,避免导致集群分裂,注意,<master-name>为集群名称,可以自定义,如果同时监控有多组redis集群时,<master-name>不能同样
(2) sentinel down-after-milliseconds <master-name> <milliseconds> //sentinel连接其他节点超时时间,单位为毫秒(默认为30秒)
(3) sentinel parallel-syncs <master-name> <numslaves> //提升主服务器时,允许多少个从服务向新的主服务器发起同步请求
(4) sentinel failover-timeout <master-name> <milliseconds> //故障转移超时时间,在指定时间没能完成则判定为失败,单位为毫秒(默认为180秒)
专用命令:
SENTINEL masters //列出所有监控的主服务器
SENTINEL slaves <master name> //获取指定redis集群的从节点
SENTINEL get-master-addr-by-name <master name> //根据指定master的名称获取其IP
SENTINEL reset //用于重置,包括名称,清除服务器所有运行状态,故障转移、等等
SENTINEL failover <master name> //手动向某一组redis集群发起执行故障转移
启用sentinel:
# vim /etc/redis-sentinel.conf
修改:
# bind 127.0.0.1 192.168.1.1
改为:
bind 0.0.0.0
修改:
sentinel monitor mymaster 127.0.0.1 6379 2
改为:
sentinel monitor mymaster 192.168.1.63 6379 1
# systemctl start redis-sentinel.service
登录redis-sentinel:
# redis-cli -h 192.168.1.63 -p 26379
192.168.1.63: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.1.63:6379,slaves=2,sentinels=1
192.168.1.63:26379> sentinel masters //获取主节点及从节点的信息
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.1.63"
5) "port"
6) "6379"
7) "runid"
8) "824e49626453b61077bf2cfa36c9bb464bbcd595"
9) "flags"
10) "master"
192.168.1.63:26379> sentinel slaves mymaster //获取mymaster集群的从节点信息
测试:
# systemctl stop redis //关闭主服务
192.168.1.63: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.1.63:6381,slaves=2,sentinels=1 //由此可见6381的成为了主
启动主服务:
# systemctl start redis
192.168.1.63: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.1.63:6381,slaves=2,sentinels=1
# redis-cli -h 192.168.1.63 -p 6381
192.168.1.63:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.63,port=6380,state=online,offset=224567,lag=0
slave1:ip=192.168.1.63,port=6379,state=online,offset=224706,lag=0
由以上测试可见,主的故障离线后,sentinel重新选了其 一个从的成为了新的主节点,在原来的主节点重新上线后,仍然不会恢复为主节点,无法实现抢占
注意:
将来客户端应连接sentinel,向sentinel发请求去寻址,并根据sentinel的反馈,进行连接新的redis主节点,这一点需要使用redis专用客户端来实现。redis客户端会根据sentinel返回的新节点IP进行连接