免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8396 | 回复: 3
打印 上一主题 下一主题

【原创】用 LVS (DR) 实现负载均衡 Apache 和 FTP 两个服务(申请加精) [复制链接]

招聘 : 技术支持/维
论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-29 10:14 |只看该作者 |倒序浏览
本帖最后由 nagaregawa 于 2011-12-29 13:50 编辑

在网上看到很多人写关于 LVS DR 模式实现负载均衡 FTP 服务的文档。但是没有一个文档可以让大家直接实现,不得不参考很多类似但又不完整的文档,摸索着来。本人无聊之余,写了这篇文章,希望给想用 LVS 的人一些方便。

用 LVS (DR) 实现负载均衡 Apache 和 FTP 两个服务

Date: Dec 29th, 2011
Author: Jaylin Zhou

实验环境:
四台 RHEL5u7 服务器,其中:
主 LVS 服务器一台(192.168.56.101);
从 LVS 服务器一台(192.168.56.102);
realserver 服务器两台(192.168.56.103 和 192.168.56.104)。

【配置主 LVS 服务器】

1. 安装 piranha 包。

2. 通过 piranha-gui 工具图形配置 Apache 和 FTP 两个服务。
Apache 监听 80/tcp 端口;
FTP 监听 21/tcp 端口。

3. 手动修改主配置文件中的几个地方:

# cat /etc/sysconfig/ha/lvs.cf
serial_no = 77
primary = 192.168.56.101
service = lvs
backup_active = 1
backup = 192.168.56.102
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = direct
debug_level = NONE
monitor_links = 0
syncdaemon = 0
virtual Apache {
     active = 1
     address = 192.168.56.100 eth0:1
     vip_nmask = 255.255.255.0
     port = 80
     send = "GET / HTTP/1.0\r\n\r\n"
     expect = "HTTP"
     use_regex = 0
     load_monitor = none
     scheduler = rr
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
     server Apache_realserver1 {
         address = 192.168.56.103
         active = 1
         weight = 1
     }
     server Apache_realserver2 {
         address = 192.168.56.104
         active = 1
         weight = 1
     }
}
virtual FTP {
     active = 1
     address = 192.168.56.200 eth0:2
     vip_nmask = 255.255.255.0
     fwmark = 21                <---- 这个要和后面配置的 iptables 规则搭配使用
     port = 21
     persistent = 10                <---- 这个非常重要,后面讲解
     send = "quit"                <---- 这个是根据 FTP 协议来的
     expect = "220"                <---- 这个也是根据 FTP 协议来的
     use_regex = 0
     load_monitor = none
     scheduler = wrr
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
     server FTP_realserver1 {
         address = 192.168.56.103
         active = 1
         weight = 1
     }
     server FTP_realserver2 {
         address = 192.168.56.104
         active = 1
         weight = 1
     }
}

4. 启动 pulse 服务。


【配置从 LVS 服务器】

1. 安装 piranha 包。

2. 从主 LVS 服务器上复制 /etc/sysconfig/ha/lvs.conf 文件。

3. 启动 pulse 服务。


【两台 realserver 的配置】

1. 安装 httpd 和 vsftpd 两个包。

2. httpd 不需要配置,但是 vsftpd 需要配置:

pasv_min_port=10000
pasv_max_port=20000

3. 启动两个服务。

4. 配置 arp:

net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2


【测试及修改】

Apache 没问题,负载均衡很顺利。但是 FTP 只可以进行数据连接。这是为什么呢?

我们需要分两部分考虑 FTP 的问题:主动模式和被动模式。

之所以数据连接可以,是因为数据连接只使用 21/tcp 端口,而 LVS 服务器已经配置分发 21/tcp 的请求。

主动模式下,是 FTP 服务器用自己的 TCP 的 20 端口去连接客户端的某一个随机高端口。LVS 服务器是用来分发客户端发送给服务器的请求的,所以当客户端收到 FTP 服务器(浮动 IP)发来的包之后,必定要回复一个包给服务器(浮动 IP),这个回包的目的端口是 TCP 的 20 端口,这时候 LVS 并不会分发 20/tcp 的包,连接断开。解决这个问题的方法是通过 LVS 的 fwmark。fwmask(firewall mark) 是配合防火墙标记一起使用,用来把一个服务使用的多个端口的请求定向到一台机器上。所以我们需要在 LVS 的配置文件中添加一个 fwmark=21,这里的 21 是随便设置的,但是必须要和下面的 iptables 规则的 mark 一致。我们需要在两台 LVS 服务器上配置如下的 iptables 规则:

# iptables -t mangle -A PREROUTING -p tcp -d 192.168.56.200 --dport 20 -j MARK --set-mark 21

就是说,从客户端发给 192.168.56.200(浮动 IP)的 22/tcp 的包,打上 21 这个 mark,交给 LVS 处理。

被动模式下,是 FTP 服务器告诉客户端一个随机高端口,让客户端用自己的随机高端口来连接 FTP 服务器的随机高端口。我们首先要做的是把 FTP 服务器的被动连接端口范围固定,就是上面配置的 pasv_min_port 和 pasv_max_port。然后需要让 LVS 分发从客户端发给浮动 IP 的 pasv_min_port/tcp ~ pasv_max_port/tcp 的包,因此需要设置下面的 iptables 的规则:

# iptables -t mangle -A PREROUTING -p tcp -d 192.168.56.200 --dport 21 -j MARK --set-mark 21
# iptables -t mangle -A PREROUTING -p tcp -d 192.168.56.200 --dport 10000:20000 -j MARK --set-mark 21


现在理论上应该主动连接和被动连接都可以了,但是没有想象中的那么顺利。还有一个很关键的原因,我们通常配置的 LVS 是通过请求来分发给不同的 realserver 的。但是 FTP 这样的复杂协议,每一次连接都可能会被分发给不同的 realserver,导致数据连接意外中断(比如,控制连接和第一个 realserver 建立,但是数据连接却发给了第二个 realserver,导致数据连接失败)。所以还有一个很关键的参数要加进来——persistent。persistent 会让同一个客户端发来的请求在这一时间段内总能转发到一台 realserver 上。


至此,真个实验成功了。

评分

参与人数 1可用积分 +6 收起 理由
send_linux + 6 谢谢分享!

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2011-12-29 16:11 |只看该作者
不错的分享,支持下,LVS+ftp是基于什么应用咧?  如果说是ftp下载,前端加几个squid(varnish)就可以了啊

招聘 : 技术支持/维
论坛徽章:
0
3 [报告]
发表于 2012-01-04 10:30 |只看该作者
回复 2# king_819


    没错,你说的对。不过这个实验还真是我的一个客户的需求,客户想通过 LVS 实现 FTP 访问的负载均衡。我借机讲了以下 LVS 对于多端口服务的分发机制。哈哈~

论坛徽章:
2
处女座
日期:2014-02-11 22:56:59技术图书徽章
日期:2014-02-11 22:58:13
4 [报告]
发表于 2014-04-27 20:40 |只看该作者
完全看不懂的路过,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP