利用tcpcopy,怎么复制在线请求到lvs的子系统中去
这方面的代码在:https://github.com/wangbin579/tcpcopy下面的dr分支,利用git工具进行如下下载:
git clone -b dr http://github.com/wangbin579/tcpcopy
为了运行这种情况下的tcpcopy,configure的时候需要指定
./configure --enable-dr
举例如下:
我们假设有测试机器有A,B,C,其ip地址为10.120.13.148,10.120.13.161,10.120.13.162,在线应用是web应用,测试服务器也部署了web应用。
在测试机器A上面部署LVS,虚拟ip地址为10.120.13.211,测试机器B和测试机器C作为real server,同时测试机器B和测试机器C部署intercept程序,并这样运行:
./intercept -x 10.120.13.148 -d
为啥需要-x参数呢,因为测试机器A需要检测测试机器B和测试机器C作为real server的健康程度,会通过上层应用访问这些机器的web应用,如果不设置-x参数,测试机器A会认为测试机器B和测试机器C都崩溃了。
值得注意的是,部署LVS跟在线的部署没有任何差别。
我们在在线机器进行复制流量:
./tcpcopy -x 80-10.120.13.211:80 -s 10.120.13.161,10.120.13.162 -d
这里需要-s参数,原因如下:
由于在线流量复制给LVS后,LVS会把不同连接的数据包按照一定的策略分发给不同的测试服务器,导致了与传统TCPCopy的不同。
为了解决响应包如何返回的问题,此模式下的tcpcopy会把每个会话的路由信息传递给每一台intercept。因此tcpcopy执行命令的时候会多出-s参数,用来指定真正的real server的IP地址。
设置了-s参数后,tcpcopy就知道跟哪些机器的intercept建立连接,从而intercept就知道如何返回响应包给相应的tcpcopy