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

怎么样让 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

二台机器上的配置都是这样(^-^上面其实有小修改),在这种架构中,我只要停止我的备份的 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 地址) :

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 中设置:

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

        }
    }
}

参考资料:http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.cluster_friendly_applications.html

### LVS工作原理及负载均衡机制 LVSLinux Virtual Server),即 Linux 虚拟服务器,是一种基于 Linux 内核的高性能四层负载均衡解决方案[^1]。它通过 IPVS(IP Virtual Server)模块来实现流量转发功能,能够显著提升网络服务的整体性能可靠性。 #### 1. 基本架构 LVS 架构通常由三部分组成:调度器(Director)、真实服务器群集(Real Servers)以及共享存储设备(Shared Storage)。其中,调度器负责接收客户端请求并将其合理分配给后端的真实服务器;而真实服务器则具体执行业务逻辑并将响应返回给客户端[^3]。 #### 2. 工作模式 LVS 支持多种工作模式,主要包括 NAT(Network Address Translation)、DR(Direct Routing) TUN(Tunneling)。每种模式都有其特点,在实际部署时需根据场景选择合适的方案: - **NAT 模式** 在此模式下,所有外部访问都经过调度器进行地址转换后再发送到内部服务器上完成处理。这种方式配置简单,但可能带来额外延迟,并且要求调度器具备足够的带宽资源支持整个系统的通信量。 - **DR 模式** DR 方式允许数据包直接从源主机到达目标机器而不必再流经调度节点本身,从而减少单点瓶颈问题的发生几率。不过需要注意的是,采用该方法的前提条件之一就是各物理机之间必须处于同一个二层广播域内以便于 ARP 请求可以正常解析虚拟 IP 地址对应的 MAC 地址信息。 - **TUN 模式** 隧道技术利用封装后的 IP 数据报形式传递原始消息至指定位置解封还原成初始状态继续后续流程操作。相比前两者而言更加灵活自由不受地域限制影响较大程度提高了跨区域间协作效率的同时也增加了复杂度维护成本相对较高一些。 #### 3. 负载均衡算法 为了更高效地管理请求分布情况,LVS 提供了一系列内置策略用于指导如何挑选最佳候选者接受新任务安排。这些常用的方法有轮询法(Round Robin)、最少连接数(Least Connections)、加权比例(Weighted Scheduling Algorithms)等等。它们各自侧重不同方面满足特定条件下对于服务质量的要求标准不一。 #### 4. 可靠性扩展性增强措施 除了基本的功能之外,还可以借助其他工具进一步加强整体稳定性表现水平。例如 Keepalived 就常被用来构建高可用性的双活或多活架构体系结构以防止单点失效风险发生概率降到最低限度之内 。另外关于会话保持话题,则可通过设置相应的防火墙标记或者启用持久化选项达成目的确保用户体验连续不间断持续下去[^2]。 ```bash ipvsadm -A -t 192.168.0.1:80 -s rr # 添加一个TCP类型的虚拟服务 使用RoundRobin算法 ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2:80 -m # 向上述虚拟服务添加一RS 并使用MASQUERADE方式 ``` 以上命令展示了如何创建简单的 LVS 设置实例过程概览图景示意说明文档参考资料链接如下所示:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值