共计 2097 个字符,预计需要花费 6 分钟才能阅读完成。
仿真环境是用线上流量转发到下线环境做线下实验。重点在于流量引入和数据 / 队列 /push,im 服务的隔离
全链路压测 是用大量与线上流量类似的流量请求到线上,检测故障。重点在于大量数据与真实流量的模拟,压测数据隔离
流量回放 可以用来定位问题,将有问题请求百分百还原到线下机器,对控制读写接口返回用线上真实 mock,可不断重复。重点在于线下请求劫持到回放机器进行 mock,和 mock 数据匹配。
因为都是公司未开源东西。只简单介绍三个的实现。重点说下通用解决
引流:
1. 通信框架实时引流:
- 方案:
框架层根据包头中的额外信息,判断哪些流量需要转发到仿真环境,只转发需要转发的流量,且实时转发
判断转发条件在配置平台下发
连接池,隔离目标 server。 - 优点:可以按业务细粒度引流
- 缺点:无法回放
2. 收到请求后写入 MQ,引流系统消费
- 优点:可以重读消费
- 缺点:请求密集度和线上不一致
3. 日志回放(全链路压测)
- 方案:收集线上日志,通过日志还原请求
- 优点:业务无侵入
- 缺点:日志还原复杂
4.TCPCOPY
- 方案
基于数据链路层 / 网络层抓包回放
tcpcopy 通过 libpcap(数据链路层) 或 rawsocket(IP 层)抓包
assistant server 为了截获响应给 TCPCopy,不会回给 online server - 优点:业务无侵入
- 缺点:网络层就无法按照业务选择
5.TCPDUMP 流量(流量回放)
- 方案
单独机器采样 TCPDUMP 录制流量,编写工具读取并解析.cap 文件,实现流量回放 - 优点:可以多次回放请求
- 缺点:解析.cap 文件 +cap 文件存储 +tcpdump 对耗时稍有影响
数据隔离
1. 全部单独数据配置。
数据同步 + 大量机器
2. 数据访问流量劫持
写本地或写丢弃,读线上。
- 本机访问线上数据流量劫持方案:iptable
原理
Netfilter 是 Linux 用于网络数据包过滤的模块,它有四个表五个链。Iptables 是用于向这 Netfilter 添加规则的用户空间程序。
E.g.
// 将本机发往 9613 的 tcp 包转到 100.90.160.37 的 9613 端口
iptables -t nat -A OUTPUT -p tcp –dport 9613 -j DNAT –to 100.90.160.37:9613
// 将本机非 root 用户发往 beststg 集群 3000 端口的流量重定向到本机 9001 端口
iptables -t nat -A OUTPUT -p tcp –dport 3000 -m set –match-set beatstg dst -m owner ! –uid-owner 0 -j REDIRECT –to 9001
// 将本机发往 100.69.238.129 9000 端口的 tcp 流量丢弃
iptables -A OUTPUT -p tcp -d 100.69.238.129 –dport 9000 -j DROP - 需要数据劫持到单独模块
redis
mq topic、回调地址
需要考虑数据
redis,mq,mysql
仿真环境
- 通信框架实时引流。
- 对数据 iptable 劫持
1.redis: 劫持到 RedisRouter
2.mq
1)发出去的请求带回调地址的(比如 bridgemq),劫持到 mqproxy。替换请求中的回调 URL 为目标环境 URL
2)topic 都改成线下的,发送和的订阅都改
全链路压测
流量回放
- 模拟数据:日志回放。
按照接口配置顺序取高峰期几小时数据。对请求中部分数据替换为压测 - 全部单独数据配置:
压测用户信息单独存储,单独存储。mysql,redis 加注释方式.mq 的 topic 统一加前缀 - 施压工具开发
用的 NIO - 整体架构
ultron-server:web 控制台,负责新建压测计划、压测任务,调整压测,修改压测配置,查看压测监控和性能数据等。
daemon:远程调起 agent。ultron-server 新建压测任务只会在数据库添加一条待运行的压测任务记录,并将空闲 agent 分配给压测任务,ultron-server 本身不负责发压,然后 daemon 会从数据库读取待运行的任务以及给任务分配好的 agent,然后通过 shell 命令远程调起 agent。
datasource: 即数据源,全链路压测时向 agent 提供司乘基本信息和路线信息,http 日志回放时向 agent 提供日志日志文件。datasource 起了一个定时任务从 redis(全链路压测)或者日志文件 (http 日志回放) 读取数据,缓存到内存的队列里面,当压测 agent 启动后,从 datasource 的内存队列里面拉取压测数据。
redisfiller: 将匹配好的路线信息和司乘数据写入 redis,供 datasource 拉取数据用。
流量回放
- TCPDUMP 流量
因为 mock 方案,需要保证串行。http:nginx+lua; thrift:server 改。选则一台线上机器做串行到 tcpdump 机器即可 - 数据 iptable 劫持
劫持到 proxy 转发到 mock 机器。数据 tcp 级别的 mock。配置白名单 iptable 不劫持放过 - mock 匹配
完全串行。1s 内单个请求所有子 tcp 都结束后才记录下一个,直接用时间匹配(tcp 级别比如访问 redis,mysql 无法用 traceid 等,用线程 id 各语言不通用)