背景
MongoDB 数据库实例为用户提供多数据存储节点和 HA 机制保障数据的安全性和服务的高可用性,为验证用户业务对腾讯云 MongoDB 容灾能力的利用情况,混沌演练平台提供多种故障场景实现存储节点故障模拟。
演练实施
演练准备
购买云上跨可用区 MongoDB 实例,部署本地或者云上服务端测试环境,连接 MongoDB 实例。
模拟常规客户端请求的脚本。
#!/usr/bin/python"""通过简单的数据读写方式,模拟十万级数据量的操作。在数据插入中途,通过混沌演练平台操作进行故障注入,观察前后变化。本脚本只作为参考示例,真实演练时建议使用贴近生产环境的业务场景进行故障模拟。"""import pymongoimport random# 演练时以实际注入故障的MongoDB实例Uri进行替换,具体可参考MongoDB [实例详情-网络配置-连接地址]mongodbUri = 'mongodb://mongouser:thepasswordA1@ip:port/admin'client = pymongo.MongoClient(mongodbUri)# 数据库指定db = client.somedb# 数据集删除db.user.drop()# 自定义插入数据量。建议采用较大数据量,方便演练过程观察element_num = 3 * 10 ** 6for id in range(element_num):# 插入随机文档name = random.choice(['R9', 'caÒt', 'owen', 'lee', 'J'])sex = random.choice(['male', 'female'])try:db.user.insert_one({'id': id, 'name': name, 'sex': sex})except Exception as e:print('error id', id)# 查询全量文档content = db.user.find()for i in content:print(i)
演练步骤
步骤1:创建演练
1. 登录 混沌演练控制台,进入演练管理页面,单击新建演练。
2. 单击跳过,新建空白演练。
步骤2:添加 MongoDB 实例和动作
1. 在演练对象配置环节中,可通过批量实例 ID 输入或选择 VPC 过滤并添加期望参加演练的 MongoDB 实例。
![](https://qcloudimg.tencent-cloud.cn/image/document/733e39afaa41e3f5d0ff4e1203551f76.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/733e39afaa41e3f5d0ff4e1203551f76.png)
2. 添加演练动作。
MongoDB 主节点重启。
模拟 MongoDB 主节点故障重启的过程对业务的影响以及MongoDB的 HA 机制。
MongoDB 主从切换。
模拟 MongoDB 节点主从切换过程和切换后产生节点IP发生变更的场景,动作支持优先同可用区切换和优先跨可用区切换两种执行模式。
![](https://qcloudimg.tencent-cloud.cn/image/document/fdd85c9d8e56d84076316f2fbef7f253.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/fdd85c9d8e56d84076316f2fbef7f253.png)
步骤3:根据需求添加监控指标
![](https://qcloudimg.tencent-cloud.cn/image/document/f7977f321ec90058ac9ca57a1e267d65.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/f7977f321ec90058ac9ca57a1e267d65.png)
步骤4:执行演练
![](https://qcloudimg.tencent-cloud.cn/image/document/d7ce31439af9c159e5043d848bd207a1.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/d7ce31439af9c159e5043d848bd207a1.png)
结果观测
通过脚本模拟生产环境用户行为,观察故障前,故障中,故障后三个时态下的业务响应。
主节点重启![](https://qcloudimg.tencent-cloud.cn/image/document/d9ac8dd67675288792dbafb3d7eac554.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/d9ac8dd67675288792dbafb3d7eac554.png)
故障前
业务表现:大批量数据持续插入数据库,MongoDB以稳定的速率处理。
实例状态:以广州七区节点为主节点,广州四区节点为从节点,广州六区为 Hidden 节点。
![](https://qcloudimg.tencent-cloud.cn/image/document/44dfbfc71129fdad414c7f5a731ac1a6.png)
故障中
业务表现:脚本中插入失败,可通过配置驱动的重试机制进行重试,同时检测到Mongo节点异常,出现短时间的数据积压。
实例状态:从节点中选择一个节点提主,由于 Hidden 节点不参与选举,则选择广州四区节点作为主节点,原主节点将作为从节点被重新拉起。
![](https://qcloudimg.tencent-cloud.cn/image/document/8fc0ba0a6da07f3cdca37ac504858500.png)
故障后
业务表现:将积压的数据和当前未插入的数据同时插入,MongoDB以近两倍的速率进行处理。
实例状态:MongoDB自动恢复节点主从关系,将权重较高的节点重新选举为主节点,若权重一致,则保持不变。
![](https://qcloudimg.tencent-cloud.cn/image/document/ca10c31cb52dd11b716b8477bc5a3493.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/ca10c31cb52dd11b716b8477bc5a3493.png)
结论
完成后检查数据库数据正常,故障过程业务无感知,整体情况符合预期。
主从切换![](https://qcloudimg.tencent-cloud.cn/image/document/46674782d0df3a07597f9bad4bde7b95.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/46674782d0df3a07597f9bad4bde7b95.png)
故障前
业务表现:大批量数据持续插入数据库,MongoDB以稳定的速率处理。
实例状态:以广州四区节点为主节点,广州七区节点为从节点,广州六区为 Hidden 节点。
![](https://qcloudimg.tencent-cloud.cn/image/document/c607f93f29fa132d06d74722a031661b.png)
故障中
业务表现:节点可用区发生切换,业务发生与节点重启类似的现象,存在短时间内的数据积压。
实例状态:根据动作模式优先从实例从节点中选择同可用区或跨可用区节点,将其提升为主节点,原主节点作为从节点被重新拉起。
![](https://qcloudimg.tencent-cloud.cn/image/document/4faf8b5198353444e3951411113312e9.png)
故障后
业务表现:发生可用区切换,业务正常运行,数据插入动作和数据查询动作不受影响。
手动故障恢复
实例状态:执行故障恢复动作,恢复至故障开始前状态。
![](https://qcloudimg.tencent-cloud.cn/image/document/5640a1b77de8e717a1a766e517e31ee1.png)
结论
故障过程业务无感知,数据库数据完整,整体表现正常,符合预期。