开源全链路压测平台Takin实践笔记
为什么打算使用Takin
具备从客户端到服务端一站式流量发起与诊断功能,目前还没看到其他开源产品。
1.探针方式接入,不需要修改业务代码;
2.链路治理:能够帮助业务和微服务架构分析业务链路,以技术方式获得功能视角的链路信息;
3.性能瓶颈定位:性能测试结果可以直接展现整个链路中存在性能瓶颈的微服务架构节点;
4.数据隔离:可以在不污染生产环境数据和日志的情况下实施性能测试
Takin核心原理图
(takin社区文档提供)
使用效果图
文章结构分为三大部分
takin平台部署
探针介入
demo演示
本文结合takin官方说明文档整理,部署过程相对较长,过程需要认真仔细,由于不允许使用外部链接,部分用的图片说明,更详细资料文末加群二维码。
一.Takin平台部署
docker环境准备
准备好一个装有docker的服务器,个人建议最好用一台空的linux服务器搭建,平台会涉及到多个端口,部分是公共服务端口,也不建议自行修改端口,在不了解内部配置的情况下,很容易出现问题,我这边是基于centos7安装,首先自行安装好docker。
[root@cctester ~]# docker -v
Docker version 17.12.0-ce, build c97c6d6
docker环境配置
vim /etc/docker/daemon.json
更新为:
配置生效:
systemctl daemon-reload
下载docker镜像
docker pull下载
下载完成之后可查看镜像。
启动docker镜像
-d是后台启动,-p是需要开放的端口,容器运行初始化的时候需要安装一些必要的组件需要十分钟的样子,-d可以忽略后台组件的安装信息,如果想要查看安装信息可以去除-d参数。
最好在启动之前查看下端口号是否被占用(netstat -ano|grep 端口号)
启动成功后:
更改配置
进入容器,可以通过docker ps查看容器id,然后进入容器,其中CONTAINER ID 为容器id号
docker exec -it 6bc8daa10063 bash
[root@cctester ~]# docker exec -it 6bc8daa10063 bash
[root@6bc8daa10063 data]# ll
total 1339344
-rw-r--r-- 1 root root 6285 5月 14 15:09 admin.conf
-rw-r--r-- 1 root root 1458 5月 14 15:41 alone_init.sql
-rw-r--r-- 1 root root 59841460 5月 14 12:32 amdb-app-1.0-SNAPSHOT.jar
-rw-r--r-- 1 root root 451 5月 14 16:07 amdb.env.conf
-rw-r--r-- 1 root root 646 5月 14 15:39 amdb_install.sh
-rw-r--r-- 1 root root 28971 5月 14 15:10 amdb.sql
-rw-r--r-- 1 root root 54292848 6月 4 14:30 amdb.zip
drwxr-xr-x 7 root root 4096 7月 18 20:23 apache-zookeeper-3.5.9-bin
-rw-r--r-- 1 root root 9623007 5月 14 16:21 apache-zookeeper-3.5.9-bin.tar.gz
drwxr-xr-x 5 root root 4096 7月 18 20:24 apps
-rw-r--r-- 1 root root 1882 5月 14 21:18 apps_install.sh
配置serverUrl
修改serverUrl
vi /data/apps/dist/tro/index.html
重启Nginx服务
nginx -s reload
配置sugre-deploy启动命令
tip: sugre-deploy为大数据平台模块,我们先把原来的进程删了,修改配置后重启
kill sugre-deploy
进入容器后
[root@30e961d36c91 data]# ps -ef | grep surge
root 4336 1 66 17:48 ? 00:03:20 java -jar surge-deploy-1.0-jar-with-dependencies.jar {"172.17.0.2":"192.168.1.138"} root 4574 18 0 17:53 ? 00:00:00 grep --color=auto surge
[root@30e961d36c91 data]# kill -9 4336
[root@30e961d36c91 data]# ps -ef | grep surge
root 4582 18 0 17:54 ? 00:00:00 grep --color=auto surge
更改sugre-deploy的启动命令
vi /data/install.sh
将sugre-deploy的启动命令参数“172.17.0.2”对应的value更改为宿主机的IP,并保存,
宿主机内网ip
重启sugre-deploy
进入压测控制台
宿主机IP/tro/#/login
示例如下
默认账号密码:账号:admin 密码:pamirs@2020
以上,恭喜您,成功安装了Takin,接下来就可以开启压测之旅啦~
二.探针接入
下载Takin准备的应用demo
解压:
tar xvf easydemo_0712.tgz
更新数据库配置
在easydemo/demoEnv.conf里更新配置
配置demo应用的数据库连接
MYSQLURL=39.104.xx.xxx
PORT=3306
USERNAME=root
PASSWD=shulie@2020
启动demo
./demoInstall.sh
执行成功会显示应用的pid号
如果这里报错 line 5:create_table_sql:no such file or directory
是因为这个脚本里有mysql命令去创建表,所以要么本机装个mysql客户端,要么修改一下脚本,只启动应用,单独去mysql那边建下表
如果启动不成功,去查看/easydemo/app目录下两个应用出现的日志
linkAgent接入
agent接入到应用后,需要与压测控制台进行数据传输。二者的网络需要打通。
进入opt目录
mkdir simulator-agent
tar xvf simulator-agent.tar -C simulator-agent
这样就是都解压放到这个目录 opt/simulator-agent
接入到demo应用
进入文件夹,配置更新
agent.properties
vi simulator-agent/config/agent.properties
simulator.properties
vi simulator-agent/agent/simulator/config/simulator.properties
进入到easydemo,修改启动脚本
原生启动命令:gateway.sh
start(){ nohup java -jar easydemo-gateway.jar 2>&1 & } gateway.log
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
三.demo演示
查看easydemo里的HTTP接口,选择带有写入操作的接口
curl --location --request POST 'ht宿主机ip:28881/gateway/api/register'
进行压测。
完成这步之前,先确认数据库表有没有建立,库表语句贴一下
use easydemo_db;
CREATE TABLE `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;
链路简介
压测对象:
curl --location --request POST '宿主机ip:28881/gateway/api/register' --header 'Content-Type: application/json' --data '{"mobile":"15558172233","password":"123456","nickName":"name-1000033","email":"[email protected]","birthDay":"2000-11-05","provinceName":"浙江","cityName":"杭州"}'
服务端应用:easydemo-gateway-1.0.0
http的path:/gateway/api/register
要压测的接口,称为业务活动
业务活动的服务名组成:http的path +
demo里的业务活动即为:/gateway/api/register
链路图
新增业务活动
这里的服务填 请求的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":"[email protected]","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;
压测平台配置影子表
数据隔离验证
数据隔离和安全隔离都配置完成后,可发起压测流量进行验证
./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天,过期会自动清除;
选择耗时较长的请求,查看链路调用详情