欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Keepalived结合Nginx或LVS实现高可用负载均衡

程序员文章站 2024-03-21 11:00:40
...

keepalived: 一种负载均衡高可用解决方案

1. 概览

1.1. keepalived是什么?

keepalived是用C语言编写的路由软件。该项目的主要目的是为Linux系统或基于Linux的基础架构提供轻量的、可靠的负载均衡高可用能力。

高可用(HA, High Available): 两个服务器节点启动着相同的服务,如果有一个故障,另一个自动接管,我们将将这个称之为高可用。

1.2. keepalived解决了什么问题?

负载均衡是服务虚拟化的一个很好的解决方案。设计负载均衡结构时必须特别注意两个问题:

  • 使用健康检查保证真实服务器的可用性:具有负载均衡能力的服务器,提供了全局的、高可用的虚拟服务。为了提高虚拟服务的可用性,我们通过使用健康检查机制来监视每个服务器节点。
  • 使用故障转移保证负载均衡的可用性:在使用负载均衡调度时,我们会面临虚拟服务单点故障的问题。因此,还必须使用专门的路由协议实现故障转移来保证负载均衡调度的高可用性。

keepalived引入强大而健壮的健康检查机制,并找到故障转移的解决方案,去解决上述两个问题。如果有一台服务器宕机,或工作出现故障,keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

1.3. keepalived是如何解决上述问题的?

keepalived健康检查(health-checks)机制采用TCP连接请求、ICMP请求、HTTP请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活,保证真实服务的可用性。利用健康检查机制,keepalived可以根据服务器运行状态,自适应地维护和管理负载均衡的服务器池。

keepalived故障转移方案基于VRRP实现高可用性。故障转移主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,保证负载均衡的稳定性。此外,keepalived还实现了一组VRRP有限状态机的钩子,从而提供了轻量且高速的协议交互。为了提供最快的网络故障检测,keepalived还采用了BFD协议,VRRP可以通过BFD协议来驱动状态快速转换。 keepalived框架可以独立使用,也可以作为弹性基础架构和其它框架一起配合使用。

故障转移(failover): 是一种备份操作模式,当主要组件由于失效或预定关机时间的原因而无法工作时,这种模式中的系统组件(比如处理机、服务器、网络或数据库)的功能被转接到备用组件。

VRRP(Virtual Router Redundancy Protocol): 虚拟路由冗余协议,解决局域网中配置静态网关出现单点失效现象的路由协议。

keepalived工作在TCP/IP参考模型的网际互连层、传输层、应用层:

Keepalived结合Nginx或LVS实现高可用负载均衡

  • 网际互连层(Layer3):keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似于Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

  • 传输层(Layer4):keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的Web服务器80端口、SSH服务22端口,keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

  • 应用层(Layer5/6/7):keepalived在应用层的运行方式全面化和复杂化,用户可以通过自定义keepalived工作方式,例如:可以通过编写程序或者脚本来运行keepalived,而keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果keepalived的检测结果和用户设定的不一致时,keepalived将把对应的服务器从服务器集群中剔除。

2. 安装与配置

2.1. 安装

  1. CentOS的yum安装:
$ yum install keepalived
  1. 基于Linux的源码安装:

keepalived下载

# 依赖库:gcc、openssl-devel、libnl、libnl-devel、libnfnetlink-devel

$ ./configure
$ make
$ make install

2.2. 默认配置

安装完成后,在/etc/keepalived文件夹中,keepalived.confkeepalived自动生成的默认配置文件,文件配置项说明如下:

! Configuration File for keepalived

global_defs {    # 全局参数定义
   notification_email {    # 定义通告邮件用户地址
     aaa@qq.com    #接收邮件地址
     aaa@qq.com
     aaa@qq.com
   }
   notification_email_from aaa@qq.com    # 定义发送邮件地址
   smtp_server 192.168.200.1  #邮件服务器
   smtp_connect_timeout 30    #连接超时
   router_id LVS_DEVEL    #当前路由设备ID
}

vrrp_script check_nginx {   # 脚本定义
    script "/etc/keepalived/check_keepalived.sh"   # 脚本位置
    interval 2  # 执行频率
    weight -5 # 根据脚本返回值调整priority
}

vrrp_instance VI_1 {    # 定义VRRP实例
    state MASTER    # 状态参数:MASTER/BACKUP(主/备)
    interface ens33    # 虚拟IP放置的的网卡接口
    virtual_router_id 51    #设置虚拟路由集群ID,同一个集群内的ID要一致
    priority 100    # 优先级设置,数值越大优先级越高
    advert_int 1    # 主备通讯时间间隔
    nopreempt    # 非抢占式
    authentication {    # 验证相关,同一组服务器配置需相同
        auth_type PASS    #PASS|AH
        auth_pass 1111
    }
    virtual_ipaddress {  # 虚拟IP地址
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
    track_script {
        check_nginx
    }
}

virtual_server 192.168.1.201 80 { #虚拟服务器配置块
	  delay_loop 3 #轮询健康检查时间间隔
	  lb_algo rr #负载均衡算法,rr,wrr,lc.wlc.lblc,sh,dh,默认wlc
    lb_kind DR #负载均衡模式,NAT,DR,TUN
	  protocol TCP #协议
	  sorry_server 127.0.0.1 8001 # 宕机反馈页,real_server宕机后跳转
	  real_server 192.168.1.107 80 { #真实服务器配置块
   	  weight 1 #权重
   	  HTTP_GET { #健康检测方式HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK
   	    	url {
   	    		path / #请求主页信息,可以自定义一个页面,专用做健康检测
   	    		status_code 200	#判断健康反馈码
   	    	}
   	    	connect_timeout 3 #检测超时时长
   	    	nb_get_retry 3 #重试次数
   	    	delay_before_retry 3 #延时时间,三秒检测一次,失败后,延时三秒后再次检测,失败三次后,判断为下线状态
   		}
   	}
}

2.3. 抢占式与非抢占式

  • 抢占式:MASTER从故障中恢复后,会将VIPBACKUP节点中抢占过来。keepalived组中服务器将状态state分别配置为MASTERBACKUP,但keepalived启动后,优先级priority配置高的先成为主服务器,拥有VIP

  • 非抢占式:之前的MASTER从故障中恢复后,不抢占由BACKUP升级为新的MASTER后的VIP。要设置非抢占式,除了增加nopreempt选项外,keepalived组中服务器要将状态state都配置为BACKUP,先启动keepalived的服务器最先成为主服务器,拥有VIP,与优先级priority配置无关。

3. 用例:keepalived高可用+nginx负载均衡

3.1. 准备环境

  • 4 * 虚拟机:

    • 内存:1GB
    • 处理器:1 * 2 Core
    • 存储:20GB
    • 操作系统:CentOS 7
  • 虚拟机IP地址分配和作用如下表:

名称 IP地址 作用
ka1 192.168.248.128 基于nginx静态资源托管的静态页面1(效果展示用)
ka2 192.168.248.129 基于nginx静态资源托管的静态页面2(效果展示用)
ka3 192.168.248.130 基于nginx的负载均衡器和keepalived主服务器
ka4 192.168.248.131 基于nginx的负载均衡器和keepalived备服务器

Keepalived结合Nginx或LVS实现高可用负载均衡

  • 注意事项:
# 关闭防火墙
$ systemctl stop firewalld
# 关闭selinux,重启生效
$ sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
# 时间同步
$ ntpdate 0.centos.pool.ntp.org
# 允许组播
$ iptables -A INPUT -d 224.0.0.18 -j ACCEPT

3.2. 搭建静态页面和负载均衡器

  1. 安装nginx,四台虚拟机均需要安装:
$ yum install nginx
  1. 命令行输入vi /usr/share/nginx/html/index.html打开默认托管页面的html文件,在页面中增加所在主机IP信息,以区分托管服务的真实服务
<div id="content">
  <!-- 标题处增加IP信息,ka1和ka2分别添加相应IP -->
  <h1>Welcome to CentOS(192.168.248.129)</h1>
  ...
</div>
  1. 启动nginx
$ systemctl start nginx
  1. 浏览器访问ka1(192.168.248.128)页面:

Keepalived结合Nginx或LVS实现高可用负载均衡

  1. 浏览器访问ka2(192.168.248.129)页面:

Keepalived结合Nginx或LVS实现高可用负载均衡

  1. 命令行输入vi /etc/nginx/nginx.conf打开nginx默认配置文件,配置负载均衡:
# ka3、ka4配置保持一致
http {
 ...

 # 增加负载均衡配置
 upstream loadbalance {
     server 192.168.248.128:80 weight=1 max_fails=3 fail_timeout=20s;
     server 192.168.248.129:80 weight=1 max_fails=3 fail_timeout=20s;
 }

 server {
     listen 80;
     server_name  localhost;

     location / {
         # 增加请求路由配置
         proxy_pass http://loadbalance;
         proxy_set_header Host $host:$proxy_port;
         proxy_set_header X-Forwarded-For $remote_addr;
     }
  }
}
  1. 浏览器访问ka3ka4IP地址,确认192.168.248.130192.168.248.131都能被负载均衡路由到192.168.248.128192.168.248.129页面,以ka3为例:

Keepalived结合Nginx或LVS实现高可用负载均衡
Keepalived结合Nginx或LVS实现高可用负载均衡

3.3. 配置并启动keepalived

  1. 命令行输入vi /etc/keepalived/keepalived.conf,修改配置文件,如下:
! Configuration File for keepalived

# ka3的state配置为MASTER,ka4配置为BACKUP

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.248.110/24 dev ens33 label ens33:1
    }
}
  1. 分别在ka3ka4上输入以下命令启动keepalived
$ systemctl start keepalived
  1. 启动完毕后,在ka3上输入ip a查看IP信息,可以看到虚拟IP漂移到网口上:
[aaa@qq.com ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a0:d4:6d brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.130/24 brd 192.168.248.255 scope global dynamic ens33
       valid_lft 1139sec preferred_lft 1139sec
    inet 192.168.248.110/24 scope global secondary ens33:1
       valid_lft forever preferred_lft forever
    inet6 fe80::41d7:702a:97de:24a1/64 scope link 
       valid_lft forever preferred_lft forever
  1. 浏览器访问虚拟IP地址192.168.248.110,可以路由到192.168.248.128192.168.248.129页面:

Keepalived结合Nginx或LVS实现高可用负载均衡

  1. 关闭主服务器虚拟机ka3电源,在ka4上输入ip a查看IP信息,可以看到虚拟IP漂移到网口上:
[aaa@qq.com ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:20:5b:61 brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.131/24 brd 192.168.248.255 scope global dynamic ens33
       valid_lft 1532sec preferred_lft 1532sec
    inet 192.168.248.110/24 scope global secondary ens33:1
       valid_lft forever preferred_lft forever
    inet6 fe80::b5bd:569f:3e1a:b773/64 scope link 
       valid_lft forever preferred_lft forever
  1. 浏览器访问虚拟IP地址192.168.248.110,仍可以路由到192.168.248.128192.168.248.129页面,至此,keepalived高可用+nginx负载均衡试验完毕!

4. 用例:keepalived+LVS高可用负载均衡

4.1. LVS简介

LVS部分术语定义:

Real server: A real server hosts the application accessed by client requests.

Server pool: A farm of real servers.

Virtual server: The access point to a Server pool.

Virtual Service: A TCP/UDP service associated with the VIP.

VIP: The Virtual IP is the IP address that will be accessed by all the clients. The clients only access this IP address.

RIP: The IP address of real server.

Linux虚拟服务器(LVS, Linux Virtual Server)是由章文嵩博士主导的开源Linux服务器集群系统,是中国国内最早出现的*软件项目之一,目前LVS已经被集成到Linux内核模块中。

keepalived依靠Linux虚拟服务器的核心模块实现了OSI(Open System Interconnection,开放系统互联)模型传输层的负载均衡能力。

三种工作模式:

  1. 基于NAT的LVS模式负载均衡:NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。
  2. 基于TUN的LVS负载均衡:我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。
  3. 基于DR的LVS负载均衡:DR(Dirct Routing)模式也叫直接路由模式,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,DR模式要求调度器与后端服务器必须在同一个局域网内,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址。

十种负载均衡调度算法:

  • 轮询调度(Round Robin 简称’RR’)
  • 加权轮询调度(Weight Round Robin 简称’WRR’)
  • 最小连接调度(Least Connections 简称’LC’)
  • 加权最少连接(Weight Least Connections 简称’WLC’)
  • 基于局部的最少连接(Locality-Based Least Connections 简称’LBLC’)
  • 带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication 简称’LBLCR’)
  • 目标地址散列调度(Destination Hashing 简称’DH’)
  • 源地址散列调度(Source Hashing 简称’SH’)
  • 最短的期望的延迟(Shortest Expected Delay 简称’SED’)
  • 最少队列调度(Never Queue 简称’NQ’)

4.2. 准备环境

  • 4 * 虚拟机:

    • 内存:1GB
    • 处理器:1 * 2 Core
    • 存储:20GB
    • 操作系统:CentOS 7
  • 虚拟机IP地址分配和作用如下表:

名称 IP地址 作用
ka1 192.168.248.128 基于nginx静态资源托管的静态页面1(效果展示用)
ka2 192.168.248.129 基于nginx静态资源托管的静态页面2(效果展示用)
ka3 192.168.248.130 基于LVS负载均衡配置的keepalived主服务器
ka4 192.168.248.131 基于LVS负载均衡配置的keepalived备服务器

Keepalived结合Nginx或LVS实现高可用负载均衡

  • 注意事项:
# 关闭防火墙
$ systemctl stop firewalld
# 关闭selinux,重启生效
$ sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
# 时间同步
$ ntpdate 0.centos.pool.ntp.org
# 允许组播
$ iptables -A INPUT -d 224.0.0.18 -j ACCEPT

4.3. 配置真实服务器(Real Server)的虚拟IP(VIP)和ARP规则

  1. 命令行输入ip a查看IP初始信息:
[aaa@qq.com ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:22:d1:3d brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.129/24 brd 192.168.248.255 scope global dynamic ens33
       valid_lft 1297sec preferred_lft 1297sec
    inet6 fe80::dc21:6770:bc26:68ad/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::41d7:702a:97de:24a1/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
  1. 输入以下命令增加虚拟IP和路由:
$ ifconfig lo:0 192.168.248.200 netmask 255.255.255.255
$ route add -host 192.168.248.200 dev lo:0
  1. 修改ARP设置:
net.ipv4.conf.all.arp_ignore = 1 # 仅当ARP目标IP地址是传入接口上配置的本地地址时才回复
net.ipv4.conf.all.arp_announce = 2 # 始终为此ARP目标使用最佳的本地地址。 在这种模式下,我们将忽略IP数据包中的源地址,并尝试选择我们希望与目标主机进行对话的本地地址
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

ARP:Address Resolution Protocol,地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。
arp_ignore: INTEGER Define different modes for sending replies in response to received ARP requests that resolve local target IP addresses
arp_announce: INTEGER Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface

Keepalived结合Nginx或LVS实现高可用负载均衡

  1. 命令行输入ip a查看修改后的IP信息:
[aaa@qq.com ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.248.200/32 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:22:d1:3d brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.129/24 brd 192.168.248.255 scope global dynamic ens33
       valid_lft 1096sec preferred_lft 1096sec
    inet6 fe80::dc21:6770:bc26:68ad/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::41d7:702a:97de:24a1/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

4.4. 配置主备服务器keepalived的LVS设置,测试:

  1. 命令行输入vi /etc/keepalived/keepalived.conf修改配置如下:
! Configuration File for keepalived
# ka3的state配置为MASTER,ka4配置为BACKUP

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.248.200/24 dev ens33 label ens33:1
    }
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.248.200 80 {
    delay_loop 6 # 设置健康检查时间,单位是秒
    lb_algo rr # 设置负载调度的算法为rr,可选参数有wrr,lc.wlc.lblc,sh,dh,默认wlc
    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 3 #指定时间内,同ip的请求会转发到同一个服务
    protocol TCP
    real_server 192.168.248.128 80 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高
        TCP_CHECK {
          connect_timeout 10
          nb_get_retry 3
          delay_before_retry 3
          connect_port 80
        }
    }
    real_server 192.168.248.129 80 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
          connect_timeout 10
          nb_get_retry 3
          delay_before_retry 3
          connect_port 80
        }
     }
}

  1. 启动ka1ka2nginx,以显示静态页面:
$ systemctl start nginx
  1. 启动ka3ka4keepalieved,以启动高可用负载均衡:
$ systemctl start keepalived
  1. 查看主服务器的IP信息,虚拟IP地址192.168.248.200漂移到该服务器:
[aaa@qq.com ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:20:5b:61 brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.130/24 brd 192.168.248.255 scope global dynamic ens33
       valid_lft 1044sec preferred_lft 1044sec
    inet 192.168.248.200/24 scope global secondary ens33:1
       valid_lft forever preferred_lft forever
    inet6 fe80::b5bd:569f:3e1a:b773/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
  1. 浏览器访问虚拟IP地址192.168.248.200,可路由到192.168.248.128192.168.248.129页面:

Keepalived结合Nginx或LVS实现高可用负载均衡

  1. 关闭主服务器虚拟机ka3电源,在ka4上输入ip a查看IP信息,可以看到虚拟IP漂移到网口上:
[aaa@qq.com ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:20:5b:61 brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.131/24 brd 192.168.248.255 scope global dynamic ens33
       valid_lft 1532sec preferred_lft 1532sec
    inet 192.168.248.200/24 scope global secondary ens33:1
       valid_lft forever preferred_lft forever
    inet6 fe80::b5bd:569f:3e1a:b773/64 scope link 
       valid_lft forever preferred_lft forever
  1. 浏览器访问虚拟IP地址192.168.248.200,仍可以路由到192.168.248.128192.168.248.129页面,至此,keepalived+LVS高可用负载均衡试验完毕!

4.5. LVS管理工具ipvsadm的使用:

  • 安装
$ yum install ipvsadm -y
  • 查看当前配置的虚拟服务和各个真实服务的权重:
[aaa@qq.com ~]# 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.248.200:80 rr
  -> 192.168.248.128:80           Route   3      0          0         
  -> 192.168.248.129:80           Route   3      0          0    
  • 查看IPVS模块的转发情况统计:
[aaa@qq.com ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.248.200:80                  3       18        0     3448        0
  -> 192.168.248.128:80                  1       13        0     3188        0
  -> 192.168.248.129:80                  2        5        0      260        0
  • 查看LVS的超时时间
[aaa@qq.com ~]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300
[aaa@qq.com html]# ipvsadm --set 1 10 300
  • 连接超时时间设置

TCP的连接超时时间配置最好和keepalived配置中的persistence_timeout保持一致。

[aaa@qq.com ~]# ipvsadm --set 3 10 300

5. 故障排查

5.1. 脑裂现象

由于某些原因,导致两台keepalived服务器在指定时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台高可用服务器有都还存活。
可能出现的原因:
1、服务器网线松动等网络故障;
2、服务器硬件故障发生损坏现象而崩溃;
3、主备都开启了firewalld防火墙。

解决方案(抢占式):在备节点服务器上运行脚本,如果可以ping通主节点服务器并且备节点服务器有VIP就报警,让人员介入检查是否裂脑。

5.2. 高可用服务只针对物理服务器的问题

keepalived软件仅仅在对方机器宕机或keepalived停掉的时候才会接管业务。但在实际工作中,有业务服务停止而keepalived服务还在工作的情况,这就会导致用户访问的VIP无法找到对应的服务的问题。

解决方案:健康检查配置增加真实服务端口检查策略。

5.3. 多组keepalived服务器在一个局域网的冲突问题

keepalived高可用功能是通过VRRP实现的,VRRP默认通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组keepalived服务器,而又未使用专门的心跳线通信时,就会造成IP多播地址冲突问题,导致接管错乱,不同组的keepalived都会使用默认的224.0.0.18作为多播地址。

解决方案:在同组的keepalived服务器所有的配置文件里将vrrp_mcast_group指定为独一无二的多播地址。