Keepalived实现高可用集群②:LVS-NAT负载均衡

2018-05-11|Categories: Cluster, Linux|Tags: , |

前一篇文章《Keepalived实现高可用集群①:LVS-DR负载均衡》已经讲述了Keepalived的原理和配置过程,本文专门讲述Keepalived如何实现LVS-NAT的高可用。

网络拓扑

network topology of keepalived 1 master makes lvs-nat high available

客户端的IP和路由

网卡 网卡模式 IP地址 地址获取方式
eth2 host only 172.16.125.61/24 static
eth2:1 192.168.11.61/24 manual

「static」表示网卡配置文件内已写入BOOTPROTO=staticBOOTPROTO=none,以及IPADDR。「manual」表示通过ipconfig eth2:1 192.168.11.61/24这种方式配置IP地址。更多内容详见《实现LVS-DR和Session绑定》,此处不再赘述。

VS1的IP和路由

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.71/24 static

VIP、DIP都通过Keepalived来配置。

VS2的IP和路由

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.74/24 static

RS1的IP和路由

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.72/24 static

指定默认网关:

nmcli c m ens34 +ipv4.gateway 172.16.125.200
nmcli c up ens34

其它诸如安装配置httpd、单机测试的步骤同样也记录在前面链接的文章中,此处不再赘述。

RS2的IP和路由

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.73/24 static

指定默认网关:

nmcli c m ens34 +ipv4.gateway 172.16.125.200
nmcli c up ens34

配置Keepalived

备份配置文件

cp -v /etc/keepalived/keepalived.conf{,.bak}

编辑配置文件

# 清空原有内容
> /etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf

粘贴以下内容:

# Configuration File for keepalived     # 感叹号、井号开头的行都是注释

global_defs {                       # 全局配置
   notification_email {             # 接收Keepalived状态提醒邮件的地址
     root@localhost                 # 可以设置多个接收地址
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1            # 邮件发送服务器就是本机
   smtp_connect_timeout 30
   router_id vs_1                   # 物理路由器在VR组中的ID,不要和VRID混淆
   vrrp_mcast_group4 224.1.1.1      # 指定当前VR组通信的多播组,非常重要
}

vrrp_sync_group lvs_nat {           # 配置VRRP地址同步组,这是LVS-NAT高可用的关键!
    group {                            # 同步组中的所有VIP会一起飘移
        lvs_vip                       # 第一个需要飘移的VIP:lvs_vip,具体内容在后面定义
        lvs_dip                       # 第二个需要飘移的VIP:lvs_dip,具体内容在后面定义
    }
}

vrrp_instance lvs_vip {             # 配置VR组
    #state BACKUP                   # 状态分为MASTER和BACKUP,可以不设置,根据优先级决定
    interface ens34                 # 用哪一块网卡绑定VIP
    virtual_router_id 16            # VRID,取值范围:0-255
    priority 100                    # 优先级,如果不设置这一行,将使用默认值:100
    advert_int 1                    # 向多播组发送通知的时间间隔,默认值:1(秒)
    virtual_ipaddress {             # 用于自动飘移的VIP
        192.168.11.200/24
    }
}

vrrp_instance lvs_dip {
    #state BACKUP
    interface ens34
    virtual_router_id 17            # 注意,与前面的lvs_vip的VRID不同
    priority 100
    advert_int 1
    virtual_ipaddress {
        172.16.125.200/24
    }
}

virtual_server 192.168.11.200 80 {  # 配置LVS调度器,VIP必须和自动飘移的VIP相同
    delay_loop 3                       # 检查后端RS健康状态的时间间隔
    lb_algo wrr                        # LVS调度算法
    lb_kind NAT                        # LVS工作模式
    protocol TCP                       # LVS调度协议,可选参数:TCP|UDP|SCTP

    real_server 172.16.125.72 80 {     # 通过指定RIP配置RS
        weight 1                          # 权重
        HTTP_GET {                        # 健康状态检查方式,常用参数:HTTP_GET|SSL_GET|TCP_CHECK
            url {
                path /                      # 用GET方法访问网站根目录
                status_code 200             # 如果返回状态码为200,表示RS工作正常
            }
        }
        connect_timeout 1                 # 必须在1秒内返回状态检查结果
        nb_get_retry 3                    # 如果检查失败,重试3次
        delay_before_retry 1              # 每次重试前,等待1秒
    }

    real_server 172.16.125.73 80 {
        weight 2                          # 权重为2
        HTTP_GET {
            url {
                path /
                status_code 200
            }
        }
        connect_timeout 1
        nb_get_retry 3
        delay_before_retry 1
    }
}

配置文件中已经注明,Keepalived实现LVS-NAT高可用的关键是配置VRRP同步组vrrp_sync_group,因为LVS-NAT的工作特点是RS必须把VS的DIP设置为默认网关,如果主VS故障停机,它的VIP和DIP必须同时飘移到备用VS。

第二台VS也需要同样的配置,只有两处需要修改:

  • 一是router_id,设置为router_id vs_2
  • 二是优先级,设置为和第一台的priority 100不同就可以了。

启动Keepalived

systemctl restart keepalived

查看Keepalived工作状态

能否自动生成ipvs规则

在Keepalived的配置文件正确配置virtual_server参数之后,Keepalived一启动就会自动生成ipvs规则,然后定期检查RS的健康状况,动态更新RS服务器池。

$ ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.11.200:80 wrr
  -> 172.16.125.72:80             Masq    1      0          0
  -> 172.16.125.73:80             Masq    2      0          0

可以在任意一台RS上停止httpd服务,看Keepalived是否会及时更新RS列表。

能否自动飘移VIP

Keepalived启动后,检查本机是否获取到VRRP同步组的所有VIP:

$ ip a | grep -E '192.168.11.200|172.16.125.200'
    inet 192.168.11.200/24 scope global ens34
    inet 172.16.125.200/24 scope global secondary ens34

如果已经获取VIP,就停止Keepalived服务,检查所有VIP是否自动飘移到另一台VS。

整体测试

VS和RS都就绪之后,在客户端上做整体测试,结果完全符合预期:

$ for i in {1..45}; do curl -s 192.168.11.200; done | sort | uniq -c
     15 Real server at 172.16.125.72
     30 Real server at 172.16.125.73

在Master VR上停止Keepalived服务,如果上面的测试仍然可以得到正确结果,就证明Keepalived实现了LVS-NAT的高可用。

Leave A Comment