怎么样让 LVS 和 realserver 工作在同一台机器上
我们有一个简单便宜的 LVS-DR 的设置.二台机器(服务器),二台都运行着数据库的服务.外面请求过来的这些流量导向本地机器的服务器或其他服务器.因为纯 4 层调度,这是我最喜欢的方式.因为节约,我这次想直接要这二台服务器上运行 LVS 的服务.不在通过其它的机器.
所以使用 keepalived 来配置,做个主从,也同时在这个机器上.是个很完美的方案.
但是,我让同事帮着配置,一直不能正常的工作.下面是简单的架构图,和配置输出:
结构如下:
ip_vs() balances on VIP:port
CIP
CIP |
v | CIP->MAC of eth0 on backup normal packet
VIP | MAC of eth0 on active<-CIP spurious packet
|—————-
| |
eth0 VIP eth0 VIP
_______ _______
| | | |
active | | | | backup
|_______| |_______|
配置的输出如下,可以见到有一个地方不一样,就是显示有个地方是 Local.
# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 6 rr -> 192.168.1.233:3306 Local 1 0 0 -> 192.168.1.213:3306 Route 1 0 0 |
我们来详细分析一下.
- 客户端发送连接的请求到 VIP 的指定的端口
- 当前的 director 会选择二个 realserver 来转发请求,会传送数据给 localnode 的本机网卡或者备份的机器上指定的那个 MAC 的 eth0 (同时他也做为 realserver) . 正常的 LVS ,这些数据包会被监听这个 VIP 的程序接收.
- 如果数据包是发送给备份的 director 服务器的 eth0 接口.它会不能正常的被监听指定端口的程序所接收,因为数据包会首先先经过 ip_vs().
- 这时,有 50% 的机会,这个包被转发给 , 这时会生成标准的回应数据包给客户端. 因为能正常的回应客户端,这时 LVS 的功能是正常的,我们想所有的包都直接给监听程序来处理.并不想直接通过 ip_vs() 来转发.
- 这时还有 50% 的数据包会直接在次转给主 LVS 的 eth0/VIP.
- 我们不想数据包从备份的 LVS 在次转回去给主 LVS 这样会形成 .
- 所以我们要让 eth0 上发到给 VIP 的包, 只要不是其它 LVS 发的,才使用 ip_vs() 来处理.
简单来讲:当客户端发送数据包给 VIP .比如我们的 Director1 (Master 主)这个接口正在工作,这时 LVS 能接收到这个包,然后根据 keepalived 的配置进行 load balance .这时 Director1 会使用 LVS-DR 的功能给包路由给自己或者 Director2 (Backup).
这时有个问题.在这个例子中因为我们使用了 keepalived .这时 Director2 这台是一台 VIP 的备份服务器.这时 keepalived 默认会立即启动使用 ipvsadm 的规则来配置这台服务器怎么样做备份的处理.来使得更快的故障转移.所以这时这些规则这台备份的 Director2 主机都会存在.
这就有问题了.当从 Director1 (Master 主),比如使用 rr .会转发大约 50% 的包从 Director1 到 Director2 (Backup)的 3306 的端口.这时因为 Director2 因为这些 LVS-DR 的配置规则会接着给这些包,在做一次 load balance .又发回去给 Director1.这时会产生一个死的循环.
随着时间的推移,不但不能正常的处理连接,您的服务器也会崩溃,在他们中间或后端不断的反复连接.
解决方案: 给进入 eth0 的包打包 mark 的标记,当数据包是发给 VIP:80 并且 MAC 不其它 LVS 服务器的话. 才做个 mark ,这样才会对指定的 fwmark 进行 loadbalance 放入到 LVS 中处理.只要数据包是从任意其它的 MAC 地址(非 LVS 的转发)会被发往 VIP:port, 会不在进行 loadbalanced 而是直接转给后面监听的 demon 程序进行应用的处理.实际就是我们使用 iptables 来对进入的流量设置 MARK.然后配置 keepalived 只处理有 MARK 过的流量.不在使用以前绑定 VIP 和端口.
iptables 的配置如下:
同时服务于 LVS-DR,又要做为数据库的后端.所以我们要注意,只接收一个 director 的数据包.
这时我们在 Director1 中设置($MAC_Director2 是指我在 Director1 上所能见到从 Director2 发过来包的 MAC 地址) :
1 |
iptables -t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac \ ! --mac -source $MAC_Director2 -j MARK --set -mark 0x3 |
并在备份的 keepalived 的服务器 Director2 中设置:
1 |
iptables -t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac \ ! --mac -source $MAC_Director1 -j MARK --set -mark 0x4 |
接着在 keepalived 中分别配置这二个.
Director1: virtual_server fwmark 3 { Director2: virtual_server fwmark 4 { |
其实这个的完整配置象如下:
keepalived 来根据 MARK 来配置的方法
virtual_server fwmark 4 {
delay_loop 10
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.1.213 3306 {
weight 1
MISC_CHECK {
misc_path
"/etc/keepalived/check_slave.pl 192.168.1.213"
misc_dynamic
}
}
real_server 192.168.1.233 3306 {
weight 1
MISC_CHECK {
misc_path
"/etc/keepalived/check_slave.pl 192.168.1.233"
misc_dynamic
}
}
}
建议继续学习:
- LVS hash size解决4096个并发的问题 (阅读:5430)
- LVS & MySQL NDB Cluster (阅读:4054)
- 记一次LVS/Nginx环境下的访问控制 (阅读:3836)
- LVS & MySQL NDB Cluster (阅读:3719)
- 利用MySQL Cluster 7.0 + LVS 搭建高可用环境 (阅读:3381)
- 在LVS上实现SNAT网关 (阅读:1302)
- 一些LVS实验配置、工具和方案 (阅读:1168)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:扶 凯 来源: 扶凯
- 标签: LVS realserver
- 发布时间:2012-05-28 12:30:20
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 图书馆的世界纪录
- [54] android 开发入门
- [54] 如何拿下简短的域名
- [52] Oracle MTS模式下 进程地址与会话信
- [52] Go Reflect 性能
- [49] 【社会化设计】自我(self)部分――欢迎区
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [41] 程序员技术练级攻略
- [35] 视觉调整-设计师 vs. 逻辑