java线上流量复制工具_tcpcopy复制线上流量

TCPCopy是一款强大的线上流量复制工具,用于分布式压力测试、上线测试、性能对比和流量放大等。它具有实时、低负载和操作简单等特点,但也可能遇到如ip_conntrack限制、丢包等问题。解决方法包括调整内核参数、利用pf_ring辅助抓包和离线重放数据包。TCPCopy的安装和使用涉及多个服务器角色,包括online server、target server和assistant server,通过命令行参数配置实现流量复制。
摘要由CSDN通过智能技术生成

TCPCopy七大功能

1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug

2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线

3)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验

4)流量放大功能

5)利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实

6)热备份

7)实战演习(架构师必备)

TCPCopy的特点

1)实时 (离线通过configure --enable-offline)

2)效果真实

3)低负载,不影响在线

4)操作简单

5)分布式

6)零成本

可能会遇到的问题

王斌自己讲:要想用好 tcpcopy,需要熟悉系统知识,包括如何高效率抓包,如何定位系统瓶颈,如何部署测试应用系统,如何抓包分析。常见问题有:1)部署测试系统不到位,耦合线上系统,2)忽视系统瓶颈问题,3)不知道如何定位问题,4)资源不到位,资源紧张引发的问题 。

1)ip_conntrack

2014年6月,微博的唐福林曾说:“Tcpcopy 引流工具是线上问题排查的绝佳之选,但使用者很少有人去关注开启 tcpcopy 服务时,同时会开启 ip_conntrack 内核模块,这个模块负责追踪所有 tcp 链接的状态,而且它的内部存储有长度限制,一旦超过,所有新建链接都会失败。”

王斌则回应说:“开启 tcpcopy,自身不会去开启 ip_conntrack 内核模块。开不开启 ip_conntrack 内核模块,是用户自己决定的,跟 tcpcopy 没关系。”他还建议:“当连接数量非常多的时候,本身就应该关闭 ip_conntrack,否则严重影响性能。至于 tcpcopy,默认是从 ip 层发包的,所以也会被 ip_conntrack 干涉,文档中也有描述,其实也可以采用 --enable-dlinject 来发包,避开ip层的ip_conntrack。如果没有报“ip_conntrack: table full, dropping packet”,一般无需去操心ip_conntrack。”以及“线上连接不多的场合,开启 ip_conntrack 并没有问题。线上连接比较多的场合,最好关闭 ip_conntrack,或者对线上应用系统端口设置 NOTRACK,至少我周围的系统都是这样的,这是为性能考虑,也是一种好的运维习惯。”

2)少量丢包

如何发现 TCPCopy 丢包多还是少呢?

王斌自己称,在某些场景下,pcap 抓包丢包率会远高于 raw socket 抓包,因此最好利用 pf_ring 来辅助或者采用 raw socket 来抓包。

丢包率需要在测试环境中按照定量请求发送进行对比才能展开计算,另外还需要对日志内容进行分析,有待测试。

3)离线重放

tcpcopy 有两种工作模式:

1)实时拷贝数据包;

2)通过使用 tcpdump 等抓包生成的文件进行离线(offline)请求重放。

本次仿真测试,没有试验成功第二种工作模式,留待以后进一步研究。

4)不提取 7 层信息

会议上曾提出按域名区分拷贝流量,省得把不在本次压测范围内的工程打挂,但 tcpcopy 的原理是在 ip 层拷贝,不提取 7 层的信息,也就是说,在我们的 Nginx*4 上部署 TCPCopy,只能是将所有流量拷贝到镜像环境的 Nginx 上。反正没有配置对应的 server,或者 server 停掉,这种处理不了的流量就丢弃掉。

0x05,观测的性能指标

仿真压测时,需要记录下 Test Server 以及后端各种被压工程的性能指标。

本次压测,我们记录的指标有:

Java 工程的访问次数,响应时间,平均响应时间,调用成功或失败,Web端口连接数;

Web容器的 thread、memory 等情况;

虚拟机的 CPU-usage、Load-avg、io-usage 等;

memcached/redis 等缓存集群的命中率等;

下载及安装

1.1. 下载

需要两个工具,分别是:

tcpcopy

intercept

1.2. 工具部署

使用tcpcopy进行线上导流,通常需要 3 台服务器:

online server (运行 tcpcopy)

target server (流量从 online server 复制到此机器)

assistant server (运行 intercept)

1.3. 安装及命令使用方法

1.3.1. tcpcopy

./configure(在线导流模式)

./configure --offline(离线回放模式)

make

make install

在线导流方法:

tcpcopy -x localServerPort-targetServerIP:targetServerPort -s interceptServerIP

[-c ] -d

离线重放方法:

tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -i test.pcap -n 2

将 test.pcap 报文放大 2 倍发送给 192.168.44.137

1.3.2. intercept

cd intercept

./configure

make

make install

使用方法:

intercept -F -i

二. 测试

假设我们 3 台服务器情况分别如下:

- online server: 192.168.44.128

- target server: 192.168.44.137

- assistant server: 192.168.44.136

2.1. 运行命令

2.1.1. target server

如果是在同一网段,设置去往 online server 的响应,路由到 assistant server,可以这样指定:

route add -host onlineIP gw assistantIP

如果客户端 IP 来自于其它网段的话:

route add -net xxx.xxx.xxx.0 netmask 255.255.255.0 gw assistantIP

这里添加静态路由:

route add -net 192.168.50.0 netmask 255.255.255.0 gw 192.168.44.136

确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 online server

2.1.2. assistant server

intercept -i eth0 -F 'tcp and src port 80' -d

intercept 过滤 eth0 网卡 80 端口的 tcp response 报文。

辅助服务器要确保没有开启路由模式,为0表示没有开启:

cat /proc/sys/net/ipv4/ip_forward

辅助服务器上的 intercept 通过 pcap 抓取测试机应用程序的响应包,将头部抽取后发送给 online server 上的 tcpcopy ,从而完成一次请求的复制。

2.1.3. online server

tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -c 192.168.50.x -d

将本机 80 端口数据转发给192.168.44.137:80,更改 client IP 为 192.168.50.x 之一,并从 192.168.44.136 获取 response 报文。

2.2. 查看各 server 报文情况

可以在各个 server 上使用 tcpdump 抓包查看收发报文情况

如:online server 上

tcpdump -n -i eth0 port 80 and dst host 192.168.44.137

三. 遇到的问题

3.1. 无法复制流量问题

之前在三台机器都是同网段的机器上测试,是可以成功复制流量的,但是 online server 与 target server 不在同一网段时,发现无法复制流量。

抓包发现

online ------(SYN)------> target

online

online ------(RST)------> target

解决方案

采用两台机器方案:

- online server,假设 IP 1.2.3.4

- target server,假设 IP 192.168.44.137

online server 运行:

tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.137 -c 1.2.3.4 -d

online server iptables 添加下面规则

iptables -A INPUT -s 192.168.44.137 -p tcp --sport 80 -j DROP

target server 运行:

intercept -i eth0 -F 'tcp and src port 80' -d

然后可以分别在两台服务器上查看日志,如 nginx:

tail -f /usr/local/nginx/logs/access.log

参考资料:

http://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html

https://www.cnblogs.com/chenny7/p/3912515.html

https://blog.csdn.net/fengfengdiandia/article/details/77776026

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值