有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 混沌演练平台 > 故障动作库 > 云压测 > 云压测与混沌演练结合使用案例

背景

电子商务、社交媒体、在线游戏以及流媒体服务业务通常都需要处理大量的用户流量,伴随而来的是对服务器较大请求压力和数据的读写压力。例如,电商行业在双十一、618等促销活动期间,会出现大量用户同时访问电商网站的场景,如果网站无法处理这些压力流量,可能会导致网站崩溃、订单数据丢失、用户流失等问题,导致企业造成巨大损失。
基于上述背景,混沌演练平台接入了云压测平台(PTS)能力,提供其压测场景编排、超大施压、一键自动资源准备、实时系统评估等核心能力,帮助用户在混沌演练平台中更灵活地实施压测,检测服务稳定性的临界值。

演练计划

演练目标

以“游戏新服上线”为例,为确保业务正常运行,用户需要提前对若干项压力测试项进行演练,通过观察评估在不同的用户行为下服务器的响应时间、吞吐量、并发连接数等稳态指标来看系统稳定性是否满足要求。

演练设计

根据游戏的特点和玩家的行为习惯,梳理一系列测试用例,包括登录、创建角色、进行游戏任务、交易等操作,以不同用户量级进行请求;然后在常规用户行为流量和峰值流量下,观察以下测试项的系统反应,检验系统的稳定性和可靠性。可参考的常见测试项包括:
负载测试:负载测试是测试当负载逐渐增加时,系统各项性能指标的变化情况。
压力测试:验证在设定的性能瓶颈值下,系统能够提供的最大量级的服务。
并发测试:并发测试通过模拟用户并发访问,测试多用户同时访问同一个软件、同一个模块或者数据记录,测试软件的并发性能和是否出现死锁等问题。
突发测试:验证在不可抗力或其他意外情况下,导致服务资源崩溃宕机无法提供服务,测试跨地域或跨可用区部署是否能持续稳定提供服务。
对于一个通过 http 请求到 web 服务,web 服务读写数据的常见业务架构本文重点演示检验 web 服务和数据库组件的压力承受能力的混沌演练方案

演练实施

步骤1:创建测试场景

1. 登录 云压测 控制台。
2. 创建 PTS 项目。
3. 以脚本模式新建测试场景,配置并发数,压测时长,压测脚本的关键信息。


具体可参见官方文档 云压测快速入门



脚本参考1:PTS 兼容 JavaScript 脚本,如以 HTTP 请求为例,JS 脚本如下。更多压测脚本可参考云压测控制台脚本编辑器右侧的脚本常用模板示例。
// Send a post request
import http from 'pts/http';
import { check } from 'pts';

export default function () {
const resp = http.post(
'http://game.demo/create_character',
{
name: 'user001',
profession: 'zhanshi'
},
{
headers: {
'Content-Type': 'application/json',
},
}
);
}
脚本参考2:Web 服务 Demo。
from flask import Flask, request, jsonifyimport
pymysqlapp = Flask(__name__)

def create_conn():
conn = pymysql.connect(host='10.0.0.1',
user='root',
password='password',
db='mydb',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
return conn
@app.route('/create_character', methods=['POST'])
def create_user():
# 获取POST请求的JSON数据
data = request.get_json()
# 获取用户名和密码
name = data.get('name')
profession = data.get('profession')
# 连接数据库
conn = create_conn()
try:
with conn.cursor() as cursor:
# 创建角色
sql = "INSERT INTO `character` (`name`, `profession`) VALUES (%s, %s)"
cursor.execute(sql, (username, password))
conn.commit()
finally:
conn.close()
return jsonify({'status': 'success'}), 200
脚本参考3:减少请求链路,仅测试数据库的读写压力临界值。
// SQL API
import sql from 'pts/sql';

const db = new sql.Database(sql.MySQL, "user:passwd@tcp(ip:port)/database")

export default function () {
const randomName = 'zhangsan_' + Math.random().toString(36).substring(2, 8);
const sql = `insert into \\`character\\`(profession,name) values ('zhanshi', '${randomName}')`;
let result = db.exec(sql)
console.log(JSON.stringify(result));


let rows = db.query("SELECT * FROM `character` order by id desc limit 100");
console.log(JSON.stringify(rows));

}

步骤2:创建演练

1. 登录 混沌演练平台控制台,在左侧导航栏选择演练管理页面,单击新建演练

2. 单击左下角跳过,新建空白演练

3. 输入演练名称演练描述,完成基本信息填写后,单击下一步



4. 输入动作组名称动作组描述,选择实例类型为云资源 ,实例对象为云压测



5. 根据项目选择已经创建好的压测场景。



6. 选择执行云压测任务动作。



7. 添加新动作组,选择云资源 > CDB 对象类型


8. 添加云数据库 MySql 实例。

9. 选择故障动作:CDB 主节点故障,模拟当节点故障时,对服务吞吐量和响应速率的影响。


10. 单击提交,完成创建演练。


步骤3:执行演练

1. 进入演练详情,在动作组中执行压测动作。


2. 实时观察压测反馈
观察稳态指标和监控表现,通过日志定位发现可能出现的业务问题,解决在高并发场景下导致业务的响应效率变慢的问题。


3. 其他:通过自动化测试模拟常规流量,验证其他云服务能力。
例如,进行压测过程中执行 CDB 主节点故障动作,模拟 MySQL 主节点异常宕机,观察业务反应,具体设计可参见 云数据库 MySQL 主节点故障演练案例