高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

tcpcopy1.0使用

目录
  1. 1. tcpcopy介绍
  2. 2. 安装
    1. 2.1. 准备三台机器:A,B,C
  3. 3. 在C机器上安装intercept
  4. 4. 在A机器安装tcpcopy
  5. 5. 在B机器上配置路由信息
  6. 6. 测试一下:
  7. 7. 使用tcpdump的cap包,导入流量
    1. 7.1. tcpdump 获取pcap
    2. 7.2. 回放

平时我们做的压力测试,很难去模拟线上复杂的真实流量,尤其里面混杂着各种奇异的异常流量。
所以,线下压的好好的系统,上线后可能就雪崩了。
tcpcopy可以解决以上问题, tcpcopy是一种流量的实时复制工具,可以将线上的流量引到测试环境上做测试。
当然, tcpcopy也可以回放tcpdump的流量包。

tcpcopy介绍

由网易的wangbin开发和维护,目前为1.0版本。
推荐使用最新的1.0版本,虽然配置稍微麻烦一些,但是有很多好处(具体参见:https://github.com/wangbin579/tcpcopy)
整体工作流程:
Alt text

安装

准备三台机器:A,B,C

A:192.168.42.162,作为线上服务器,安装tcpcopy
B:192.168.42.164,作为测试服务器
C:192.168.42.166,作为辅助服务器,安装intercept

整体流程:在192.168.42.162上运行tcpcopy把线上流量拷贝到192.168.42.164,在192.168.42.164上我们通过路由将应答转向
192.168.42.166,在192.168.42.166上把应答丢弃。
Alt text
再简单解释一下工作原理:

TCPcopy 从数据链路层 copy 端口请求,然后更改目的 ip 和目的端口。
将修改过的数据包传送给数据链路层,并且保持 tcp 连接请求。
通过数据链路层从 online server 发送到 test server。
在数据链路层解封装后到达 nginx 响应的服务端口。
等用户请求的数据返回结果后,回包走数据链路层。
通过数据链路层将返回的结果从 test server 发送到 assistant server。注:test server 只有一条默认路由指向 assistant server。
数据到达 assistant server 后被 intercept 进程截获。
过滤相关信息将请求状态发送给 online server 的 tcpcopy,关闭 tcp 连接。

在C机器上安装intercept

wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz -O intercept-1.0.0.tar.gz

centos6以上版本直接安装依赖包:
yum -y install libpcap-devel
centos5版本上需要卸载低版本的libpcap-devel-0.9.4-15.el5

yum remove libpcap
wget http://www.tcpdump.org/release/libpcap-1.4.0.tar.gz
tar zxvf libpcap-1.4.0.tar.gz
cd libpcap-1.4.0
./configure
make
make install

tar zxvf intercept-1.0.0.tar.gz
cd intercept-1.0.0
./configure (默认raw socket方式抓包)
make && make install

安装完成,启动intercept

/usr/local/intercept/sbin/intercept -i eth1 -l intercept.log -P /var/run/intercept.pid -F ‘tcp and src port 80’ -d
指令说明:
-i 监控网卡接口
-l 记录日志
-F 监控的协议和端口
-P 记录pid
-d 以daemon形式运行
其他参数可以通过/usr/local/intercept/sbin/intercept -h查看

成功运行后可以观察到的网路连接状态:

netstat -anp |grep 36524

在A机器安装tcpcopy

wget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gz -O tcpcopy-1.0.0.tar.gz
yum -y install libpcap-devel
tar zxvf tcpcopy-1.0.0.tar.gz
cd tcpcopy-1.0.0
./configure (默认raw socket方式抓包)
make
make install

安装完成,运行tcpcopy

/usr/local/tcpcopy/sbin/tcpcopy -x 80-192.168.42.164:80 -s 192.168.42.166 -c 10.10.10.x -d -C 4 -l tcpcopy.log -P /var/run/tcpcopy.pid

指令说明:

-x 80-192.168.42.164:80将本机上80端口的流量复制到192.168.42.164(测试服务器)的80端口
-s指定intercept进程所在的服务器192.168.42.166。(丢包服务器)
-c修改请求的host地址为10.10.10.x,以便在164测试服务器上设置路由(设置路由是为了将应答转向丢166包服务器)
-C 开启4个进程
-d 以daemon形式运行
-l 记录日志
-P 记录pid
其他参数可以通过
/usr/local/tcpcopy/sbin/tcpcopy -h查看

运行 tcpcopy 客户端,有几种可选方式:
/usr/local/tcpcopy/sbin/tcpcopy -x 80-192.168.42.164:80 -s 192.168.42.166 -d #全流量复制
/usr/local/tcpcopy/sbin/tcpcopy -x 80-192.168.42.164:80 -s 192.168.42.166 -r 20 -d #复制20%的流量
/usr/local/tcpcopy/sbin/tcpcopy -x 80-192.168.42.164:80 -s 192.168.42.166 -n 2 -d #放大2倍流量

在B机器上配置路由信息

在测试机器上需要配置一条路由信息

route add -net 10.10.10.0 netmask 255.255.255.0 gw 192.168.42.166

测试一下:

我们在线上机器上启动apache:80端口,B机器上也启动apache:80端口,访问线上机器:
Alt text

使用tcpdump的cap包,导入流量

很多情况下我们不能实时导线上流量,需要借助tcpdump先将流量保存下来,然后进行回放。
Alt text

tcpdump 获取pcap

tcpdump -i eth0 -w online.pcap tcp and port 80

-i eth0:eth0为网卡,获取方式可在liunx系统下执行ifconfig查看所有的网卡,选取需要的那个。
-w online.pcap:为获取pcap文件进行回放,可设置路径,e.g. -w /home/user/test.pcap
tcp and port 80:截获端口为80的tcp请求,也可添加udp请求,和更改服务端口80,e.g. tcp and port 16001
-s 0:默认的话,tcpdump只显示部分数据包,-s snaplen是控制包长度的,默认是68字节,-s 0 则为全部字节,在使用过程中,如果添加-s则回放时会出现错误。可不使用该参数

回放

/usr/local/tcpcopy/sbin/tcpcopy -x 80-192.168.42.164:80 -s 192.168.42.166 -i /home/user/test.pcap