场景是这样的:
公司原来是利用nginx-->apache-->resin(hmux 6800)来做的。
现在已经书写了nginx hmux模块,完全可以这样nginx--->resin(hmux 6800),把系统架构简化了。
那么是不是直接替换呢,这样做有很大的风险,万一上线全面崩溃,怎么办,公司损失不说,个人在公司的职业生涯也结束了。
怎么办,怎么办?
有人说,我们逐步逐步上线,但这样也会有风险,压力大和压力小的时候是不一样的,而且这样的周期过长,等不及。
幸好有tcpcopy,请求复制工具,一个极具实用的工具(也是我们开发的)。
我们复制客户端过来的请求,也就是nginx处理的请求,复制一份到我们的测试机器上去,既不怎么影响在线,又能达到上线测试的目的。
我们在linux测试机器上部署上tcpcopy中的server,是这样部署的:
modprobe ip_queue (如果这个内核模块没有启动的话,要启动这个,不过内核版本要支持这个)
设置iptables
iptables -I OUTPUT -p tcp --sport 8022 -j QUEUE
为啥要设置这个呢,为的就是截获测试机器的响应的,否则直接返回客户端是肯定不行的。
./interception 以root用户权限运行此程序
当然在测试服务器部署上我们的nginx hmux模块,等待请求的到来。
测试机器部署完毕
我们需要复制请求,在在线服务器怎么做呢?
很简单,只需要运行我们的程序
./tcpcopy 61.135.250.217 80 61.135.250.208 8022
这里测试机器ip为61.135.250.208,在线服务器为61.135.250.217
由于客户端过来的请求packets,目的地址就是61.135.250.217,目的端口80,我们需要改变复制包的目的地址和目的端口,改成测试服务器的ip地址和端口号,这样才能 访问测试服务器,那访问测试服务器后的response怎么办,那就是由测试服务器上的interception来截获了,不会直接返回给客户端。