Chaos Mesh 最初作为开源分布式数据库 TiDB 的测试平台而创建,是一个多功能混沌工程平台,通过混沌测试验证分布式系统的稳定性。本文以万里安全数据库软件 GreatDB 分布式部署模式为例,介绍了通过 Chaos Mesh 进行混沌测试的全流程。
需求背景与 GreatDB 介绍
需求背景
混沌测试是检测分布式系统不确定性、建立系统弹性信心的一种非常好的方式,因此我们采用开源工具 Chaos Mesh 来做 GreatDB 分布式集群的混沌测试。
GreatDB 分布式部署模式介绍
万里安全数据库软件 GreatDB 是一款关系型数据库软件,同时支持集中式和分布式的部署方式,本文涉及的是分布式部署方式。
分布式部署模式采用 shared-nothing 架构;通过数据冗余与副本管理确保数据库无单点故障;数据 sharding 与分布式并行计算实现数据库系统高性能;可无限制动态扩展数据节点,满足业务需要。
整体架构如下图所示:
环境准备
Chaos Mesh 安装
在安装 Chaos Mesh 之前请确保已经预先安装了 helm,docker,并准备好了一个 kubernetes 环境。
- 使用 Helm 安装
1)在 Helm 仓库中添加 Chaos Mesh 仓库:
helm repo add chaos-mesh https://charts.chaos-mesh.org
2)查看可以安装的 Chaos Mesh 版本:
helm search repo chaos-mesh
3)创建安装 Chaos Mesh 的命名空间:
kubectl create ns chaos-testing
4)在 docker 环境下安装 Chaos Mesh:
helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-testing
- 验证安装
执行以下命令查看 Chaos Mesh 的运行情况:
kubectl get pod -n chaos-testing
下面是预期输出:
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-d7bc9ccb5-dbccq 1/1 Running 0 26d
chaos-daemon-pzxc7 1/1 Running 0 26d
chaos-dashboard-5887f7559b-kgz46 1/1 Running 1 26d
如果 3 个 pod 的状态都是 Running,表示 Chaos Mesh 已经成功安装。
准备测试需要的镜像
准备 MySQL 镜像
一般情况下,MySQL 使用官方 5.7 版本的镜像,MySQL 监控采集器使用的是 mysqld-exporter,也可以直接从 docker hub 下载:
docker pull mysql:5.7
docker pull prom/mysqld-exporter
准备 ZooKeeper 镜像
ZooKeeper 使用的是官方 3.5.5 版本镜像,ZooKeeper 组件涉及的监控有 jmx-prometheus-exporter 和 zookeeper-exporter,均从 docker hub 下载:
docker pull zookeeper:3.5.5
docker pull sscaling/jmx-prometheus-exporter
docker pull josdotso/zookeeper-exporter
准备 GreatDB 镜像
选择一个 GreatDB 的 tar 包,将其解压得到一个 ./greatdb 目录,再将 greatdb-service-docker.sh 文件拷贝到这个解压出来的./greatdb 目录里:
cp greatdb-service-docker.sh ./greatdb/
将 greatdb Dockerfile 放到./greatdb 文件夹的同级目录下,然后执行以下命令构建 GreatDB 镜像:
docker build -t greatdb/greatdb:tag2021 .
准备 GreatDB 分布式集群部署/清理的镜像
下载集群部署脚本 cluster-setup,集群初始化脚本 init-zk 以及集群 helm charts 包(可咨询 4.0 开发/测试组获取)
将上述材料放在同一目录下,编写如下 Dockerfile:
FROM debian:buster-slim as init-zk
COPY ./init-zk /root/init-zk
RUN chmod +x /root/init-zk
FROM debian:buster-slim as cluster-setup
\*# Set aliyun repo for speed*
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN apt-get -y update && \
apt-get -y install \
curl \
wget
RUN curl -L https://storage.googleapis.com/kubernetes-release/release/v1.20.1/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl && \
chmod +x /usr/local/bin/kubectl && \
mkdir /root/.kube && \
wget https://get.helm.sh/helm-v3.5.3-linux-amd64.tar.gz && \
tar -zxvf helm-v3.5.3-linux-amd64.tar.gz && \
mv linux-amd64/helm /usr/local/bin/helm
COPY ./config /root/.kube/
COPY ./helm /helm
COPY ./cluster-setup /
执行以下命令构建所需镜像:
docker build --target init-zk -t greatdb/initzk:latest .
docker build --target cluster-setup -t greatdb/cluster-setup:v1 .
准备测试用例的镜像
目前测试支持的用例有:bank、bank2、pbank、tpcc、flashback 等,每个用例都是一个可执行文件。
以 flashback 测例为例构建测试用例的镜像,先将用例下载到本地,在用例的同一目录下编写如下内容的 Dockerfile:
FROM debian:buster-slim
COPY ./flashback /
RUN cd / && chmod +x ./flashback
执行以下命令构建测试用例镜像:
docker build -t greatdb/testsuite-flashback:v1 .
将准备好的镜像上传到私有仓库中
创建私有仓库和上传镜像操作请参考: Docker入门-搭建docker私有仓库 - 知乎
Chaos Mesh 的使用
搭建 GreatDB 分布式集群
在上一章中 cluster-setup 目录下执行以下命令块去搭建测试集群:
./cluster-setup \
-clustername=c0 \
-namespace=test \
-enable-monitor=true \
-mysql-image=mysql:5.7 \
-mysql-replica=3 \
-mysql-auth=1 \
-mysql-normal=1 \
-mysql-global=1 \
-mysql-partition=1 \
-zookeeper-reposito