数仓集群管理:单节点故障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指标。
数仓集群管理:单节点故障RTO机制分析的更多相关文章
- hadoop集群搭建——单节点(伪分布式)
1. 准备工作: 前提:需要电脑安装VM,且VM上安装一个Linux系统 注意:本人是在学习完尚学堂视频后,结合自己的理解,在这里做的总结.学习的视频是:大数据. 为了区分是在哪一台机器做的操作,eg ...
- 搭建ceph集群(单节点)
https://blog.csdn.net/Greenchess/article/details/77525786 软件环境: - Centos7 x64 CEPH版本 : - ceph-deploy ...
- 利用 docker 部署 elasticsearch 集群(单节点多实例)
文章目录 1.环境介绍 2.拉取 `elasticserach` 镜像 3.创建 `elasticsearch` 数据目录 4.创建 `elasticsearch` 配置文件 5.配置JVM线程数量限 ...
- Redis集群管理
1.简介 Redis在生产环境中一般是通过集群的方式进行运行,Redis集群包括主从复制集群和数据分片集群两种类型. *主从复制集群提供高可用性,而数据分片集群提供负载均衡. *数据分片集群中能实现主 ...
- Spark集群管理器介绍
Spark可以运行在各种集群管理器上,并通过集群管理器访问集群中的其他机器.Spark主要有三种集群管理器,如果只是想让spark运行起来,可以采用spark自带的独立集群管理器,采用独立部署的模式: ...
- 2 weekend110的zookeeper的原理、特性、数据模型、节点、角色、顺序号、读写机制、保证、API接口、ACL、选举、 + 应用场景:统一命名服务、配置管理、集群管理、共享锁、队列管理
在hadoop生态圈里,很多地方都需zookeeper. 启动的时候,都是普通的server,但在启动过程中,通过一个特定的选举机制,选出一个leader. 只运行在一台服务器上,适合测试环境:Zoo ...
- 052.Kubernetes集群管理-故障排错指南
一 故障指南 1.1 常见问题排障 为了跟踪和发现在Kubernetes集群中运行的容器应用出现的问题,常用如下查错方法: 查看Kubernetes对象的当前运行时信息,特别是与对象关联的Event事 ...
- Ignite集群管理——基于静态IP的节点发现
Ignite作为分布式内存,集群管理必不可少,Ignite支持基于组播,静态IP,Zookeeper,JDBC等方式发现节点,本文主要介绍基于静态IP的节点发现. 两个最重要的TCP通信设置类: 1. ...
- 大快搜索DKhadoop集群管理平台添加节点的步骤说明
Hadoop作为搭建大数据处理平台的重要“基石”,关于它的分析和讲解的文章已经有很多了.Hadoop本身是一分布式的系统,因此在安装的时候,需要多每一个节点进行组建的安装.并且由于是开源软件,其安装过 ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 ...
随机推荐
- 从基础到实践,回顾Elasticsearch 向量检索发展史
本文分享自华为云社区<Elasticsearch向量检索的演进与变革:从基础到应用>,作者: 汀丶. 1.引言 向量检索已经成为现代搜索和推荐系统的核心组件. 通过将复杂的对象(例如文本. ...
- 17. 从零开始编写一个类nginx工具, Rust中一些功能的实现
wmproxy wmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感 ...
- 动态规划的状态设计 | bot 讲课の补题
sto james1badcreeper orz. 好厉害的题,但是怎么有人补了三天才补完呢? CF1810G The Maximum Prefix 线性 dp,怎么有 bot 说题目难度在 *240 ...
- 以太坊和比特币区块链的异同(一些QA)
1.比特币区块链和以太坊区块链有何区别? 比特币区块链与以太坊在设计和功能上有显著的不同.下面是关于比特币的主要点: 没有智能合约功能(按照以太坊的定义):比特币是为了作为一个去中心化的数字货币而创建 ...
- 文件 inode 与 no space left on device 异常
转载请注明出处: 文件inode 在 Linux 文件系统中,每一个文件或目录都会有一个 inode,它是一个数据结构,用于存储文件的元数据,比如文件的权限.所有者.大小.创建和修改的时间等.inod ...
- Codeforces Round #699 (Div. 2) A~C题解
写在前边 链接:Codeforces Round #699 (Div. 2) 好自闭哈哈,\(B\)题暴力fst了,第二天改了一个字母就A了,第3题写了一个小时,然后又调了三四个小时,看不到样例,最终 ...
- EF Core预编译模型Compiled Model
前言 最近还在和 npgsql 与 EF Core 斗争,由于 EF Core 暂时还不支持 AOT,因此在 AOT 应用程序中使用 EF Core 时,会提示问题: 听这个意思,似乎使用 Compi ...
- python之range()、arange()和linspace()
目录 range() arange() linspace() range() range()格式如:range(start, stop, step) start:开始的数值,默认从0开始 stop:结 ...
- 百度API学习 | day01
大作业:(2023.12.27日完成) 各位同学可根据自身情况进行选择: 选项一:根据实验一.二.三完成如下任务: 任务一:基于Jfinal构建信息管理系统,要求包含用户管理,翻译业务模块管理,图片优 ...
- 2023你需要使用的最佳VSCode扩展插件
选择最佳的 Visual Studio Code(以下简称 VSCode) 扩展插件对于提高开发效率和改善编程体验非常重要. 下面将详细介绍一些广受欢迎且功能丰富的 VSCode 扩展插件,包括编辑器 ...