Chinaunix

标题: 用nginx做负载均衡,上传文件是否能不经过nginx服务器呢? [打印本页]

作者: hanool    时间: 2012-05-17 09:38
标题: 用nginx做负载均衡,上传文件是否能不经过nginx服务器呢?
各位大侠:
    请教一个关于nginx的问题。使用nginx做负载均衡和反向代理。
    假设nginx装在服务器A,其他的应用装在服务器B和服务器C。如果我想通过http上传一个文件,能否绕过安装nginx的服务器A,让这些数据流只流入服务器B或者C呢?都流经A的话,如果有很多用户同时上传的话,A会是一个性能瓶颈。

    我测试的结果发现如果上传文件的话,数据流都会先经过nginx的服务器A,然后再转到B或者C的。
    请问,nginx是否支持这种功能呢?如果支持,如何配置?谢谢大家!
作者: hwlinux    时间: 2012-05-17 11:50
让程序员实现。
作者: kns1024wh    时间: 2012-05-17 11:51
回复 2# hwlinux

写个新的模块应该差不多


   
作者: hanool    时间: 2012-05-17 13:14
回复 3# kns1024wh


    是nginx不支持,要做到下面的server的应用上吗?
作者: hwlinux    时间: 2012-05-17 13:30
回复 4# hanool


   既然要nginx支持,你觉得他还能不走nginx吗?如果想传到另外一个服务器,那么你可以用一个新的域名,专门来做上传。走nginx的网站调用这个站点就行了
作者: hanool    时间: 2012-05-17 13:45
现在是想把所有的节点都放在nginx下,nginx作负载均衡,对于所有的IO请求,希望都能绕过nginx,直跟后面的server交互。
作者: 芬达7402    时间: 2012-05-17 13:58
楼主的需求用lvs可以满足。
作者: hanool    时间: 2012-05-17 14:27
回复 7# 芬达7402
我试试,谢谢。


   
作者: hanool    时间: 2012-05-18 10:46
回复 7# 芬达7402


    hi,兄弟。我测了下,用的是DR模式,从交换机端口看,数据包还是从lvs的节点流过。

我是参考这个进行dr模式配置的:http://www.sy162.com/Server/SerOS/Linux/1122TR2011.html


写3G多的文件:

219端口(lvs负载均衡)
                In 3,485,897,023                             Out                        3,486,357,559   
                       
211端口(real)
                In 718,949,028                        Out                        2,460,822,639
               
213端口(real)
                In 1,073,301,379                                   Out                        2,803,170,856

  

In和Out的流量分别跟总流量一样。上传数据仍然都经过lvs的节点。

作者: 芬达7402    时间: 2012-05-18 13:23
看来我的思路有问题。我是这么考虑的:采用DR模式的lvs把请求转发给后端真实服务器B或者C,然后B或C直接与客户端建立tcp连接开始传输数据。直到数据拷贝完,tcp会话结束。大家都讨论讨论。
作者: hanool    时间: 2012-05-18 13:52
把配置贴出来了。

1) 安装ipvsadm.x86_64:ipvsadm-1.25-9.el6.x86_64
2)修改内核参数
虚机
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.eth0.send_redirects = 1
sysctl –p
实机
net.ipv4.ip_forward = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

3)设置如在均衡机器
ipvsadm -A -t 192.168.100.233:80 -s rr         //虚拟IP为192.168.100.233

4) 添加这个负载均衡IP
ipvsadm -a -t 192.168.100.233:80 -r 192.168.100.211 -g -w 1
ipvsadm -a -t 192.168.100.233:80 -r 192.168.100.213 -g -w 1

5) 配置均衡器虚拟Ip
ifconfig eth0:0 192.168.100.233 broadcast 192.168.100.233 netmask 255.255.255.255 up
route add -host 192.168.100.233 dev eth0:0

配置实际机器虚拟ip
ifconfig lo:0 192.168.100.233 broadcast 192.168.100.233 netmask 255.255.255.255 up
route add -host 192.168.100.233 dev lo:0

6)在realserver上使用arptables,看有人这么用的。
arptables -F
arptables -A IN -d 192.168.100.233 -j DROP
arptables -A OUT -s 192.168.100.233 -j mangle --mangle-ip-s 192.168.100.211

arptables -F
arptables -A IN -d 192.168.100.233 -j DROP
arptables -A OUT -s 192.168.100.233 -j mangle --mangle-ip-s 192.168.100.213

作者: godymoon    时间: 2012-05-18 14:25
芬达7402 发表于 2012-05-18 13:23
看来我的思路有问题。我是这么考虑的:采用DR模式的lvs把请求转发给后端真实服务器B或者C,然后B或C直接与客 ...


客户端的访问,是每一个请求都要经过LVS来转发到真实服务器的吧,所以大数据流是绕不开这个负载均衡器的

欢迎大家讨论指正  
作者: hanool    时间: 2012-05-18 15:04
先抛个砖头,大家指正。

负载机、web服务器,这些都用一个虚拟IP;client是跟这个虚拟Ip通信的。

通信时,使用的层3 的IP地址相同,用一个统一的虚拟IP。

不同之处是层2的mac地址不通,各个机器都不一致。因此,lvs dr模式在arp上面动了一些手脚。

我开始理:如果负载器在转发http数据包的时候,给这个包的目的地址mac改为某个web服务器的。以后后续的通信都是web和client的了。这个显然跟现在的结果不一致。我理解有误。
如果client端的在收到web server的ack后把mac地址改成web的mac,就会避免这个问题吧,YY的。

作者: godymoon    时间: 2012-05-18 15:28
我理解的DR的流程是这样的

一个完整的请求过程:

client 请求--> DR vip --> DR重新封包(将原来 VIP:DR MAC  改为 VIP:RS MAC) --> RS 与 Client 三次握手,应答 (使用 VIP:RS MAC)


作者: 阿新3389_cu    时间: 2012-05-19 08:55
本帖最后由 阿新3389_cu 于 2012-05-19 08:58 编辑

LZ的架构思路不对噢!

应该把上传文件直接就存放在nginx上面,无需存放在后端服务器,这样这些静态文件就可以由nginx直接处理,效率更高!如果这些静态文件量过大,单独做个文件服务器,用NFS iSCSI等等挂载在nginx服务器上

压力再大需要在nginx这层做负载均衡

另外,不管是用nginx还是lvs做负载均衡,目的是要减轻后端的压力,不要把nginx和lvs服务器看成一个软件,把他们想象成虚拟F5硬件,他们就像交换机路由器,负责数据交换
作者: hanool    时间: 2012-05-21 16:35
谢谢你的解答

如果有大量用户同时往服务器上传大文件的话,假设现在只有一个nginx作为节点,那么这个节点在必然是整个系统IO的性能瓶颈?
再假设这个节点的带宽为1G,如果有100个用户同时上传文件,那么每个用户分的带宽是1G/100;当有100000个客户上传,那么上传的性能就会降到1G/100000了,对吧?
所以,希望能让传输文件的工作放在nginx后来完成,就能提高带宽。
不知道有什么好的办法吗?
作者: Yuri.G.    时间: 2012-05-22 10:04
按你这个思路应该是用LVS类似的从IP层做的均衡,而不是会话层
作者: ulovko    时间: 2012-05-22 10:07
Yuri.G. 发表于 2012-05-22 10:04
按你这个思路应该是用LVS类似的从IP层做的均衡,而不是会话层


是这样哦,。。
作者: hanool    时间: 2012-05-22 16:33
貌似lvs也不行
这样看来只能用dns 做负载均衡了。。。
作者: 阿新3389_cu    时间: 2012-05-22 23:42
估计LZ你还没有搞明白,不管是多少G的上传流量,和前端nginx或者lvs的IO性能是没关系的,他们只负责数据的传输,而不会写入到磁盘,就像交换机传输数据,最终是写在服务器的磁盘上,而不会先写到交换机上,服务器再从交换机上下载数据,IO的瓶颈只会在文件服务器上

另外如果你用dns做负载均衡,上传数据会写在后端不同的服务器上,后端服务器数据的同步是一大麻烦,我前面说过如果量过大,最简单的方法专门弄个文件服务器用NFS同时挂载在后端服务器和前端nginx服务器上

1,上传数据 你可以通过dns nginx lvs 等等负载均衡到后端服务器,但最后要写在文件服务器上

2,请求数据 通过nginx + 文件服务器 发送
作者: jagel    时间: 2012-05-24 18:57
代理嘛,肯定要路过的
作者: tjpm    时间: 2012-05-28 18:43
对于每一个进去的包,肯定都是会走 LVS转发到后端RS的。
不是通信建立好后就是client和RS直接通信,不关LVS的事情。

对于DR和TUN模式对人一个访问进来的包都是 client -->lvs-->RS,RS处理后的反回是RS-->client


回复 13# hanool


   
作者: hanool    时间: 2012-05-29 10:34
谢谢,和测试的结果是相符的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2