背景
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 实例。
2. 添加演练动作。
MongoDB 主节点重启:模拟 MongoDB 主节点故障重启的过程对业务的影响以及 MongoDB 的 HA 机制。
MongoDB 主从切换:模拟 MongoDB 节点主从切换过程和切换后产生节点 IP 发生变更的场景,动作支持优先同可用区切换和优先跨可用区切换两种执行模式。
步骤3:根据需求添加监控指标
步骤4:进入演练详情,执行演练
结果观测
通过脚本模拟生产环境用户行为,观察故障前,故障中,故障后三个时态下的业务响应。
主节点重启
故障前
业务表现:大批量数据持续插入数据库,MongoDB以稳定的速率处理。
实例状态:主节点、从节点、Hidden 节点均已配置并生效。
故障中
业务表现:脚本中插入失败,可通过配置驱动的重试机制进行重试,同时检测到Mongo节点异常,出现短时间的数据积压。
实例状态:从节点中选择一个节点提主,由于 Hidden 节点不参与选举,则选择原从节点作为主节点,原主节点将作为从节点被重新拉起。
故障后
业务表现:将积压的数据和当前未插入的数据同时插入,MongoDB以近两倍的速率进行处理。
实例状态:MongoDB自动恢复节点主从关系,将权重较高的节点重新选举为主节点,若权重一致,则保持不变。
结论
完成后检查数据库数据正常,故障过程业务无感知,整体情况符合预期。
主从切换
故障前
业务表现:大批量数据持续插入数据库,MongoDB以稳定的速率处理。
实例状态:主节点、从节点、Hidden 节点均已配置并生效。
故障中
业务表现:节点可用区发生切换,业务发生与节点重启类似的现象,存在短时间内的数据积压。
实例状态:根据动作模式优先从实例从节点中选择同可用区或跨可用区节点,将其提升为主节点,原主节点作为从节点被重新拉起。
故障后
业务表现:发生可用区切换,业务正常运行,数据插入动作和数据查询动作不受影响。
手动故障恢复
实例状态:执行故障恢复动作,恢复至故障开始前状态。
结论
故障过程业务无感知,数据库数据完整,整体表现正常,符合预期。