具备从客户端到服务端一站式流量发起与诊断功能,目前还没看到其他开源产品。
1.探针方式接入,不需要修改业务代码;
2.链路治理:能够帮助业务和微服务架构分析业务链路,以技术方式获得功能视角的链路信息;
3.性能瓶颈定位:性能测试结果可以直接展现整个链路中存在性能瓶颈的微服务架构节点;
4.数据隔离:可以在不污染生产环境数据和日志的情况下实施性能测试
(takin社区文档提供)
准备好一个装有docker的服务器,个人建议最好用一台空的linux服务器搭建,平台会涉及到多个端口,部分是公共服务端口,也不建议自行修改端口,在不了解内部配置的情况下,很容易出现问题,我这边是基于centos7安装,首先自行安装好docker。
[root@cctester ~]# docker -vDocker version 17.12.0-ce, build c97c6d6
修改 Docker 镜像地址为阿里云:
vim /etc/docker/daemon.json
更新为:
更新为:
{ "registry-mirrors": ["<https://q2gr04ke.mirror.aliyuncs.com>"] }
配置生效:
systemctl daemon-reload
docker pull下载
docker pull registry.cn-hangzhou.aliyuncs.com/forcecop/forcecop:v1.0.0
下载完成之后可查看镜像。
docker images
[root@cctester ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/forcecop/forcecop v1.0.0 0bdccc5f76a6 5 weeks ago 1.82GB
docker run -d -p 80:80 -p 2181:2181 -p 3306:3306 -p 6379:6379 -p 8086:8086 -p 9000:9000 -p 10032:10032 -p 6628:6628 -p 8000:8000 -p 6627:6627 -p 8888:8888 -p 29900-29999:29900-29999 registry.cn-hangzhou.aliyuncs.com/forcecop/forcecop:v1.0.0
-d是后台启动,-p是需要开放的端口,容器运行初始化的时候需要安装一些必要的组件需要十分钟的样子,-d可以忽略后台组件的安装信息,如果想要查看安装信息可以去除-d参数。
最好在启动之前查看下端口号是否被占用(netstat -ano|grep 端口号)
启动成功后:
[root@cctester ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bc8daa10063 registry.cn-hangzhou.aliyuncs.com/forcecop/forcecop:v1.0.0 "/bin/bash /data/ins…" 2 days ago Up 2 days 0.0.0.0:80->80/tcp, 0.0.0.0:2181->2181/tcp, 0.0.0.0:3306->3306/tcp, 0.0.0.0:6379->6379/tcp, 0.0.0.0:6627-6628->6627-6628/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8086->8086/tcp, 0.0.0.0:8888->8888/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:10032->10032/tcp, 0.0.0.0:29900-29999->29900-29999/tcp relaxed_goldberg
docker exec -it 6bc8daa10063 bash
[root@cctester ~]# docker exec -it 6bc8daa10063 bash[root@6bc8daa10063 data]# lltotal 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.zipdrwxr-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.gzdrwxr-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
vi /data/apps/dist/tro/index.html
将serverUrl配置成服务器本机IP地址,一般是宿主机外网ip;
nginx -s reload
tip: sugre-deploy为大数据平台模块,我们先把原来的进程删了,修改配置后重启
kill sugre-deploy
进入容器后
[root@30e961d36c91 data]# ps -ef | grep surgeroot 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
vi /data/install.sh
将sugre-deploy的启动命令参数“172.17.0.2”对应的value更改为宿主机的IP,并保存,
宿主机内网ip
重启sugre-deploy
nohup java -jar surge-deploy-1.0-jar-with-dependencies.jar '{"172.17.0.2":"172.21.60.xxx"}' > surge.out 2>&1 &
输入压测控制台地址:
宿主机IP/tro/#/login
示例如下
默认账号密码:账号:admin 密码:pamirs@2020
以上,恭喜您,成功安装了Takin,接下来就可以开启压测之旅啦~
解压:
tar xvf easydemo_0712.tgz
在easydemo/demoEnv.conf里更新配置
将demoEnv.conf里的数据库相关配置更改为您的数据源地址
MYSQLURL=39.104.xx.xxxPORT=3306USERNAME=rootPASSWD=shulie@2020
./demoInstall.sh
执行成功会显示应用的pid号 如果这里报错 line 5:create_table_sql:no such file or directory 是因为这个脚本里有mysql命令去创建表,所以要么本机装个mysql客户端,要么修改一下脚本,只启动应用,单独去mysql那边建下表
如果启动不成功,去查看/easydemo/app目录下两个应用出现的日志
agent接入到应用后,需要与压测控制台进行数据传输。二者的网络需要打通。
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
进入文件夹,配置更新
vi simulator-agent/config/agent.properties
配置的宿主机内网地址
vi simulator-agent/agent/simulator/config/simulator.properties
tro.web.url 改成宿主机ip详见【安装部署】-【docker方式安装部署】里的压测控制台地址
原生启动命令: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
查看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":"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
对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脚本中的文件调用路径仅使用文件名即可
进入压测平台->压测场景->新增场景
在生产环境做压测时,为了确保业务应用不会受到影响,可设置某些指标出现异常结果时进行报警提醒或立即终止压测,
可选择全部或单个业务活动; 选择指标,可从TPS、RT、成功率、SA中选择; 设置触发条件和阈值; 点击➕可添加多条SLA规则;
保存完压测场景之后,就可以在列表点击启动压测了。
在压测场景列表选择压测场景,启动压测
在压测过程中,需要实时关注压测的指标变化情况,以便于能对压测做出实时性的判断和应急操作。压测实况正是在压测过程中对压测链路进行实时监控的可视化界面,压测实况的全部数据都会保存在压测报告中,也可以手动停止压测,直接到压测报告中查看完整数据。
在压测结束后,系统会自动生成一份压测报告,将本次压测所产生的数据进行记录和存档,可随时通过查看报告来回溯压测时的性能指标变化情况,分析性能瓶颈与定位定能问题。
可通过压测场景-查看报告按钮查看,也可以通过菜单路径:压测管理>压测报告查看。
报告详情页包括:压测结果总览、问题分析、压测概览、压测明细、容量水位、告警明细、请求流量明细等。
压测结论和结果指标:压测是否通过、具体的告警数量、请求总数、最大并发、TPS、平均RT、成功率、SA;
可查看压测全局或单个业务活动的TPS、RT、成功率、SA的指标趋势。
可查看各个业务活动的具体压测明细指标,包括请求数、平均TPS的实际与目标值、平均RT的实际与目标值、请求成功率的实际与目标值、SA的目标与实际值、最大TPS、最大RT、最小RT;
压测过程中根据SLA设定触发的压测告警信息
记录压测过程中所有的具体请求明细数据,每个请求均拥有唯一的TraceID标识,可点击请求详情查看具体的请求采样日志,包括调用的接口服务、所属的应用、携带的参数、请求状态与本次请求的时间轴,日志信息保留3天,过期会自动清除;
选择耗时较长的请求,查看链路调用详情
有兴趣的同学加入社区讨论群,如果群失效添加微信cloud289,备注takin
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。