tcpcopy架构复杂应用实例

作者:无名 - 软件应用 -

在线系统介绍:

假设我们有在线机器A,在线机器B,在线机器C三台服务器,其中在线机器A,上面运行nginx(80端口)的业务系统,供最终用户访问,同时nginx还会内网访问在线机器B上面的adserver(端口11311)业务,在线机器C运行着伪在线业务msyql(利用sysbench模拟的)

测试系统:

我们有测试服务器a,b。
其中a上面运行如下几个系统:
1)nginx业务系统(端口为18080)
2)adserver业务(进程为asyn_server,端口为11811)
3)mysql(3306端口)

这里nginx会访问asyn_server进程,mysql是独立的应用。

tcpcopy架构复杂应用实例_第1张图片

 

目的:

我们需要把在线系统的nginx应用和asyn_server应用导入到测试机器a中,同时还要复制在线机器C中的mysql请求到测试机器a中去。

 

如何在测试机器a中设置路由:

对于测试机器b,则是运行intercept的地方,用来捕获测试机器a中的mysql的响应,nginx的响应和asyn_server的部分响应(因为测试机器a中的nginx也会访问asyn_server,这部分响应不应该路由到测试机器b)。

因此测试机器a上面的应用有外网应用(nginx)和内网应用(asyn_server和mysql应用),该如何设置路由呢?(这里路由设置是关键)

 

1)设置nginx的响应路由:

测试机器a中的nginx走外网网卡,我们设置如下:
route del default gw 原先的网关ip地址
route add default gw 机器b的外网ip地址
这样设置后,如果外网响应最终没有匹配路由的话,就会走默认网关,也即流向到测试机器b中去(注意:来自同一网段的请求,如果采用外网地址访问,其响应不会走默认路由)。

这样nginx的响应路由就设置好了。


2)设置asyn_server的响应路由:

 

由于在线的asyn_server是被nginx访问的,我们假设只有在线机器A上面的nginx来访问,而且是采用内网地址(非localhost)来访问asyn_server的。
我们设置路由如下:
route add -host 在线机器A的内网ip地址 gw 测试机器b的内网ip地址
这样复制的asyn_server的请求到了测试机器a后,其响应就会流向到测试机器b中去,但测试机器a中的nginx访问asyn_server的请求,会返回给nginx。

 

 

3)设置mysql的响应路由:

由于我们测试机器a上面的mysql,会DNS查询外网,所以必须找出访问的ip地址,我们假设要访问的外网ip地址为机器D的ip外网地址,需要开通这个ip地址的权限:
route add -host   机器D的ip外网地址 gw 原先的网关ip地址
这样设置好了以后,mysql请求复制在我这儿才能顺序进行
mysql请求本身访问采用了内网方式,而mysql的请求客户端ip地址为在线机器C,那么设置路由如下:
route add -host 在线机器C的内网ip地址 gw 测试机器b的内网ip地址

运行:

 

测试机器a的路由设置好以后,启动nginx应用,asyn_server和mysql应用,就等请求复制过来了。
我们在测试机器b中启动多个intercept实例,分别捕获nginx的响应,asyn_server的响应和mysql的响应

 

 

捕获mysql响应( ./configure --enable-advanced --enable-pcap --enable-combined --enable-mysql)
sudo ./intercept -F 'tcp and src port 3306' -p 36525 -i eth0 -d           

捕获nginx响应 (./configure --enable-advanced --enable-pcap  --enable-combined)
sudo ./intercept -F 'tcp and src port 18080' -p 36526 -i eth1 -d        

捕获asyn_server响应(./configure --enable-advanced --enable-pcap  --enable-combined)

sudo ./intercept -F 'tcp and src port 11811' -i eth0 -d  

 

当然intercept也可以只运行一个实例(-F参数设置过滤好响应包的捕获条件),没有必要一个应用一个intercept实例

 

我们在在线机器A复制nginx请求(./configure --enable-advanced --enable-pcap  --enable-combined):

sudo ./tcpcopy -x 80-测试机器a的外网ip地址:18080 -p 36526 -s 测试机器b的内网ip地址 -i eth0 -d 
由于在线nginx前面有lvs,这里请求走的内网网卡

我们在线机器B复制asyn_server的请求(./configure --enable-advanced --enable-pcap  --enable-combined):
sudo ./tcpcopy -x 11311-测试机器a的内网ip地址:11811 -s 测试机器b的内网ip地址 -i eth0 -d 
从eth0捕获内网请求

我们在在线机器C中复制mysql请求(./configure --enable-advanced --enable-pcap --enable-combined --enable-mysql):
sudo ./tcpcopy -x 3306-测试机器a的内网ip地址:3306 -u root@密码 -s 测试机器b的内网ip地址 -p 36525 -i lo -d
从lo捕获mysql请求


效果演示

复制以后,我们截图如下:

在线机器A,复制nginx请求,运行tcpcopy

tcpcopy架构复杂应用实例_第2张图片

 

在线机器B,复制asyn_server请求

tcpcopy架构复杂应用实例_第3张图片

 

在线机器C,复制mysql请求

tcpcopy架构复杂应用实例_第4张图片

 

测试机器b上面的intercept

tcpcopy架构复杂应用实例_第5张图片

 

测试机器a上面的各种业务:

tcpcopy架构复杂应用实例_第6张图片

本文内容由IT人知识库(原文链接:http://www.itpeo.net/15315/3488902.html)本站为各位整理





rfedfre

有意的建站系统资料

http://www.mmpcms.com/bdclkid=rP4_J2R4sdT1AWGsteJ3FGtNxTPK0g... ...

rfedfre

Android开发中怎么使用绘制图表

本文原文发表在http://tech.it168.com/a2011/0603/1200/000001200313.sh... ...

rfedfre

How To Get Min-Cost Between two points in graph (Dijkstra’s algorithm)

How To Get Min-Cost Between twopoints in graph (Dijkstra’s... ...

rfedfre

深入解读Quartz及应用

一、Quartz基本概念   Quartz 是 OpenSymphony开源组织在任务调度领域的... ...

rfedfre

Ubuntu9.10(Karmic) 安装Chandler

Chandler是一个比较出名的PIM软件,用来作工作计划很不错。我是阅读了《梦断代码》才用上他的。最近从XP转到Ubu... ...

rfedfre

Use Axis2.x(WebService)- 01

  前言 笔者首先在此向大家简单介绍下与此篇博文相关的一些概念及理论,但愿大家有心情和时间听笔者废... ...

rfedfre

Android源代码加入SDK,在程序中查看android源代码

本文主要展示如何利用Android源代码,介绍一下Android源代码加入SDK,就可以按F3查看类了。 当... ...

rfedfre

iredmail使用tips

DNS DNS记录,需要你到你的域名托管商那里进行设置或者你自己管理DNS服务器。不少域名托管商不支持txt记录或... ...

rfedfre

亲历2012百度开发者大会

今天专门请了一天假,去参加百度开发者大会。看图说话。 上午的内容包括李彦宏的演讲——百度云时代,其它的话题也大都密... ...

rfedfre

阿福播放器2.0

阿福播放器(末尾下载) 下载地址:http://www.eoemarket.com/apps/9348 ... ...

rfedfre

java 访问控制符学习笔记

1.私有权限(private) private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,... ...

rfedfre

Oracle 索引结构、内部管理

Oracle 索引结构、内部管理 摘要:本文对B树索引的结构、内部管理等方面做了一个全... ...

rfedfre

系统主数据管理之供应商(Supplier)五 供应商的“接收”属性(Receiving)

该属性仅在“供应商层”可设置,为所有的Site层所共用,如下图51所示:   不过,这里的大多数属性设置,... ...

rfedfre

系统主数据管理之供应商(Supplier)六 供应商Site层的“一般”属性

如下图52所示,供应商Site层与“供应商层”的“一般”Tab页内容差别较大。Site层的“地点用途”中,“支付”如果未... ...

rfedfre

深刻理解JavaScript基于原型的面向对象

  主题一、原型   一、基于原型的语言的特点... ...

rfedfre

Task(Activity栈) 详解

什么是Android Application? 简单来说,一个apk文件就是一个Applicatio... ...

rfedfre

action里面的值显示到JSP页面

今天在项目中,遇到一个问题,就把action里面执行的结果传到jsp页面上,在jsp页面上显示。 解决办法:把执行... ...

rfedfre

undo系列学习之怎么计算undo表空间的大小

undo空间的大小不足会引起ORA-30036或者ORA-01555。 我们创建一个小的undo表空间,然后执... ...

rfedfre

用Apache AXIS 开发 Web Services

说明及约定:     本文主要描述如何使用Apache开源项目Axis提供的AP... ...

PHP中的目录遍历细说教程

神奇的globglob是php4.3.0后加入的十分强大的函数,可惜官方手册上的介绍并不详细。该函数定义如下:array... ...