PolarDB-X 混沌测试系统搭建赛题解析 | 学习笔记

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 快速学习 PolarDB-X 混沌测试系统搭建赛题解析

开发者学堂课程【第八届大学生创新创业大赛阿里命题数据库命题解析PolarDB-X 混沌测试系统搭建赛题解析学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/1045/detail/15202


PolarDB-X 混沌测试系统搭建赛题解析


内容介绍:

一、PolarDB-X 简介

二、命题背景

三、命题详解


一、PolarDB-X 简介

1、Polar DB-X

Polar DB-X 是阿里云自主研发的云原生分布式数据库,可支撑千万级的并发规模以及百 PB 级的海量存储,专注解决海量的数据存储、超高并发吞吐以及复杂计算效率等数据库的瓶颈问题。Polar DB-X 已于2021年正式开源,下面给出了 Polar DB-X 的架构图,主要包括四个核心组件。image.png

第一个是元数据服务 GMS,它主要存储 Polar DB-X 的集群、拓扑以及统计信息等元数据信息,同时提供了分布式事务所需的 TSO 全局授时能力。第二个是计算节点 CN,它主要提供分布式 SQL 引擎,能够提供分布式的路由以及计算,同时解决了分布式事务的协调以及全局二级索引的维护工作。第三个是存储节点 DN,它基于 Xpaxos 实现了高可靠的数据存储,同时也能够处理分布式事务 MVCC 相关的可见性判断能力。第四个是日志节点 CDC,它汇聚了 DN 上的 Bin 库里 binlog,将其整合成一条与 MYSQL 生态 binlog 协议完全兼容的 binlog 流,与下游的大数据生态系统能够无缝对接。

2、PolarDB-X Operator 架构

提到云原生,K8S 是一个绕不开的话题,它是开源的容器编排引擎,能够对容器化的应用进行自动化的部署、扩缩以及管理。作为一款云原生分布式数据库,PolarDB-X 也积极拥抱 K8S 生态,在上面构建了自己的扩展 Polar DB-X operator。image.png

基于 K8S 的底层基础设施以及开源生态的相关工具,Polar DB-X operator 能够帮助在 K8S 上创建和管理 Polar DB-X 的集群,例如通过 deployment 来管理无状态的 CN、CDC,通过类似 statefulset 的方式管理基于 Xpaxos 的DN节点。除了基本的生命周期能力外,Polar DB-X operator 还提供了弹性伸缩、高可用、容灾部署、备份、恢复、监控、审计等分布式数据库必不可少的产品能力,使 Polar DB-X 在 K8S 上生产及实践,本赛季的主要工作便是依托 Polar DB-X operator 的相关能力进行系统的实现。


二、命题背景

1、搭建云原生分布式数据库 PolarDB-X 混沌测试系统

Polar DB-X 是一款云原生的分布式数据库,专注解决单机数据库的扩展性问题,能够支撑超高的并发与海量的存储,已经历经了各界天猫、双11以及阿里云各行业客户业务的考验。对于 Polar DB-X 而言,稳定性和容错是最基本的要求之一。然而运行的生产环境系统,无论机器的配置多么强劲,难免会有各种不可预料的突发事件发生,例如机器宕机、断网断电、网络延迟、抖动等等。而分布式数据库通常涉及了更多的节点,而且组件之间也存在着各种各样的依赖,出错的概率相对于单机数据库也大大增加,如果处理不好这样的报错,便会导致用户数据的丢失或者业务受损等严重问题。面对这样的情况,一种方式是通过容灾架构,如同城双机房或者两地三中心等方案来增加系统的容错能力,降低故障出现后的业务影响;另一种方式是前置的发现各种故障场景下数据库可能出现的问题,对其进行优化。然而,常规的测试手段,如单元测试、集成测试、性能测试,这些都无法有效地前置发现问题,因此,混沌工程应运而生。image.png

2、混沌工程与 ChaosMesh

混沌工程是在分布式系统上进行实验的学科,它的目的是建立对系统抵御生产环境中失控条件能力的信心。image.png

它最早是由 NETFLIX 提出来的,在2008年的时候,Netflix 的主要数据库因为故障导致了三天的停机,DVD 业务直接中断,多个国家的大量用户受到影响。在这之后,它们的工程师将系统从物理基础设施迁移到了 AWS 上。为了保证 AWS 实例的故障不会对业务系统造成影响,在2010年的时候,Netflix 的工程师创建了 chaos monkey,它会随机的终止在生产环境中运行的 EC2实例,从而帮助它了解正在构建的服务是否健壮、有足够的弹性以及能否容忍于计划之外的故障。至此,混沌工程开始兴起并逐渐完善。在2017到2019年中间,涌现出了多个开源的故障注入工具和混沌的测试框架,ChaosMesh 便是其中之一。它是一个开源的云原生混沌工程平台,提供丰富的故障模拟类型,以具有强大的故障场景的编排能力以及完善的可视化的操作,方便用户在开发测试中以及生产环境中模拟现实世界可能出现的各类异常,帮助发现系统潜在的问题。除此之外,ChaosMesh 面向 K8S 设计,采用了 K8S 云原生的 API 的和以及使用方式,使它能够与 Polar DB-X operator 很方便的集成。因此,本道载题需要基于 Polar DB-X operator 和 ChaosMesh 构建面向 Polar DB-X 的混沌测试系统。

 

三、命题详解

1、混沌工程的原则

混沌测试并不是盲目的,它是有目的的、可控的一种实验方式。在混沌工程原则的网站上,定义了应用混沌工程的几个高级原则,第一个便是建立一个围绕稳定状态行为的假设,简单来说便是依据团队对系统的理解定义一个假设,在某种故障发生时,系统依然能够保持这种稳定的状态。接下来的四个原则,描述了如何具体实施混沌工程的实验,主要包括要模拟真实的事件确保实验结果的可靠性,同时要尽量在生产环境中实验,避免不同环境差异带来的影响。当然,实验的过程也要尽量做到自动化,并能够持续的执行,以降低每次执行的成本并持续的发现问题。所有的实验都要做到最小化的爆炸半径,确保每次实验的影响范围都是可控的。围绕这几个原则,能够对 Polar DB-X 进行混沌测试,从而持续的改进系统的弱点。

2、PolarDB-X 的稳态

首先是 Polar DB-X 稳态的定义,常规的方式有两种,第一种是基于 PolarDB-X 实例和各个节点的状态来进行判断,这边给出了 K8S 集群上 PolarDB-X 的状态显示,能够获取到各个 PolarDB-X 的组件的数目以及它们 ready 的数量。image.png

例如,可以看到 CN 节点和 DN 节点各有两个,都是 ready 的状态,对于这样 running 状态的实例,它可以认为是一个稳定的状态,而旁边这张图可以看到 CN 和 DN 都只有一个节点 ready,而实际应该有两个,表示是一种不稳定的状态。通过 K8S 提供的 API,能够很方便的获取到这个实例的状态,从而可以作为判断稳态的依据。

另一种方式是通过监控相关的 metrics 指标来进行判断,Polar DB-X 的监控数据目前都是存储在 Prometheus 中的,可以通过 Prometheus 的接口获取到相关的监控数据,例如 QPS、RT 或者错误数等等。image.png

举个例子,业务正常运行的过程中,RT 会是一个相对稳定的值,它可以作为稳态判断的依据。当 Polar DB-X 的 CN 和 DN 之间如果出现了网络延迟这种类型的故障,此时系统的整体 RT 将会得到上升,等到这个故障消除之后,如果 RT 能够回到之前的数值,便可以表示 Polar DB-X 又回到了稳态,反之则不是。当然,不同的故障类型和不同的稳态判断的依据也是不一样的,例如网络的故障通常和 RT 更多的相关,而 pod 类型的故障更多地和错误数这样的指标相关联。因此在这个课题中,如何根据不同的故障类型设定不同的稳态判断标准,也是重要的一部分工作内容。有了稳态的定义,接下来便是支持尽可能多的故障类型了。

3、现实生活中的变量-故障类型

对于分布式系统而言,它出现的故障也是多种多样的,大致可以分成三种类型。第一种是基础资源类型的故障,大概包括像 pod 的重启、持续不可用、网络的延迟、丢包等等,同时,像 CPU 的抢占和内存抢占这些也是存在的。除此之外,分布式系统对于时间往往是非常依赖的,但是时间其实也是不那么可靠,可能出现时间跳动、时间漂移等等问题。平台类型的故障主要指的是依赖的主机出现了重启、IOHang 等等问题。应用层的故障指的是比如像 Polar DB-X 的 CN 节点是依赖 JVM 运行的,如果 JVM 出现了问题,出现了 dump 等等,也需要能够进行模拟。以上这些故障类型都需要在测试系统中能够有效地进行实现,ChaosMesh 已经很好地支持了它们。

4、进行实验-如何注入故障image.png

如何为 Polar DB-X 注入这些故障?ChaosMesh 也已经提供了丰富的故障模拟手段,并且将它们分装成了相关的 K8S 的 CRD 对象,对于部署在 K8S 上的 Polar DB-X 而言是非常友好的。接下来将从 how、where 和 When 三个角度进行故障注入的说明。

首先是 how,也就是如何注入故障,ChaosMesh 已经支持了像 PodChaos、NetworkChaos 以及 IOChaos 等等不同类型的故障,同时,它也能够通过 yaml 的方式定义故障注入的类型,这边分别给出了网络延迟和 PodChaos 两种类型故障的 yaml 定义,从图中可以看到,两种故障类型的定义十分的简洁和方便,能够迅快速的注入一个故障。

其次是 where,也就是故障注入的范围,Polar DB-X operator 已经为所有的 pod 打上了丰富的标签,在这基础之上,可以使用 select 精确的控制故障注入的范围,例如可以选择注入故障的范围是 CN、DN 还是 CDC 节点,亦或者是只想对 DN 的 follower 节点进行故障的注入,这些都可以很方便的实现。

最后是 when,也就是何时的注入故障,因为当实验开始之后,需要能够控制故障注入的时间或者频率,ChaosMesh 提供了类似 K8S Chaos job 的能力,如图中所示,它是 schedule 类型的对象,通过这个 schedule 类型的对象可以定义故障的调度策略,可以让我们在固定的时间或者固定的间隔注入所需要的故障,提升了实验操作的灵活性。

5、PolarDB-X 自动化混沌实验

有了前面稳态的定义,以及在可控范围内注入多种类型故障的能力后,便可以面向 PolarDB-X 构建一个混沌测试系统。在这里,简单给出了一段 Golang 的代码示例,image.png

代码分成了几个部分,首先创建了 Polar DB-X 的实例,等到实例创建完成之后,会在实验开始之前检查实例是否达到了稳定的状态,满足这些条件之后,便会进行不同类型的故障注入,例如网络时间或者内存抢占等等,故障完成之后便会验证实例是否重新恢复到了稳定的状态,并将结果进行记录,之后清除相关的资源。这样的过程,由于有 K8S 的存在,它能够让我们通过 API 的方式很方便的进行实现。因此,这道赛题需要参与者熟悉 golang 语言以及 K8S 的相关知识和操作,能够基于 Polar DB-X operator 和 ChaosMesh,通过 yaml 或者白屏化的形式定义好 Polar DB-X 的实验,同时,基于这个定义,自动化的完成整个实验的过程的执行以及结果的检查,从而一方面帮助发现潜在的问题,促进整个产品向更稳定的状态迭代,同时也能够验证 Polar DB-X 作为一款云原生分布式数据库,它的稳定性和可靠性。

6、更多工作

前面介绍了 Polar DB-X 混沌测试系统的相关要求以及具体的实现方案,对于一个混沌测试系统,除了前面这些要求之外,其实还有更多的事情可以考虑进来。

第一个是混沌的实验都是基于单个故障进行的,但是真实世界中的故障往往不是单一存在的。例如,当主机发生了宕机,它往往也伴随着网络的抖动或者延迟或者丢包,如何能够让平台支持多种混沌实验同时进行,对多个不同的故障进行编排,这都将帮助更好的模拟真实世界的情况。例如这边给出了 yaml 文件的一个示例,image.png

它里面同时支持了像 pod 故障和网络故障两种类型故障的同时执行,能够帮助很好地发现系统的稳定性及相关问题。

第二个便是 Polar DB-X 的稳态也不是一成不变的,例如扩缩容、升降配以及备份都是正常的变更流程,而对于业务系统而言,这些也都应该是稳定的状态。因此,如何在混沌实验中将这些变更流程也结合进来,在变更的过程中注入相应的故障,来验证这些变更操作的健壮性和稳定性,也将大大提高混沌测试系统的效率和能力。

除此之外,对于一个面向高并发场景的分布式数据库而言,它所面临的问题并非是能够轻易复现的,很多时候遇到的都是一些并发问题、偶发问题,或者是一些很难复现问题,对于这样问题的根因定位往往也是非常困难的。而这样的问题也不是那么容易复现,可能很多时候也是在多次的混沌实验中才能发现一次。一旦在混沌实验中发现了这样的异常,如何能够做好现场保存,例如将相关的内存进行 dump,将相关的日志或者监控数据进行转存,都将帮助在事后定位到问题的根因,提升这样问题的排查效率。

以上便是对这个赛题的详细解读,这边将相关的一些参考资料都放在了这里,主要是在github 上源码的地址以及 ChaosMesh 的相关文档。

参考资料:

https://github.com/ApsaraDB/galaxykube

https://github.com/ApsaraDB/galaxysql

https://github.com/ApsaraDB/galaxyengine

https://www.zhihu.com/org/polardb-x

https://chaos-mesh.org/

除此之外,在知乎上也开了一个 Polar DB-X 的技术专栏,里面有很多关于 Polar DB-X 的技术解读文章。

相关实践学习
跟我学:如何一键安装部署 PolarDB-X
《PolarDB-X 动手实践》系列第一期,体验如何一键安装部署 PolarDB-X。
相关文章
|
1天前
|
传感器 数据采集 算法
LabVIEW无人机大气数据智能测试系统
LabVIEW无人机大气数据智能测试系统
11 3
|
1天前
|
API Go
LabVIEW如何减少下一代测试系统中的硬件过时6
LabVIEW如何减少下一代测试系统中的硬件过时6
12 1
|
1天前
|
XML 编解码 API
LabVIEW如何减少下一代测试系统中的硬件过时5
LabVIEW如何减少下一代测试系统中的硬件过时5
11 1
|
1天前
|
测试技术
LabVIEW如何减少下一代测试系统中的硬件过时4
LabVIEW如何减少下一代测试系统中的硬件过时4
11 1
|
1天前
|
网络协议 Windows
LabVIEW如何减少下一代测试系统中的硬件过时3
LabVIEW如何减少下一代测试系统中的硬件过时3
|
1天前
|
编解码 API
LabVIEW如何减少下一代测试系统中的硬件过时 1
LabVIEW如何减少下一代测试系统中的硬件过时 1
10 0
|
1天前
|
存储 监控 Cloud Native
如何通过持续测试和调整来提高OLAP系统的性能和可扩展性?
【5月更文挑战第14天】如何通过持续测试和调整来提高OLAP系统的性能和可扩展性?
12 2
|
1天前
|
Rust 安全 程序员
使用Rust进行系统编程:安全性优势深度解析
【5月更文挑战第14天】Rust,Mozilla开发的系统编程语言,以其内存安全、并发支持和静态类型系统在系统编程中脱颖而出。所有权和借用检查机制消除内存错误,无锁并发原语提升安全性,静态类型减少运行时错误,最小权限原则降低权限风险。强大的社区支持和安全审计进一步确保了代码的安全性和稳定性,使Rust成为安全高效系统编程的理想选择。
|
1天前
|
前端开发 测试技术 数据安全/隐私保护
软件测试 —— 案例系统缺陷报告
软件测试 —— 案例系统缺陷报告
6 1
|
1天前
|
传感器 存储 数据采集
LabVIEW MEMS电容式压力传感器测试系统
LabVIEW MEMS电容式压力传感器测试系统
26 4

热门文章

最新文章