Redis系统学习之哨兵模式

Redis哨兵模式(来自小姐姐的面试题72)

  • 自动选举老大的模式
  • 哨兵模式:sentinel,哨兵是redis中非常重要的组件
    • 集群控制:负责监控redis的master和slave进程是否正常工作
    • 消息通知:某个redis实例故障,哨兵负责发送消息作为报警通知给管理员
    • 故障转移:如果master node挂掉,自动转移到slave node上
    • 配置中心:如果故障转移发生,通知客户端新的master地址。

哨兵用于实现redis集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作

    • 故障转移时,判断一个master是否宕机,需要大部分哨兵同意才行,涉及到分布式选举
    • 即使部分哨兵节点挂掉,哨兵集群只要还剩一个就还能正常工作
    • 哨兵通常需要3个实例,来保证自己的健壮性
    • 哨兵 + redis主从的部署结构,是不保证数据零丢失的,只保证redis集群的高可用性
    • 对于哨兵 + redis主从这种复杂的部署结构,尽量在测试环境和生产环境进行充足的测试和演练

image.png

  • 这里的哨兵有两个作用
    • 通过发送命令,让redis服务器返回监控其运行状态,包括主服务器和从服务器
    • 当哨兵检测到Master宕机,会自动将Slave切换成Master,然后通过发布订阅模式通知其他 从服务器,修改配置文件,让他们切换主机
  • 然而一个哨兵进程,对Redis服务器进行监控,可能会出现问题,为此我们可以使用多个哨兵进行监控,各个哨兵之间还会进行监控,这就形成了多哨兵模式
  • image.png
  • 假设主服务器宕机,哨兵1先检查到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线,当后面的哨兵也检测到主服务器不可用,并数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作,切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称之为客观下线
  • 其实主观就是自己认为,客观就是大多数人认为

环境配置

参考主从配置先搭建一主二从模式

哨兵配置(单哨兵)

还是采用A B C D四个窗口,来配置

D:创建哨兵配置文件,并启动哨兵进程

[root@localhost bin]# cd redisConfig/ 进入配置文件夹
[root@localhost redisConfig]# vi sentinel.conf 创建名字为sentinel.conf的文件
文件内容为:
sentinel monitor mymaster 127.0.0.1 6379 1
解释:sentinel monitor 主节点名字[随便起的] 主节点IP 主节点端口 哨兵投票的票数
哨兵投票宕机是否确认死亡后决定故障转移的票数
[root@localhost redisConfig]# ll
总用量 260
-rw-r--r--. 1 root root 63102 4月  24 19:39 redis-6379.conf
-rw-r--r--. 1 root root 63102 4月  24 19:54 redis-6380.conf
-rw-r--r--. 1 root root 63102 4月  24 19:56 redis-6381.conf
-rw-r--r--. 1 root root 63089 4月  17 22:02 redis.conf
-rw-r--r--. 1 root root    43 4月  24 23:17 sentinel.conf
[root@localhost redisConfig]#

启动:
[root@localhost bin]# redis-sentinel redisConfig/sentinel.conf 启动命令
9625:X 24 Apr 2021 23:25:06.639 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
9625:X 24 Apr 2021 23:25:06.639 # Redis version=5.0.12, bits=64, commit=00000000, modified=0, pid=9625, just started
9625:X 24 Apr 2021 23:25:06.639 # Configuration loaded
9625:X 24 Apr 2021 23:25:06.640 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 5.0.12 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode 运行一个哨兵
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379 端口号
 |    `-._   `._    /     _.-'    |     PID: 9625 pid
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
`-._        _.-'
`-.__.-'
9625:X 24 Apr 2021 23:25:06.641 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
9625:X 24 Apr 2021 23:25:06.643 # Sentinel ID is bcedd6d917bb5ac16196b743632b8b7aa30c90ba
9625:X 24 Apr 2021 23:25:06.643 # +monitor master mymaster 127.0.0.1 6379 quorum 1 主机为6379
9625:X 24 Apr 2021 23:25:06.644 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379  丛机为6380
9625:X 24 Apr 2021 23:25:06.645 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 从机为 6381

测试,A将6379宕机,也就是关闭

image.png

等待一会看看哨兵的控制台

master宕机了
9625:X 24 Apr 2021 23:28:17.467 # +sdown master mymaster 127.0.0.1 6379
哨兵1票通过
9625:X 24 Apr 2021 23:28:17.467 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
9625:X 24 Apr 2021 23:28:17.467 # +new-epoch 1
开始进行故障转移
9625:X 24 Apr 2021 23:28:17.467 # +try-failover master mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:17.476 # +vote-for-leader bcedd6d917bb5ac16196b743632b8b7aa30c90ba 1
9625:X 24 Apr 2021 23:28:17.476 # +elected-leader master mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:17.476 # +failover-state-select-slave master mymaster 127.0.0.1 6379
选择81为提升Master的节点
9625:X 24 Apr 2021 23:28:17.529 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
开始执行故障转移 81 执行 slaveof no one 提升为master
9625:X 24 Apr 2021 23:28:17.529 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:17.584 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:18.154 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:18.154 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:18.202 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:19.170 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:19.170 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
9625:X 24 Apr 2021 23:28:19.232 # +failover-end master mymaster 127.0.0.1 6379
切换master 从79->81
9625:X 24 Apr 2021 23:28:19.232 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381
将80 的master 设置 为81
9625:X 24 Apr 2021 23:28:19.232 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
将79 的master 设置为81
9625:X 24 Apr 2021 23:28:19.232 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
9625:X 24 Apr 2021 23:28:49.237 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

控制台输出完成后查看80 和 81

B:查看80

image.png

master已经切换成为81

C:查看81

image.png

已经提升成为master,并且有一个子节点80

A:重新启动79

image.png

默认为主节点,没有从节点,等待一会等哨兵扫描到

将6379 转化为slave,并将其master设置为 6381
9687:X 24 Apr 2021 23:42:32.157 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

A:再次查看

image.png

切换成功,单哨兵 完成

哨兵配置(多哨兵)

关闭刚才的单哨兵控制台

D:ctrl+c

网址:https://www.cnblogs.com/joeymary/p/11492791.html

多哨兵就不写了,原理和单哨兵一样,就是多人选举决定是否宕机和slave升级票选,下面是配置参数

#sentinel 配置

#端口
port 26379

#目录
dir /tmp

#日志文件
logfile /var/log/redis/redis-sentinel.log

#是否在后台执行,yes:后台运行;no:不是后台运行
daemonize yes

#是否开启保护模式,默认开启。开启后,只能根据配置的bind地址和密码进行访问。
protected-mode no

#主节点信息,格式:sentinel <master-name> <ip> <redis-port> <quorum>;
#<master-name> 自定义主节点名称;
#<ip> <redis-port> 主节点的ip和端口;
#<quorum> 多少个主节点检测到主节点有问题就进行故障转移
sentinel monitor mymaster 127.0.0.1 6379 2

#sentinel与master的心跳时间(毫秒),默认30秒。
sentinel down-after-milliseconds mymaster 30000

#故障转移时,最多可以有多少个slave同时对新的master进行数据同步,该值越小,完成故障转移的时间越长,但可用slave数量越多,该值越大,越多slave因为replication而不可用。建议设置为1。
sentinel parallel-syncs mymaster 1

#故障转移超时时间(毫秒),默认180秒。
sentinel failover-timeout mymaster 180000

#master和slaves密码。
#sentinel auth-pass mymaster password

#当sentinel有警告级别的事件发生时执行(也有的资料说failover时触发)的脚本。
#sentinel notification-script <master-name> <script-path>

#故障转移之后执行的脚本,并传递7个参数:<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>。
#<master-name> 表示 master名字
#<role> 表示的是 每个redis实力的角色,如leader、observer
#<state> 表示状态
#<from-ip> 原来的redis master
#<from-port> 
#<to-ip> 故障迁移后的redis master
#<to-port>
#sentinel client-reconfig-script <master-name> <script-path>

作者:彼岸舞

时间:2021\05\05

内容关于:Redis

本文属于作者原创,未经允许,禁止转发

posted @ 2021-05-05 11:07  彼岸舞  阅读(110)  评论(0编辑  收藏  举报