【开源实践笔记02】全链路压测平台Takin实践笔记

为什么打算使用Takin

具备从客户端到服务端一站式流量发起与诊断功能,目前还没看到其他开源产品。

1.探针方式接入,不需要修改业务代码;

2.链路治理:能够帮助业务和微服务架构分析业务链路,以技术方式获得功能视角的链路信息;

3.性能瓶颈定位:性能测试结果可以直接展现整个链路中存在性能瓶颈的微服务架构节点;

4.数据隔离:可以在不污染生产环境数据和日志的情况下实施性能测试

Takin核心原理图

【开源实践笔记02】全链路压测平台Takin实践笔记

(takin社区文档提供)

使用效果图

【开源实践笔记02】全链路压测平台Takin实践笔记
结果

文章结构分为三大部分

  1. takin平台部署
  2. 探针介入
  3. demo演示

本文结合takin官方说明文档整理,部署过程相对较长,过程需要认真仔细。

一.Takin平台部署

docker环境准备

准备好一个装有docker的服务器,个人建议最好用一台空的linux服务器搭建,平台会涉及到多个端口,部分是公共服务端口,也不建议自行修改端口,在不了解内部配置的情况下,很容易出现问题,我这边是基于centos7安装,首先自行安装好docker。

[root@cctester ~]# docker -v
Docker version 17.12.0-ce, build c97c6d6

docker环境配置

修改 Docker 镜像地址为阿里云:

vim /etc/docker/daemon.json

更新为:

{   "registry-mirrors": ["<https://q2gr04ke.mirror.aliyuncs.com>"] }

配置生效:

systemctl daemon-reload

复制

下载docker镜像

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镜像

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 端口号)

启动成功后:

【开源实践笔记02】全链路压测平台Takin实践笔记

更改配置

进入容器,可以通过docker ps查看容器id,然后进入容器,其中CONTAINER ID 为容器id号

[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

配置serverUrl

修改serverUrl

vi /data/apps/dist/tro/index.html

将serverUrl配置成服务器本机IP地址,一般是宿主机外网ip;

配置serverUrl

修改serverUrl

vi /data/apps/dist/tro/index.html

将serverUrl配置成服务器本机IP地址,一般是宿主机外网ip;

【开源实践笔记02】全链路压测平台Takin实践笔记
配置修改

重启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,并保存,

【开源实践笔记02】全链路压测平台Takin实践笔记
配置修改

宿主机内网ip

【开源实践笔记02】全链路压测平台Takin实践笔记
宿主机内网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

复制

示例如下

【开源实践笔记02】全链路压测平台Takin实践笔记

默认账号密码:账号:admin 密码:pamirs@2020

【开源实践笔记02】全链路压测平台Takin实践笔记

以上,恭喜您,成功安装了Takin,接下来就可以开启压测之旅啦~

二.探针接入

下载Takin准备的应用demo

解压:

tar xvf easydemo_0712.tgz

更新数据库配置

在easydemo/demoEnv.conf里更新配置

配置demo应用的数据库连接

将demoEnv.conf里的数据库相关配置更改为您的数据源地址

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目录

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应用

进入文件夹,配置更新

agent.properties
vi simulator-agent/config/agent.properties
【开源实践笔记02】全链路压测平台Takin实践笔记
修改配置

配置的宿主机内网地址

simulator.properties
vi simulator-agent/agent/simulator/config/simulator.properties

tro.web.url 改成宿主机ip详见【安装部署】-【docker方式安装部署】里的压测控制台地址

【开源实践笔记02】全链路压测平台Takin实践笔记

进入到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

【开源实践笔记02】全链路压测平台Takin实践笔记

三.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;

链路简介

【开源实践笔记02】全链路压测平台Takin实践笔记

压测对象:

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

链路图

【开源实践笔记02】全链路压测平台Takin实践笔记
架构图

新增业务活动

【开源实践笔记02】全链路压测平台Takin实践笔记
【开源实践笔记02】全链路压测平台Takin实践笔记

这里的服务填 请求的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

【开源实践笔记02】全链路压测平台Takin实践笔记

若未添加白名单,发起压测流量时,会报错;

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/进入相应的应用里,可查看日志文件

【开源实践笔记02】全链路压测平台Takin实践笔记

影子库表

对于有写操作的接口,若未配置影子库表,发起压测流量时,会报错:提示未进行影子库表的配置。 这里我们使用影子表模式。

线下建影子表

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_前缀

【开源实践笔记02】全链路压测平台Takin实践笔记

数据隔离验证

数据隔离和安全隔离都配置完成后,可发起压测流量进行验证

./curl.sh

【开源实践笔记02】全链路压测平台Takin实践笔记

压测准备

JMeter脚本

对curl –location –request POST ‘宿主机ip:28881/gateway/api/register’准备压测JMeter脚本

注:需使用并发线程组

【开源实践笔记02】全链路压测平台Takin实践笔记
线程组配置
【开源实践笔记02】全链路压测平台Takin实践笔记
脚本请求头
【开源实践笔记02】全链路压测平台Takin实践笔记
脚本请求体

压测流量文件

若要进行大流量的压测,先准备好数据csv文件,并上传到JMeter脚本

【开源实践笔记02】全链路压测平台Takin实践笔记
参数化文件

上传脚本到压测平台

进入压测平台->脚本管理->新增脚本

注意:JMeter脚本、jar包、在JMeter里的【csv data set config】/【csv数据文件设置】上传的csv文件,请上传到上面的文件框;

【开源实践笔记02】全链路压测平台Takin实践笔记
参数化设置

上传:

【开源实践笔记02】全链路压测平台Takin实践笔记

附注:JMeter脚本中的url若使用了附件类型的参数,如图片等,请上传到下面的附件文件框 文件将与JMeter脚本存储在同一目录下, 所以JMeter脚本中的文件调用路径仅使用文件名即可

创建压测场景

新增场景

进入压测平台->压测场景->新增场景

【开源实践笔记02】全链路压测平台Takin实践笔记

压测SLA

在生产环境做压测时,为了确保业务应用不会受到影响,可设置某些指标出现异常结果时进行报警提醒或立即终止压测,

可选择全部或单个业务活动; 选择指标,可从TPS、RT、成功率、SA中选择; 设置触发条件和阈值; 点击➕可添加多条SLA规则;

【开源实践笔记02】全链路压测平台Takin实践笔记

保存完压测场景之后,就可以在列表点击启动压测了。

压测

在压测场景列表选择压测场景,启动压测

【开源实践笔记02】全链路压测平台Takin实践笔记

压测实况

在压测过程中,需要实时关注压测的指标变化情况,以便于能对压测做出实时性的判断和应急操作。压测实况正是在压测过程中对压测链路进行实时监控的可视化界面,压测实况的全部数据都会保存在压测报告中,也可以手动停止压测,直接到压测报告中查看完整数据。

【开源实践笔记02】全链路压测平台Takin实践笔记

压测报告

在压测结束后,系统会自动生成一份压测报告,将本次压测所产生的数据进行记录和存档,可随时通过查看报告来回溯压测时的性能指标变化情况,分析性能瓶颈与定位定能问题。

可通过压测场景-查看报告按钮查看,也可以通过菜单路径:压测管理>压测报告查看。

报告详情页包括:压测结果总览、问题分析、压测概览、压测明细、容量水位、告警明细、请求流量明细等。

压测结果总览

压测结论和结果指标:压测是否通过、具体的告警数量、请求总数、最大并发、TPS、平均RT、成功率、SA;

【开源实践笔记02】全链路压测平台Takin实践笔记

压测概览

可查看压测全局或单个业务活动的TPS、RT、成功率、SA的指标趋势。

【开源实践笔记02】全链路压测平台Takin实践笔记

压测明细

可查看各个业务活动的具体压测明细指标,包括请求数、平均TPS的实际与目标值、平均RT的实际与目标值、请求成功率的实际与目标值、SA的目标与实际值、最大TPS、最大RT、最小RT;

【开源实践笔记02】全链路压测平台Takin实践笔记

告警明细

压测过程中根据SLA设定触发的压测告警信息

【开源实践笔记02】全链路压测平台Takin实践笔记

请求流量明细

记录压测过程中所有的具体请求明细数据,每个请求均拥有唯一的TraceID标识,可点击请求详情查看具体的请求采样日志,包括调用的接口服务、所属的应用、携带的参数、请求状态与本次请求的时间轴,日志信息保留3天,过期会自动清除;

【开源实践笔记02】全链路压测平台Takin实践笔记

选择耗时较长的请求,查看链路调用详情

【开源实践笔记02】全链路压测平台Takin实践笔记

本文转载自,已获取转载授权,【点击跳转查看原文】

(3)
上一篇 2021年8月13日 上午10:38
下一篇 2022年5月9日 上午11:48

相关推荐

发表评论

邮箱地址不会被公开。