Redis 哨兵模式

为什么要引入Redis 哨兵机制呢

Redis主从复制中存在问题,第一个问题:当主节点挂了 的 时候,从节点转化 为主节点 必须要人工转化

第二个 问题 :主节点写数据 的压力并没有被分担 当写请求过多,主节点仍承受巨大压力

引入哨兵机制就是为了 解决第一个问题

名词解释

主节点:一个Redis -server进程

从节点:一个Redis-server进程

Redis数据节点:主从节点

哨兵节点:一个Redis-sentinel进程(它与主从节点不同,是Redis的不同进程)用来监测主从节点

哨兵集合:主要是防止哨兵节点挂 所以引入多个哨兵结合组成集合

Redis sentinel架构如下

这些sentinel节点会与主从节点建立长的TCP连接 定时发送心跳包 来监控该节点

1.设计sentinel哨兵 节点集合 去监控 主从节点

2.当有sentinel某一节点 监控到主节点 挂了 它会与其他sentinel节点进行 沟通 查证是否 该主节点是否真正挂掉,防止出现误判的情况

3.发现主节点挂之后,sentinel节点群就会选举出一个leader 这个leader就会从从节点中选择一个作为新的主节点

4.挑选出新的节点后 ,哨兵节点就会控制该节点执行slaveof no one,将其他从节点slave到该节点下

5.哨兵节点就会通知客户端新的主节点是谁,这样客户端后续的操作就针对新的主节点进行操作了

哨兵节点核心功能:

1.监控

2.自动故障转移'

3.通知客户端

注意哨兵节点有一个也是可以的

但会出现两个问题:

1.当哨兵节点挂时,程序 的问题无法保障

2.误判可能性增加 毕竟网络传输容易出现抖动和延迟

哨兵节点最好是奇数个 建议至少是三个

当 曾经的主节点恢复后 会变为从节点留在新主节点下

主从切换的 具体流程

1.主观下线

哨兵节点监测到主节点挂(可能 出现误判此时)

2.客观下线

哨兵节点集合就会投票 判断是否真的挂掉 (票数达到法定票数)

3.哨兵节点集合 推举出一个 leader

由这个leader去负责选一个从节点来顶替主节点

4.leader 从 从节点集合中选出一个主节点

a)优先级

每个Redis节点 都会在配置文件中,有一个优先级的设置,slave-priority 优先级高的从节点 就会胜出

b)offset 同步进度

offset 从节点从主节点 这边同步数据的进度 ,数值越大,说明此从节点的数据与主节点越接近

c)run_id

每个Redis节点启动的时候随机生成的一串数字 此时随便选一个

5.leader就会控制所选出的从节点

执行slaveof no one 成为主节点 ,其他从节点执行slaveof 加入到新主节点下

注意 哨兵集合是先选举出一个leader 而不是先选出一个从节点 从节点的选择是所选出leader的工作

总结

1.哨兵节点不能只有一个,否则哨兵节点挂了也会影响系统可用性

2.哨兵节点最好是奇数个,方便选举出leader 得票更容易超过半数

3.哨兵节点不负责存储数据,仍然是redis主从节点负责存储

4.哨兵+主从复制 解决的问题是"提高可用性",不能解决数据 极端情况下丢失的问题(当主节点挂时 从节点还未来得及数据同步

5.哨兵+主从复制不能提高数据的存储容量,当我们 需要存的数据接近或超过机器的物理内存时,这样的结构就难以胜任了

相关推荐
WmStack5 分钟前
‘秒杀’功能实现
redis
wertyuytrewm19 分钟前
自动化与脚本
jvm·数据库·python
Lyyaoo.21 分钟前
Spring Boot日志
spring boot·缓存·单元测试
Hello.Reader22 分钟前
PySpark DataFrame 快速入门创建、查询、分组、读写、SQL 实战一篇讲透
数据库·sql·spark
无籽西瓜a23 分钟前
Docker 环境下 Redis Lua 脚本部署与执行
redis·docker·lua
qq_4176950525 分钟前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
疯狂成瘾者26 分钟前
Redis 实用学习清单
redis·学习
只能是遇见28 分钟前
ERROR 1524 (HY000) Plugin ‘mysql_native_password‘ is not loaded
android·数据库·mysql
七夜zippoe28 分钟前
消息队列选型:Kafka vs RabbitMQ vs Redis 深度对比
redis·python·kafka·消息队列·rabbitmq
番茄去哪了29 分钟前
从0到1独立开发一个论坛项目(一)
java·数据库·oracle·maven