开源全链路压测平台Takin实践笔记
为什么打算使用Takin
具备从客户端到服务端一站式流量发起与诊断功能,目前还没看到其他开源产品。
1.探针方式接入,不需要修改业务代码;
2.链路治理:能够帮助业务和微服务架构分析业务链路,以技术方式获得功能视角的链路信息;
3.性能瓶颈定位:性能测试结果可以直接展现整个链路中存在性能瓶颈的微服务架构节点;
4.数据隔离:可以在不污染生产环境数据和日志的情况下实施性能测试
Takin核心原理图
默认账号密码:账号:admin 密码:pamirs@2020
以上,恭喜您,成功安装了Takin,接下来就可以开启压测之旅啦~
二.探针接入
下载Takin准备的应用demo
解压:
tar xvf easydemo_0712.tgz
更新数据库配置
在easydemo/demoEnv.conf里更新配置
配置demo应用的数据库连接
将demoEnv.conf里的数据库相关配置更改为您的数据源地址
MYSQLURL=39.104.xx.xxxPORT=3306USERNAME=rootPASSWD=shulie@2020
启动demo
./demoInstall.sh
执行成功会显示应用的pid号
如果这里报错 line 5:create_table_sql:no such file or directory
是因为这个脚本里有mysql命令去创建表,所以要么本机装个mysql客户端,要么修改一下脚本,只启动应用,单独去mysql那边建下表
如果启动不成功,去查看/easydemo/app目录下两个应用出现的日志
linkAgent接入
agent接入到应用后,需要与压测控制台进行数据传输。二者的网络需要打通。
进入opt目录
curl -O https://shulie-main-pass.oss-cn-hangzhou.aliyuncs.com/open-source/simulator-agent.ta
mkdir simulator-agent
mkdir simulator-agenttar xvf simulator-agent.tar -C simulator-agent
这样就是都解压放到这个目录 opt/simulator-agent
接入到demo应用
进入文件夹,配置更新
vi simulator-agent/config/agent.properties
进入到easydemo,修改启动脚本
原生启动命令:gateway.sh
start(){ nohup java -jar easydemo-gateway.jar >> gateway.log 2>&1 & }
linkAgent启动方式 gatewayLinkAgent.sh
start(){DIR="/opt"JAVA_OPTS="${JAVA_OPTS} -Xbootclasspath/a:$JAVA_HOME/lib/tools.jar"JAVA_OPTS="${JAVA_OPTS} -javaagent:/${DIR}/simulator-agent/simulator-launcher-instrument.jar"JAVA_OPTS="${JAVA_OPTS} -javaagent:/${DIR}/simulator-agent/bootstrap/transmittable-thread-local-2.12.1.jar"JAVA_OPTS="${JAVA_OPTS} -Dsimulator.delay=10"JAVA_OPTS="${JAVA_OPTS} -Dsimulator.unit=SECONDS"JAVA_OPTS="${JAVA_OPTS} -Dpradar.project.name=easydemo-gateway-1.0.0"JAVA_OPTS="${JAVA_OPTS} -Djdk.attach.allowAttachSelf=true"nohup java ${JAVA_OPTS} -XX:+PrintGCTimeStamps -Xloggc:gc.log -jar easydemo-gateway.jar >> gateway.log 2>&1 &}
其中
DIR请填写探针包解压的目录
pradar.project.name请填写业务应用名称,全局唯一
同理更新usercenter应用的启动参数:usercenterLinkAgent.sh,参考gateway即可。
重启应用
在app应用下 ./demoInstallLinkAgent.sh
验证
进入压测控制台:宿主机ip/tro/#/appManage
压测对象:
curl --location --request POST '宿主机ip:28881/gateway/api/register' --header 'Content-Type: application/json' --data '{"mobile":"15558172233","password":"123456","nickName":"name-1000033","email":"1000000033@qq.com","birthDay":"2000-11-05","provinceName":"浙江","cityName":"杭州"}'
服务端应用:easydemo-gateway-1.0.0
http的path:/gateway/api/register
要压测的接口,称为业务活动
业务活动的服务名组成:http的path +# +请求方式
demo里的业务活动即为:/gateway/api/register#POST
链路图
新增业务活动
这里的服务填 请求的path+#+请求方式, 这里是/gateway/api/register#POST
数据隔离&数据安全配置
白名单配置
白名单是压测流量是否可以调用某个接口的校验机制,可有效防止压测流量泄露至未接入的应用
1.加入白名单:加入白名单代表压测流量可调用该接口
2.取消白名单:取消白名单代表压测流量不可调用该接口
白名单
easydemo-gateway-1.0.0 请求了easydemo-usercenter-1.0.0 的接口:http://宿主机ip:28882/user-center/user/add
进入easydemo-gateway-1.0.0应用详情,配置白名单/user-center/user/add
curl '宿主机ip:28881/gateway/api/register' -X POST -d '{"mobile":"15558172233","password":"123456","nickName":"name-1000033","email":"1000000033@qq.com","birthDay":"2000-11-05","provinceName":"浙江","cityName":"杭州"}' --header "Content-Type: application/json" --header "User-Agent:PerfomanceTest"
–header “User-Agent:PerfomanceTest” 注意,此处带上了压测标记,以区分压测流量和正式流量。若传入了压测标记,linkAgent会进行数据隔离的处理。
日志目录/opt/logs_pradar/进入相应的应用里,可查看日志文件
影子库表
对于有写操作的接口,若未配置影子库表,发起压测流量时,会报错:提示未进行影子库表的配置。
这里我们使用影子表模式。
线下建影子表
use easydemo_db; CREATE TABLE `pt_t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `mobile` varchar(16) NOT NULL COMMENT '手机号', `password` varchar(16) NOT NULL COMMENT '登录密码', `nick_name` varchar(32) DEFAULT NULL COMMENT '昵称', `email` varchar(32) DEFAULT NULL COMMENT '邮箱', `birth_day` varchar(16) DEFAULT NULL COMMENT '生日', `province_name` varchar(64) DEFAULT NULL COMMENT '省', `city_name` varchar(64) DEFAULT NULL COMMENT '市', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
压测平台配置影子表
进入easydemo-usercenter-1.0.0应用详情,配置影子表。
数据库URL:填写应用使用的数据源地址
影子表:填写接口用到的表,加上PT_前缀
数据隔离验证
数据隔离和安全隔离都配置完成后,可发起压测流量进行验证
./curl.sh
压测准备
JMeter脚本
对curl --location --request POST '宿主机ip:28881/gateway/api/register'准备压测JMeter脚本
注:需使用并发线程组
压测流量文件
若要进行大流量的压测,先准备好数据csv文件,并上传到JMeter脚本
上传脚本到压测平台
进入压测平台->脚本管理->新增脚本
注意:JMeter脚本、jar包、在JMeter里的【csv data set config】/【csv数据文件设置】上传的csv文件,请上传到上面的文件框;
上传:
附注:JMeter脚本中的url若使用了附件类型的参数,如图片等,请上传到下面的附件文件框
文件将与JMeter脚本存储在同一目录下,
所以JMeter脚本中的文件调用路径仅使用文件名即可
创建压测场景
新增场景
进入压测平台->压测场景->新增场景
压测SLA
在生产环境做压测时,为了确保业务应用不会受到影响,可设置某些指标出现异常结果时进行报警提醒或立即终止压测,
可选择全部或单个业务活动;
选择指标,可从TPS、RT、成功率、SA中选择;
设置触发条件和阈值;
点击➕可添加多条SLA规则;
保存完压测场景之后,就可以在列表点击启动压测了。
压测
在压测场景列表选择压测场景,启动压测
压测实况
在压测过程中,需要实时关注压测的指标变化情况,以便于能对压测做出实时性的判断和应急操作。压测实况正是在压测过程中对压测链路进行实时监控的可视化界面,压测实况的全部数据都会保存在压测报告中,也可以手动停止压测,直接到压测报告中查看完整数据。
压测报告
在压测结束后,系统会自动生成一份压测报告,将本次压测所产生的数据进行记录和存档,可随时通过查看报告来回溯压测时的性能指标变化情况,分析性能瓶颈与定位定能问题。
可通过压测场景-查看报告按钮查看,也可以通过菜单路径:压测管理>压测报告查看。
报告详情页包括:压测结果总览、问题分析、压测概览、压测明细、容量水位、告警明细、请求流量明细等。
压测结果总览
压测结论和结果指标:压测是否通过、具体的告警数量、请求总数、最大并发、TPS、平均RT、成功率、SA;
压测概览
可查看压测全局或单个业务活动的TPS、RT、成功率、SA的指标趋势。
压测明细
可查看各个业务活动的具体压测明细指标,包括请求数、平均TPS的实际与目标值、平均RT的实际与目标值、请求成功率的实际与目标值、SA的目标与实际值、最大TPS、最大RT、最小RT;
告警明细
压测过程中根据SLA设定触发的压测告警信息
请求流量明细
记录压测过程中所有的具体请求明细数据,每个请求均拥有唯一的TraceID标识,可点击请求详情查看具体的请求采样日志,包括调用的接口服务、所属的应用、携带的参数、请求状态与本次请求的时间轴,日志信息保留3天,过期会自动清除;
选择耗时较长的请求,查看链路调用详情
有兴趣的同学加入社区讨论群,如果群失效添加微信cloud289,备注takin