前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开源全链路压测平台Takin实践笔记

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

作者头像
老_张
发布2021-08-06 14:29:40
2.5K0
发布2021-08-06 14:29:40
举报
文章被收录于专栏:老张的求知思考世界

为什么打算使用Takin

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

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

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

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

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

Takin核心原理图

(takin社区文档提供)

使用效果图

文章结构分为三大部分

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

本文结合takin官方说明文档整理,部署过程相对较长,过程需要认真仔细,由于不允许使用外部链接,部分用的图片说明,更详细资料文末加群二维码

一.Takin平台部署

docker环境准备

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

代码语言:javascript
复制
[root@cctester ~]# docker -v
Docker version 17.12.0-ce, build c97c6d6

docker环境配置

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

代码语言:javascript
复制
vim /etc/docker/daemon.json

更新为:

配置生效:

代码语言:javascript
复制
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

代码语言:javascript
复制
[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

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

重启Nginx服务

代码语言:javascript
复制
nginx -s reload

配置sugre-deploy启动命令

tip: sugre-deploy为大数据平台模块,我们先把原来的进程删了,修改配置后重启

代码语言:javascript
复制
kill sugre-deploy

进入容器后

代码语言:javascript
复制
[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

进入压测控制台

输入压测控制台地址:

代码语言:javascript
复制
宿主机IP/tro/#/login

示例如下

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

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

二.探针接入

下载Takin准备的应用demo

解压:

代码语言:javascript
复制
tar xvf easydemo_0712.tgz
更新数据库配置

在easydemo/demoEnv.conf里更新配置

配置demo应用的数据库连接

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

代码语言:javascript
复制
MYSQLURL=39.104.xx.xxx
PORT=3306
USERNAME=root
PASSWD=shulie@2020

启动demo

代码语言:javascript
复制
./demoInstall.sh

执行成功会显示应用的pid号 如果这里报错 line 5:create_table_sql:no such file or directory 是因为这个脚本里有mysql命令去创建表,所以要么本机装个mysql客户端,要么修改一下脚本,只启动应用,单独去mysql那边建下表

如果启动不成功,去查看/easydemo/app目录下两个应用出现的日志

linkAgent接入

agent接入到应用后,需要与压测控制台进行数据传输。二者的网络需要打通。

进入opt目录

代码语言:javascript
复制
mkdir simulator-agent
tar xvf simulator-agent.tar -C simulator-agent

这样就是都解压放到这个目录 opt/simulator-agent

接入到demo应用

进入文件夹,配置更新

代码语言:javascript
复制
agent.properties
vi simulator-agent/config/agent.properties

配置的宿主机内网地址

代码语言:javascript
复制
simulator.properties
vi simulator-agent/agent/simulator/config/simulator.properties

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

进入到easydemo,修改启动脚本

原生启动命令:gateway.sh

代码语言:javascript
复制
start(){     nohup  java -jar easydemo-gateway.jar >> gateway.log 2>&1 & }

linkAgent启动方式 gatewayLinkAgent.sh

代码语言:javascript
复制
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接口,选择带有写入操作的接口

代码语言:javascript
复制
curl --location --request POST 'ht宿主机ip:28881/gateway/api/register'

进行压测。

完成这步之前,先确认数据库表有没有建立,库表语句贴一下

代码语言:javascript
复制
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;

链路简介

压测对象:

代码语言:javascript
复制
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":"杭州"}'
代码语言:javascript
复制
服务端应用: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

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

代码语言:javascript
复制
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/进入相应的应用里,可查看日志文件

影子库表

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

线下建影子表

代码语言:javascript
复制
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天,过期会自动清除;

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老张的求知思考世界 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么打算使用Takin
  • Takin核心原理图
  • 使用效果图
  • 一.Takin平台部署
    • docker环境准备
      • docker环境配置
        • 下载docker镜像
          • 启动docker镜像
            • 更改配置
              • 进入容器,可以通过docker ps查看容器id,然后进入容器,其中CONTAINER ID 为容器id号
            • 配置serverUrl
              • 修改serverUrl
              • 重启Nginx服务
              • 配置sugre-deploy启动命令
              • 更改sugre-deploy的启动命令
          • 进入压测控制台
          • 二.探针接入
            • 下载Takin准备的应用demo
              • 启动demo
              • linkAgent接入
                • 进入opt目录
                  • 接入到demo应用
                    • 重启应用
                  • 验证
                  • 三.demo演示
                    • 链路简介
                      • 链路图
                    • 新增业务活动
                    • 数据隔离&数据安全配置
                      • 白名单
                        • 影子库表
                          • 线下建影子表
                        • 数据隔离验证
                        • 压测准备
                          • JMeter脚本
                            • 压测流量文件
                              • 上传脚本到压测平台
                                • 创建压测场景
                                  • 新增场景
                                  • 压测SLA
                              • 压测
                                • 压测实况
                                  • 压测报告
                                    • 压测结果总览
                                      • 压测概览
                                        • 压测明细
                                          • 告警明细
                                            • 请求流量明细
                                            相关产品与服务
                                            容器镜像服务
                                            容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档