哨兵模式
哨兵模式是一种特殊的模式,首先redis提供了哨兵的命令,哨兵是一个独立的进程,其原理是哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例.
一个哨兵进程对redis进行监控,如果哨兵自己的进程出现问题就麻烦了,所以哨兵模式需要配置多个哨兵,除了都要监控各个redis的进程外,各个哨兵之间也要互相监控,一般哨兵最少配置3个
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会蚂上进行failover过程,仅仅是哨兵1认为主服务器不可用这个现象叫做主观下线,当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时(一般是半数以上),那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作,选举一个从机作为新的主机(多个哨兵投票,获得半数以上票的从机变成主机),切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线
bin/kconfig目录下的sentinel.conf是哨兵的配置文件
// 编辑文件
# sentinel monitor 被监控的redis名称 host port 1
sentinel monitor myRedis 127.0.0.1 6379 1
后面的这个1 它表示至少需要 1 个哨兵节点(即当前执行命令的哨兵自己)认为主节点不可达,才会将主节点标记为 ODOWN(客观下线)由于设置为 1,只要这一个哨兵发现自己连不上 127.0.0.1:6379,它会立刻认为主节点挂了,并触发后续的故障转移(从从节点中选出一个新的主节点)
PS: 如果部署了奇数个哨兵(比如 3 个、5 个),通常设置为 总数的一半以上(向下取整)例如:3 个哨兵 设置为2 5个哨兵 设置为3,这样能避免因单点误判导致的无谓切换。
优点:
1、哨兵集群,基于主从复制模式,所有的主从配置优点 它全有
2、主从可以切换,故障可以转移,系统的可用性就会得到更好的保障
3、哨兵模式就是主从复制的升级,手动到自动更加健壮
缺点:
1、redis不好在线扩容,集群容量一旦达到上限,在线扩容就会很麻烦,(很多东西都写到配置文件写死了,扩容就很麻烦了,要改很多配置文件)
2、实现哨兵模式的配置很麻烦,里面有很多选择
哨兵模式的配置
// 哨兵sentinel运行的端口
port 26379
// 哨兵sentinel的工作目录
dir /tmp
// 哨兵sentinel检控的redis主节点的 ip port
// sentinel monitor:这是哨兵的命令,表示“开始监控一个主节点”
// myRedis:这是给这个被监控的主节点起的别名(自定义名称)。后续的故障转移等操作都会引用这个名字
// 1:这是法定人数(Quorum),也是这条命令中最核心的参数 表示需要多少个哨兵认为主机失联 触发failover
sentinel monitor myRedis 127.0.0.1 6379 2
// 当redis中开启了密码验证的时候 需要配置密码
// sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
// 指定多少毫秒之后,主节点没有应答哨兵 sentinel 此时哨兵主观上认为主节点下线 默认是30s
sentinel down-after-milliseconds mymaster 30000
// 这个配置项指定了在发生failover主备切换时最多可以有多少个salve同时对新的master进行同步,这个值越小完成failover所需要的时间就越长,但是如果数字越大就意味着 越多的slave因为replication而不可用。可以通过设置这个数为1 来保证每次只有一个slave处于不能处理命令请求的状态
// sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
// 故障转移的超时时间,failover-timeout可以用在以下方面:
// 1 同一个sentinel对同一个master两次failover之间的时间间隔
// 2 当一个slave从一个错误的mastr那里同步数据开始计算时间,直到slave被纠正为正确的master那里同步数据时
// 3 当想要取消一个政治进行的failover所需要的时间
// 4 当进行failover时,配置所有slave指向新的master所需的最大时间,不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
// 不配置默认三分钟
sentinel failover-timeout mymaster 180000
// 配置当某一事件发生时所需要执行的shell脚本,可以通过脚本来通知管理员,例如当系统运行不正常的时候发邮件或信息给相关人员
// 脚本运行结果的规则:
// 1 若脚本执行后返回1 那么该脚本稍后会被再次执行,重复次数默认10次
// 2 若脚本执行后返回2 或者比2大的返回值,脚本不会重复执行
// 3 若在执行过程中由于收到系统中断信号被终止了,参照返回1的行为
// 4 一个脚本的最大执行时间为60s,超过这个时间,脚本会被一个SIGKILL信号终止,之后重新执行
// 当sentinel有任何警告级别的事件发生时 就会触发
// sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/niotify.sh
// 客户端重新配置主节点参数脚本
// 当一个主节点由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息、
// 以下参数将会在调用脚本的时候传给脚本
// <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
// 目前<state>总是failover
// <role> 是“laader”或者“observer” 中的一个
// 参数from-ip from-port to-ip to-port是用来和旧的master和新的master通信的,
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh