数仓集群管理:单节点故障RTO机制分析
摘要:大规模分布式系统中的故障无法避免。发生单点故障时,集群状态和业务是如何恢复的?
本文分享自华为云社区《GaussDB (DWS) 集群管理系列:单节点故障RTO机制分析(集群状态恢复篇)》,原文作者:CloudGanker 。
一、前言
GaussDB(DWS)产品采用分布式架构设计。集群管理(高可用)需要在稳定性和灵敏性之间做好平衡。
集群发生单节点故障(如宕机、断网、下电等)时,端到端业务恢复的RTO (Recovery Time Objective)流程和指标,主要包含两大过程:集群状态恢复(CM Server主备倒换,DN/GTM主备倒换)和业务恢复(CN可正常执行业务)。
本文关注集群状态恢复部分,剩余部分后续单独分析。
参考链接:
GaussDB (DWS) 集群管理系列:CM组件介绍(架构和部署形态)
GaussDB (DWS) 集群管理系列:CM组件介绍(核心功能)
二、假设条件和关键配置参数
通常情况下故障CN自动剔除的触发时间较长(默认10分钟),因此本文不涉及CN剔除和实例修复的流程,也不讨论CN故障时DDL业务的中断。
假设如下:
- 除明确故障外(如节点已经宕机),链接可在超时时间内成功建立(即建立链接时间按超时时间计算)
- 消息传递不消耗时间
- DN/GTM执行failover时间不超过 T_{\rm failover}Tfailover (通常小于5秒)
关键配置参数如下:
【CM侧配置参数】实例心跳超时instance_heartbeat_timeout(默认30秒), 后续用 T_{\rm hb}Thb 表示。
说明:由于C/C++语言中乘法和除法不满足结合律,本文涉及运算均为整数运算。
三、集群拓扑示例
忽略CN的部署,以下图所示的三节点集群为例:
- 两个cm_server实例,主备分别部署在节点1和节点2
- 两个GTM实例,主备分别部署在节点1和节点2
- 一组DN实例,主备从分别部署在节点1,节点2和节点3
- 每个节点上均部署cm_agent组件
四、整体流程分析
当节点1故障,集群将短时间处于不可用状态,然后自动恢复至降级状态,随后可在CN上正常执行业务。因此,RTO流程的讨论可分为四个阶段。
1)单节点故障发生,集群处于不可用状态,cm_server/GTM/DN处于无主状态
2)cm_server备机升主,GTM/DN等待仲裁
3)GTM/DN备机(并行)升主,集群恢复至降级状态
4)CN链接至GTM和DN,正常执行业务
以故障发生时刻为0时刻点,下面逐个分析每个阶段并计算相关时间。
五、CM Server备机升主
单节点故障发生后,集群管理组件出于稳定性考虑,并不会立刻感知故障状态。两个cm_server实例之间通信时,根据心跳判断对方的存活状态。如果二者间心跳超时,则进入如下的自仲裁流程(对端链接均指与另一个cm_server的链接)。
六、DN/GTM备机升主
集群管理的仲裁采用被动触发的形式。每个cm_agent检测所在节点的实例状态,并定期上报(固定间隔1秒)至主cm_server;主cm_server综合各实例状态进行仲裁,然后将必要的仲裁结果发送至相关cm_agent;cm_agent收到仲裁结果,执行相应的命令。
以某个主 DN 故障为例,一次典型的仲裁流程包括:
① CM Agent 1探测DN主实例并发现故障
② CM Agent 1持续上报实例故障信息至CM Server
③ CM Server执行仲裁流程,选择DN备机升主
④ CM Server下发升主命令至CM Agent 2
⑤ CM Agent 2对实例执行升主操作
对于单节点故障,DN和GTM实例的仲裁可同时进行,分步骤的时间如下:
七、小结
将CM Server自仲裁和DN/GTM仲裁的时间相加,即为集群状态恢复的耗时(单位:秒)
用户可根据自身情况,通过调整instance_heartbeat_timeout参数选择合适的RTO指标。
相关文章
- 如何在大数据集群中手工增加一个节点
- Centos7 tiup搭建tiBD集群、扩容、缩容存储节点、修改监控节点
- 节点互信配置
- 大叔问题定位分享(4)Kafka集群broker节点从zookeeper上消失
- LeetCode(116):填充同一层的兄弟节点
- Prometheus详解(八)——Prometheus监控Kubernetes集群节点
- k8s节点亲和性声明语法:键值运算符说明
- Java客户端操作zookeeper:获取/节点的子节点代码示例
- 使用xslt批量修改xml 节点name
- Secondary节点为何阻塞请求近一个小时?
- 基于P2P电力市场中的成本分配研究【IEEE39节点】(Matlab代码实现)
- 数据|IEEE123节点数据
- 电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)【6节点 9节点 14节点 26节点 30节点 57节点】(Matlab代码实现)
- 基于蜻蜓优化算法的配电网重构求解(Python代码实现)【IEEE123节点算例】
- 华为云FusionInsight MRS:千余节点滚动升级业务无中断
- 重磅!KubeEdge单集群突破10万边缘节点|云原生边缘计算峰会前瞻
- [CocosCreator]-08-自动布局容器(多个相同节点的摆放问题)
- 完全二叉树-插入节点并保持仍然是完全二叉树
- hadoop集群运行jps命令以后Datanode节点未启动的解决办法
- 一脸懵逼学习Hdfs---动态增加节点和副本数量管理(Hdfs动态扩容)
- kubernetes集群中工作节点Noready故障处理
- k8s集群驱逐node节点上的pod
- 集群节点Elasticsearch升级
- cassandra集群环境搭建——注意seeds节点,DHT p2p集群管理难道初始化都应如此吗?
- MongoDB 2.6复制集单节点部署(三)
- Kubelet 工作节点控制平面组件简介
- K8S集群Node节点NotReay状态故障排查思路
- Kubernetes 单节点安装Clickhouse