zoukankan      html  css  js  c++  java
  • 基于TCPCopy的仿真压测方案

     

    一、tcpcopy工具介绍

    tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。

    tcpcopy 的优势在于其实时性及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。

    二、tcpcopy原理

    TCPCopy 分为三个角色:

    • Online Server(OS):上面要部署 TCPCopy,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去;
    • Test Server(TS):最新的架构调整把 intercept 的工作从 TS 中 offload 出来。TS 设置路由信息,把 被测应用 的需要被捕获的响应数据包信息路由到 AS;
    • Assistant Server(AS):这是一台独立的辅助服务器,原则上一定要用同网段的一台闲置服务器来充当辅助服务器。AS 在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的 OS 上的 tcpcopy 进程。

    数据传输流程图

     

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

    三、操作步骤

    Online Server 上的发包:


    OS 默认使用 raw socket output 接口发包,此时发包命令如下:

    tcpcopy -x 应用端口-Test Server:Test Server应用端口 -s Assistant Server

    例如:

    tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -d

    此外,新架构还支持通过 pcap_inject(编译时候增加--enable-dlinject)来发包。

    Test Server 上的响应包路由:

    需要在 Test Server 上添加静态路由,确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 Online Server。

    route add -net 服务器所在网段 gw Assistant Server

    例如:

    route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.247

    Assistant Server 上的捕获响应包:

    辅助服务器要确保没有开启路由模式 cat /proc/sys/net/ipv4/ip_forward,为0表示没有开启。
    辅助服务器上的 intercept 进程通过 pcap 抓取测试机应用程序的响应包,将头部抽取后发送给 Online Server 上的 tcpcopy 进程,从而完成一次请求的复制。

    intercept -i 网卡名 -F 'tcp and src port 应用端口' -d

     例如:

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

    -i 参数,还可以为any,表示所有网卡

    四、tcpcopy搭建

    环境说明

    角色 ip 端口
    Assistant Server  192.168.0.247  
    Online Server 192.168.0.245 80
    Test Server 192.168.0.246 80

    拓扑图

    运行流程

    • tcpcopy运行在线上服务器上,tcpcopy会把线上服务器收到的流量,重放给测试服务器,重放的时候tcpcopy修改了IP数据包的源IP地址(譬如修改源地址为192.168.2.254)。所以,线上服务器和测试服务器应该部署相同的服务。
    • tcpcopy把源IP伪造成192.168.2.254的包发给了测试服务器,如此,测试服务器在处理完tcpcopy发过来的数据以后,会把这些数据包返回给客户端,即伪造的192.168.2.254
    • 由于没有192.168.2.254这个地址,我们在测试服务器添加一条专门的路由,把发往192.168.2.0/24的数据包,都全部转交给辅助服务器。
    • 为了保证辅助服务器会接受这些本不属于自己的,部署在辅助服务器上的intercept就发挥作用了。辅助服务器还可以用来把客户端的请求返回给tcpcopy,但是默认只返回响应头部给tcpcopy。辅助服务器应该类似于黑洞。

    intercept安装

    Assistant Server 上的操作:


    下载并安装 intercept 服务端;

    # 安装编译环境
    apt-get install -y build-essential
     
    # 安装pcap依赖包
    apt-get install -y libpcap-dev
     
    # 下载软件包
    # github地址: http://github.com/session-replay-tools/intercept
    wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz -o intercept-1.0.0.tar.gz
    tar zxvf intercept-1.0.0.tar.gz -C /usr/src
    cd /usr/src/intercept-1.0.0
    ./configure --prefix=/usr/local/intercept-1.0.0
    make && make install
     
    # 创建软连接
    ln -s /usr/local/intercept-1.0.0/sbin/intercept /usr/bin/intercept
     
    # 启动程序
    intercept -i ens160 -F 'tcp and src port 80' -d

    注意:必须先安装 intercept,否则会导致 tcpcopy 启动时,找不到 intercept

    tcpcopy安装

    Online Server 上的操作:

    下载并安装 tcpcopy 客户端

    # 安装编译环境
    apt-get install -y build-essential
     
    # 下载软件包
    # github地址: http://github.com/session-replay-tools/tcpcopy
    wget https://github.com/session-replay-tools/tcpcopy/archive/v1.1.0.tar.gz -o tcpcopy-1.1.0.tar.gz
    tar zxvf tcpcopy-1.1.0.tar.gz -C /usr/src
    cd /usr/src/tcpcopy-1.1.0
    ./configure --sbin-path=/usr/local/sbin
    make && make install
     
    # 创建软连接
    ln -s /usr/local/tcpcopy-1.1.0/sbin/tcpcopy /usr/bin/tcpcopy
     
     
    # 启动程序
    tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -d

    注意:192.168.0.246 是  Test Server IP地址,192.168.0.247 是 Assistant Server IP地址

    Test Server 添加路由

    Test Server 上的操作:


    添加静态路由:

    route add -net 192.168.0.0/24 gw 192.168.0.247

    注意:192.168.2.0/24 是不存在的网络,是一条专门的路由,用于将数据包转发到Assistant Server 

    192.168.0.247 是 Assistant Server IP地址

    测试效果

    Online Server 和 Test Server 已经安装了nginx,如果没有,请使用以下命令安装:

    apt-get install -y nginx

    在客户端浏览器,打开 Online Server 的页面

    http://192.168.0.245/

    登录到 Online Server ,查看访问日志

     
    tail -f /var/log/nginx/access.log
     
    # 日志输出:
    192.168.0.136 - - [27/Apr/2019:12:35:56 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
    登录到 Test Server ,查看访问日志
    tail -f /var/log/nginx/access.log
     
     
    # 日志输出:
    192.168.2.254 - - [27/Apr/2019:12:35:56 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

    虽然访问的是  Online Server  ,但是 Test Server  能收到客户端的访问请求。说明 intercept 转发正常

    本文参考链接:

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

    https://juejin.im/entry/5ac1922d6fb9a028bc2de3fb

  • 相关阅读:
    select、poll和epoll
    Linux 常用命令之文件和目录
    SmartPlant Review 帮助文档机翻做培训手册
    SmartPlant Foundation 基础教程 3.4 菜单栏
    SmartPlant Foundation 基础教程 3.3 标题栏
    SmartPlant Foundation 基础教程 3.2 界面布局
    SmartPlant Foundation 基础教程 3.1 DTC登陆界面
    SmartPlant Foundation 基础教程 1.4 SPF架构
    SmartPlant Foundation 基础教程 1.3 SPF其他功能
    SmartPlant Foundation 基础教程 1.2 SPF集成设计功能
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/10779524.html
Copyright © 2011-2022 走看看