当前位置: 首页 > news >正文

Redis 05 Redis cluster

将多个 reids 实例组成集群可以提高 redis 的吞吐量。
redis 提供的集群方案有主从集群,哨兵集群,redis cluster。

主从集群

一个集群有多个从阶段,一个主节点。
所有节点都可读,但只有主节点可写。原因是多节点同时可写导致的同步消耗大。
主从集群可以提高集群可用性。

从库执行 replicaof 命令可以建立与主库的关系。

主从节点初次全量复制的流程是:

  1. 建立连接。从库发送 psync 命令,命令带两个参数:主库的 runId和复制进度 offset。主库回复 fullresync 响应命令,带两个参数:主库 runId 和复制进度 offset。
  2. 主库建立客户端向从库发送 rdb 日志。主库执行 bgsave 命令,业务线程不被阻塞。从库收到 rdb 日志后先清空从库,之后才加载 rdb 日志,避免旧数据。
  3. 上一阶段的新命令不在 rdb 日志,主库存放在 replication buffer 中,发送给从库。

初次全量复制之后,主从节点建立常量连接,主节点持续将命令发送给从节点。

主库为每个从库生成和传输 rdb 文件,为米格从库维护一份 replication buffer。如果从库太多,主库忙于同步,影响应用程序请求速度。一种解决办法是:用“主-从-从”代理主从,限制主节点的从节点数。

如果住从库断开网络后重连,从库如果落后不太多,则不需要全量复制。redis 提供增量复制方法。
主库维护 repl_backlog_buffer ,它是一块内存,所有从库共享。
主从库断连后,主库将命令写入 repl_backlog_buffer ,同时写入 replication buffer。
主库的写入位置为 master_repl_offset,从库的读取位置为 slave_repl_offset 。
从库重连后发送 slave_repl_offset ,主库计算与 master_repl_offset 的差值,并且发送给从库。
repl_backlog_buffer 是环形缓冲区,如果 master_repl_offset 超过 slave_repl_offset ,则从库只能全量复制。

哨兵集群

如果主库故障,则集群无法对外提供写服务。redis 提出哨兵集群解决主库故障问题。
哨兵是一个特殊的 redis 实例。它的任务是:监控业务实例,选择新的主库,通知给集群所有实例。
监控业务实例:周期性向业务实例,主、从库,发送PING命令。如果从库没响应,哨兵标记“下线”,如果主库没响应,哨兵标记“切换主库”。
选择新的主库:按照规则选择主库。首先筛除网络不好的实例。之后对实例排序,根据用户配置的 slave-priority 参数排序,如果没有选出新主库,根据与旧主库的 offset 排序,如果仍没有选出,选择 id 最小的。
通知给集群所有实例:哨兵将新主库发送给所有从库,使其执行 replicaof 命令,与新主库建立连接,同步数据。同时发送给客户端,使其与新主库建立连接。

判断主库下线执行切换主库的开销很大,为了避免单个哨兵判断失误(比如网络阻塞,主库业务线程阻塞)的情况,redis 提出客观下线,即多哨兵共同判断下线。集群有N个哨兵,有N/2+1个哨兵认为主库下线,才执行主从切换。

哨兵实例使用 sentinel monitor master-name ip redis-port quorum 命令监控主库。
哨兵与主库建立连接后,在主库的"sentinel:hello"频道发布自身IP,端口,同时订阅其他哨兵的IP端口。从而与其他哨兵建立连接。
哨兵与主库建立连接后,向主库发送INFO命令,主库返回从库IP端口,哨兵从而与从库建立连接。
为了与客户端建立连接,哨兵实例提供特殊频道,每个频道记录事件(比如:实例主观/客观下线事件,执行主库切换时间,通知事件)。客户端订阅哨兵实例的事件,从而知道主从集群的状态。

为了实现主从切换,哨兵实例们内部经过两次选举,一次是仲裁选举。一次是 leader 选取。
仲裁选举表示由哪个哨兵标记客观下线事件。 某哨兵判断主库主观下线,向其他哨兵发送 is-master-down-by-addr 命令,其他哨兵根据主观下线情况返回赞成票或者反对票。如果哨兵得到的票数大等于 quorum 配置,则认为主库客观下线。
leader 选取表示由哪个哨兵执行主从切换。每个哨兵只能投一票,如果投了自己或者某个哨兵,就不能再投其他哨兵。如果某实例得到的赞成票超过半数以上并且大等于 quorum,则由该哨兵执行主从切换。如果没有选出 leader,则等待一段时间重新选举 leader。

哨兵实例不是越多越好。实例越多,误判越少,但是仲裁选取,leader 选取时间更长,主从库切换时间更长。

Redis cluster

redis cluster 实现纵向扩展实例,将不同数据映射到不同实例,提高数据容量。
映射方法是 hash slot。一个集群的 slot 数组长度为16384。每个 key 经过 CRC16 算法映射到一个 slot 桶。redis 自动将 slot 桶平均分布到 master 实例上。当然也可以用 cluster addslots 命令手动分配 slot 桶。

redis 实例会互相发送 slot 桶信息,使得每个实例都拥有集群的 slot 桶分配信息。客户端连接任意一个实例都可以获取集群 slot 分配并且保存到客户端。

如果增删实例或者负载均衡,slot 分配信息可能改变。实例之间可以通过扩散更新信息。
客户端请求 slot 时,实例会返回 slot 的最新实例ip。

如果某个实例数据明显比其他节点多,称为数据量倾斜。原因主要是 bigkey ,slot 分配不均,hash tag。
bigkey 是值对象特别大的键值对。解决办法是:拆分 bigkey,控制值对象的大小均衡。
hashtag 是键的花括号,客户端只根据花括号中的内容计算 slot 桶。典型场景是事务操作和范围查询。解决办法是:将事务操作和范围查询放到客户端执行,避免系统不稳定。

如果某个实例的访问量明显比其他节点多,称为数据访问倾斜。原因是热点数据多。解决办法是:热点数据多副本。为 key 增加随机前缀,将其映射到不同 slot 桶,映射到不同实例。

redis 官方限定 redis cluster 规模上限为1000个实例。原因是通信开销过大降低集群吞吐量。
实例之间通过 Gossip 协议互相传输 slot 映射表以及实例状态信息。
Gossip 协议:每个实例,按照一定频率,选取一些实例,把PING消息(包含 slot 映射表,自身状态,其他实例(集群的十分之一)状态)发给对方。对方发送一个PONG消息(内容与PING相同)。

单个 Gossip 通信的消息不多,但是大量实例频繁通信就会占据大量网络带宽,降低服务的吞吐量。

那么哨兵集群之间怎么通信呢?

http://www.dtcms.com/a/332561.html

相关文章:

  • 【新手入门】Android基础知识(一):系统架构
  • Java 中使用阿里云日志服务(SLS)完整指南
  • 信息系统架构:构建企业数字基石的蓝图与方法
  • 软考 系统架构设计师系列知识点之杂项集萃(123)
  • Matlab利用系统辨识工具箱辨识自带数据集的控制系统参数(传递函数篇)
  • DeepSeek-V2:一种强大、经济且高效的混合专家语言模型
  • MySQL视图:虚拟表的强大用途与限制
  • C++:stl-> list的模拟实现
  • Day59--图论--47. 参加科学大会(卡码网),94. 城市间货物运输 I(卡码网)
  • Jmeter自定义脚本
  • paimon实时数据湖教程-主键表更新机制
  • 微服务的编程测评系统11-jmeter-redis-竞赛列表
  • Helm 常用命令 + Bitnami 中间件部署速查表
  • EhViewer安卓ios全版本类下载安装工具的完整路径解析
  • 【web自动化】-8-EXCEL数据驱动
  • 记录一下 StarRocks 点查的 Profile Metrics
  • 科技赋能千年养生丨七彩喜艾灸机器人,让传统智慧触手可及
  • 醋酸镧:看不见的科技助力
  • 学习笔记与效率提升指南:编程、记忆与面试备考
  • QML实现数据可视化
  • 解决Electron透明窗口点击不影响其他应用
  • [系统架构设计师]数据库设计基础知识(六)
  • 【Linux】编辑器vim的使用
  • 17.3 删除购物车商品
  • @Autowired @Resource IDE警告 和 依赖注入
  • 【解决笔记】MyBatis-Plus 中无 selectList 方法
  • 【详细操作指南】如何将 Moodle 与编辑器连接,以修改文档、检查和批改作业等
  • JavaScript 核心基础:类型检测、DOM 操作与事件处理
  • 8.15 机器学习(2)K最近邻算法
  • Chrome插件开发【Tabs】