IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

怎么样让 LVS 和 realserver 工作在同一台机器上

扶凯 2012-05-28 12:30:20 累计浏览 4,133 次
本机暂存

我们有一个简单便宜的 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
 
二台机器上的配置都是这样(^-^上面其实有小修改),.在这种架构中,我只要停止我的备份的 keepalived ,就能正常的工作,不然一定有其中一台数据库连接到最后就中断停止在那个地方不动了.通过抓包,大量包被不断的转发来转发去.
我们来详细分析一下.
  1. 客户端发送连接的请求到  VIP 的指定的端口
  2. 当前的 director 会选择二个 realserver 来转发请求,会传送数据给 localnode 的本机网卡或者备份的机器上指定的那个 MAC 的 eth0  (同时他也做为 realserver) . 正常的 LVS ,这些数据包会被监听这个 VIP 的程序接收.
  3. 如果数据包是发送给备份的 director 服务器的 eth0 接口.它会不能正常的被监听指定端口的程序所接收,因为数据包会首先先经过 ip_vs().
  4. 这时,有 50% 的机会,这个包被转发给 , 这时会生成标准的回应数据包给客户端. 因为能正常的回应客户端,这时 LVS 的功能是正常的,我们想所有的包都直接给监听程序来处理.并不想直接通过 ip_vs() 来转发.
  5. 这时还有 50% 的数据包会直接在次转给主 LVS 的 eth0/VIP.
  6. 我们不想数据包从备份的 LVS 在次转回去给主 LVS 这样会形成 .
  7. 所以我们要让 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
        }
    }
}

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. 我对技术方向的一些反思 (累计阅读 11,320)
  2. 大型高并发高负载网站的系统架构分析 (累计阅读 9,006)
  3. TT的作者出新作品鸟:kyoto tycoon (累计阅读 7,954)
  4. 数据分析中常用的数据模型 (累计阅读 7,950)
  5. TinyURL设计方案 (累计阅读 7,332)
  6. LVS hash size解决4096个并发的问题 (累计阅读 6,410)
  7. 消息分发的同步均衡策略 (累计阅读 6,218)
  8. 5分钟搞定你的Rest Server (累计阅读 5,743)
  9. 从Rails聊聊小公司的研发团队建设 (累计阅读 5,572)
  10. 老托的Oracle 数据库Patch概念性小常识 (累计阅读 5,550)