LVS + Keepalived实现集群高可用

September 17, 2021

本文详细介绍了如何使用LVS和Keepalived实现集群高可用。首先,我们在LVS服务器上安装ipvsadm和keepalived服务,然后在WEB服务器上安装nginx服务并配置index.html文件。接着,我们在LVS服务器上配置keepalived.conf文件和RS服务,最后通过访问VIP来验证配置的正确性。整个过程中,我们详细解释了每一步的操作和配置的含义,帮助读者更好地理解和实践。

机器说明

IP 说明
192.168.199.13 LVS服务器
192.168.199.11 WEB服务器1
192.168.199.12 WEB服务器2
192.168.199.101 VIP(虚拟IP)

LVS服务器

# 安装ipvsadm
[root@localhost ~] yum install ipvsadm -y

# 安装keepalived服务
[root@localhost ~] yum install keepalived -y

WEB服务器1

# 安装nginx服务
[root@localhost ~] yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
[root@localhost ~] wget https://nginx.org/download/nginx-1.21.3.tar.gz && tar -zxf nginx-1.21.3.tar.gz && cd nginx-1.21.3/
[root@localhost ~] ./configure && make && make install
[root@localhost ~] /usr/local/nginx/sbin/nginx

# 配置index.html文件
[root@localhost ~] cat /usr/local/nginx/html/index.html
192.168.199.11

# 修改arp_ignore和arp_announce配置
# 注意!!!我的网卡是ens33,按自己实际网卡来操作,比如eth0目录下
[root@localhost ~] echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
[root@localhost ~] echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
[root@localhost ~] echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~] echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# 环回接口配置VIP,实现对内可见对外隐藏
# 切记!!! 切记!!! 掩码是4个255
[root@localhost ~] ifconfig lo:2 192.168.199.101 netmask 255.255.255.255

WEB服务器2

操作同WEB服务器1

LVS服务器

# 修改keepalived.conf文件
[root@localhost ~] cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   # ... 此处省略关于邮件的配置
   router_id LVS_01 # 表示运行keepalived服务器的一个标识
}
vrrp_instance VI_1 {
    state MASTER # 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface ens33 # 指定HA监测的网卡 根据自己实际网卡配置,例如eth0
    virtual_router_id 51 # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    priority 100 # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
    advert_int 1 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication { # 设置验证类型和密码
        auth_type PASS # 设置验证类型,主要有PASS和AH两种
        auth_pass 1111 # 设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    }
    virtual_ipaddress { # 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.199.101/24 dev ens33 label ens33:2 # 192.168.199.101为vip  ens33同上  ens33:2接口 
    }
}

# 配置RS服务
virtual_server 192.168.199.101 80 {
    delay_loop 6 # 设置运行情况检查时间,单位是秒
    lb_algo rr # 设置负载调度算法,这里设置为rr,即轮询算法
    lb_kind DR # 设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 50 # 会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
                           # 有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
                           # 需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作
                           # 那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制
    protocol TCP # 指定转发协议类型,有TCP和UDP两种

    # WEB服务器1 80端口
    real_server 192.168.199.11 80 {
        weight 1 # 配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
                 # 分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源
        HTTP_GET {
            url {
              path /
              status_code 200
            }

            connect_timeout 3 # 表示3秒无响应超时
            nb_get_retry 3 # 表示重试次数
            delay_before_retry 3 # 表示重试间隔
        }
    }

    # WEB服务器2 80端口
    real_server 192.168.199.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }

            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# 配置完成之后重启keepalived
# centos7
[root@localhost ~] systemctl restart keepalived.service

# ipvsadm 查看rs情况
# ipvsadm -lnc 会查看当前连接情况
[root@localhost ~] 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.199.101:80 rr
  -> 192.168.199.11:80            Route   1      0          0
  -> 192.168.199.12:80            Route   1      0          0

访问VIP

# 请求结果会轮着来
[root@localhost ~] curl -X GET http://192.168.199.101:80
192.168.199.11
[root@localhost ~] curl -X GET http://192.168.199.101:80
192.168.199.12
其他lvs

IARNO

服务端开发

Python 变量和简单数据类型

LVS负载均衡实践