第19问:MGR 架构,如果一个节点网络不稳,消息缓存会被撑满么?

探讨MySQL MGR架构下,group_replication_member_expel_timeout与group_replication_message_cache_size参数对集群稳定性的影响,及消息缓存撑满后的后果。

问题

已知情况如下:

  1. MySQL 版本为 8.0.21(随 8.0 的小版本升级,MGR 参数和行为变更频繁,需要特别注意版本号)。
  2. MGR 架构,一个节点 C 网络不稳时,与其他节点的通讯断开。
  3. 通讯断开后,一定时间内(5 秒 + group_replication_member_expel_timeout 秒)
    a. 其他节点开始质疑节点 C 可能掉线。在其他节点上,节点 C 的状态为 UNREACHABLE。
    b. 其他节点仍然能协商并提交新事务,其协商的信息会保存在消息缓存中。
  4. 通讯恢复后,节点 C 会从其他节点的消息缓存中获取漏掉的信息,并跟上进度。那么,消息缓存会被撑满么?撑满以后会造成什么影响?

实验

我们先建三节点的 MGR,此处忽略步骤,大家按照官方文档进行就行。来看一下三节点的状态:

我们知道 MGR 的消息缓存大小由 group_replication_message_cache_size 参数控,我们在三个节点上都将参数设置为最小值(128M),这样比较容易撑满:

我们还需要将 group_replication_member_expel_timeout 调大,使得之后通讯故障的节点 C 不会被集群踢出。

我们需要知道消息缓存已经用了多少,可以使用下面的命令:

现在我们上一些数据库压力,让 MGR 发送消息,将缓存填满:

看一下填满后的缓存状况:

下面,我们将 mgr-3 节点的网络通讯断开:

在其他节点查询状态,可以看到故障节点被质疑,但没有踢出:

同时,我们可以看到数据库压力仍然在继续进行。现在,在 primary 节点上,我们将内存统计表重置:

然后观察内存统计,查看缓存的释放量:

等待一段时间,可以看到缓存的释放量已经超过缓存大小,意味着整个缓存的内容已经完全换过一轮:

接下来,我们恢复故障节点的通讯。

通讯恢复后,故障节点应当从其他节点的缓存中,获取故障阶段的消息,但这些消息已经从缓存中被清掉了,我们看看故障节点的 error log:

可以看到,故障节点因为无法接上消息,报错退出集群。而后由于 auto-rejoin 机制,故障节点尝试重新加入集群,并通过 binlog 接续数据。

一些结论

本文涉及到两个 MGR 相关的参数:

  1. group_replication_member_expel_timeout
    a. 行为:
    当某节点意外离线达到(5 秒 + group_replication_member_expel_timeout 秒)后,MGR 将其踢出集群。
    如果节点意外离线时间较短,MGR 可以自动接续消息,仿佛节点从未离开。
    b. 优点:
    网络等发生意外时,该参数越大,越不需要人工参与,集群可自动恢复。
    c. 成本:
    该参数越大,就需要更多的消息缓存。
    d. 成本:
    节点未被踢出集群时,可以从该节点读到过期数据。
    该参数越大,读到过期数据的概率越大。

  2. group_replication_message_cache_size
    a. 优点:该参数越大,可缓存的消息越多,故障节点恢复后自动接续的概率越大,不需要人工参与运维。
    b. 成本:消耗内存。

小贴士
大家在选择 MGR 参数时,建议从以下几个方向考虑,达成平衡:

  1. 对环境不稳定的容忍程度
  2. 自动化程度(是否需要人工参与)
  3. 读过期数据的概率
  4. 物理资源消耗

关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

<think>好的,我现在需要帮助用户解答关于在1个master和2个worker节点的Kubernetes集群上使用Rook部署Ceph集群的题,用户还提到想要部署3个MON、2个MGR和3个OSD。首先,我需要回忆Ceph和Rook的相关知识,特别是关于节点数量和件部署的要求。 首先,用户的题是关于在这样的集群架构下是否可行。用户可能是在自己的测试环境中尝试搭建Ceph,可能遇到了题,或者想确认是否可行。用户提到的是三个MON、两个MGR和三个OSD,但节点数量只有三个(1 master + 2 worker)。需要分析每个件的需求。 Ceph的MON(Monitor)需要奇数个来维持仲裁,通常至少三个。但如果在三个节点的情况下,每个节点部署一个MON,理论上是可以的。不过题在于,如果master节点是否也作为工作节点使用。通常,Kubernetes的master节点默认有污点,不允许普通Pod调度,除非用户手动去掉污点。所以用户需要确认master节点是否可以作为MON、MGR或OSD的节点。如果master节点不可调度,那么只有两个worker节点,这时候部署三个MON可能有题,因为需要三个节点,而用户只有两个可用。这时候可能需要调整MON的数量为1个,但这会牺牲高可用性。 接下来是MGR(Manager),Ceph要求至少两个MGR以实现高可用。用户想要部署两个,这在两个节点上是可行的,每个节点一个MGR。但同样需要考虑节点调度的题。 然后是OSD,每个OSD对应一个磁盘。用户想要三个OSD,但只有两个worker节点的话,可能需要每个节点部署多个OSD,这取决于每个节点上的可用磁盘数量。Rook会自动在每个节点上为每个可用磁盘创建OSD,所以如果每个worker节点有多个磁盘,可以部署多个OSD。但如果每个节点只能有一个OSD,那么总共只能有两个,无法满足三个OSD的需求。所以用户需要检查每个worker节点是否有足够的磁盘。 另外,还需要考虑资源限制。如果master节点也被用来部署Ceph件,需要确保有足够的CPU、内存和存储资源。否则可能导致性能题或Pod无法调度。 总结一下,用户的题主要在于节点数量和件部署的匹配。可能的解决方案包括调整MON数量,确保节点可调度,检查磁盘数量,以及资源分配是否足够。需要将这些点详细解释给用户,并给出具体的配置建议和注意事项。</think>--- ### **一、核心结论** **可以部署**,但需要满足以下条件: 1. **Master节点需解除污点(Taint)**,允许调度Ceph Pod(默认Master节点不允许部署工作负载) 2. **至少3个节点均具备存储设备**(每个节点至少1块可用磁盘用于OSD) 3. **合理规划资源配额**,避免资源争抢 --- ### **二、关键件部署规则分析** | 件 | 最小数量 | 节点分布要求 | 注意事项 | |-------|----------|----------------------------------|--------------------------------------------------------------------------| | **MON** | 3 | **必须部署在不同节点** | 若节点数不足3,需强制调整`mon.count=1`(牺牲高可用性) | | **MGR** | 2 | 可部署在任意节点 | 建议分散到不同节点以提高可用性 | | **OSD** | 3 | 每个OSD对应一个独立磁盘 | 若节点数不足,需在部分节点挂载多块磁盘(例如:2节点各挂载2块磁盘) | --- ### **三、具体场景验证** #### **场景1:Master节点参与调度** - **步骤1:解除Master节点的污点** ```bash kubectl taint nodes <master-node-name> node-role.kubernetes.io/control-plane- ``` - **步骤2:部署Rook Ceph** ```yaml # cephcluster.yaml 示例片段 spec: mon: count: 3 # 强制要求3个节点可用 allowMultiplePerNode: false # 禁止单节点部署多个MON mgr: count: 2 storage: nodes: - name: "master-node" devices: - name: "sdb" # 必须存在实际磁盘 - name: "worker-node-1" devices: - name: "sdb" - name: "worker-node-2" devices: - name: "sdb" ``` **风险**:Master节点承担Ceph负载可能导致稳定性下降 #### **场景2:仅使用2个Worker节点** - **调整MON数量为1**(不推荐生产环境) ```yaml spec: mon: count: 1 # 失去高可用性 allowMultiplePerNode: false ``` - **OSD解决方案**:每个Worker节点挂载2块磁盘 ```yaml storage: nodes: - name: "worker-node-1" devices: - name: "sdb" - name: "sdc" # 第二块磁盘 - name: "worker-node-2" devices: - name: "sdb" - name: "sdc" ``` --- ### **四、生产环境建议** 1. **最小集群规模**:3个Worker节点(每个节点部署1MON+1OSD) 2. **Master节点隔离**:仅用于控制平面,不参与Ceph数据存储 3. **硬件配置**: - 每个节点至少2核4GB内存 - 磁盘类型:SSD优先(HDD需增加OSD数量补偿性能) 4. **网络要求**: - 万兆网络(至少千兆) - 分离公共网络与集群网络(通过`network`配置实现) --- ### **五、部署验证命令** ```bash # 检查MON分布 kubectl -n rook-ceph get pods -l app=rook-ceph-mon -o wide # 检查OSD状态 kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd tree # 查看资源使用 kubectl -n rook-ceph top pod ``` --- ### **六、故障模拟与恢复** - **单节点故障测试**: ```bash # 关闭一个Worker节点 kubectl cordon <node-name> && kubectl drain <node-name> # 观察Ceph健康状态(预期出现HEALTH_WARN,但数据仍可访) ``` - **恢复策略**: - 自动:Rook默认启用故障转移(需确保资源充足) - 手动:替换故障磁盘后执行`kubectl uncordon <node-name>` --- 通过合理规划,即使在小规模集群中也能部署Rook Ceph,但需明确**牺牲高可用性带来的风险**。建议测试环境验证通过后再投入生产使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值