Redis系统学习之哨兵模式
Redis哨兵模式(来自小姐姐的面试题72)
- 自动选举老大的模式
- 哨兵模式:sentinel,哨兵是redis中非常重要的组件
- 集群控制:负责监控redis的master和slave进程是否正常工作
- 消息通知:某个redis实例故障,哨兵负责发送消息作为报警通知给管理员
- 故障转移:如果master node挂掉,自动转移到slave node上
- 配置中心:如果故障转移发生,通知客户端新的master地址。
哨兵用于实现redis集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作
- 故障转移时,判断一个master是否宕机,需要大部分哨兵同意才行,涉及到分布式选举
- 即使部分哨兵节点挂掉,哨兵集群只要还剩一个就还能正常工作
- 哨兵通常需要3个实例,来保证自己的健壮性
- 哨兵 + redis主从的部署结构,是不保证数据零丢失的,只保证redis集群的高可用性
- 对于哨兵 + redis主从这种复杂的部署结构,尽量在测试环境和生产环境进行充足的测试和演练
- 这里的哨兵有两个作用
- 通过发送命令,让redis服务器返回监控其运行状态,包括主服务器和从服务器
- 当哨兵检测到Master宕机,会自动将Slave切换成Master,然后通过发布订阅模式通知其他 从服务器,修改配置文件,让他们切换主机
- 然而一个哨兵进程,对Redis服务器进行监控,可能会出现问题,为此我们可以使用多个哨兵进行监控,各个哨兵之间还会进行监控,这就形成了多哨兵模式
- 假设主服务器宕机,哨兵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宕机,也就是关闭
等待一会看看哨兵的控制台
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
master已经切换成为81
C:查看81
已经提升成为master,并且有一个子节点80
A:重新启动79
默认为主节点,没有从节点,等待一会等哨兵扫描到
将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:再次查看
切换成功,单哨兵 完成
哨兵配置(多哨兵)
关闭刚才的单哨兵控制台
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
本文属于作者原创,未经允许,禁止转发