青蛙学Linux—使用LVS实现负载均衡集群

时间:2022-10-19 03:07:17

从Linux的2.4内核开始,LVS的主要模块IPVS已经集成在了Linux的内核中,无需再另外安装。但是要使用IPVS的功能,则需要其他软件的配合。常见的有IPVS管理软件ipvsadmKeepalived

1、ipvsadm

ipvsadm是IPVS的一个管理工具,用于对IPVS进行配置和管理。ipvsadm可以在LVS的官网下载到源码包和RPM包,但由于LVS官网已很久没有更新,所以这里推荐使用YUM安装ipvsadm,这样可以获取到ipvsadm的新版本。

使用以下命令安装ipvsadm:

yum install ipvsadm

ipvsadm常用参数:

  • -A:添加一条新的虚拟服务规则
  • -E:编辑一条虚拟服务规则
  • -D:删除一条虚拟服务规则
  • -C:清除所以的虚拟服务规则
  • -R:恢复虚拟服务规则
  • -a:在一个虚拟服务中添加一个新的真实服务器(Real Server)
  • -e:编辑某个真实服务器
  • -d:删除某个真实服务器
  • -L|-l:显示内核中的虚拟服务规则
  • -n:以数字形式显示IP端口
  • -c:显示IPVS中目前存在的连接,可以用于分析调度情况
  • -Z:将转发消息的统计清零
  • -p:配置持久化时间
  • --set tcp|tcpfin|udp:配置tcp|tcpfin|udp的超时时间
  • -t|-u:基于TPC|UDP协议的虚拟服务规则
  • -g|-m|-i:对应三种负载均衡实现机制DR|NAT|TUN
  • -w:配置真实服务器的权重
  • -s:配置负载均衡算法
  • --timeout:显示配置的tcp|tcpfin|udp的超时时间
  • --stats:显示历史转发消息统计(累加值)
  • --rate:显示转发速率信息(瞬时值)

使用ipvsadm仅能实现负载均衡,无法对后端的Real Server进行健康监测,这样当后端的Real Server出现故障时,ipvsadm无法将其从服务器组中撤下,导致转发到该Real Server的请求就失败。

2、Keepalived+LVS实现负载均衡集群

Keepalived属于LVS的扩展项目,起初是为了解决前端LB无法对后端RS进行健康监测而开发的。Keepalived对后端的RS进行健康监测,在RS发生故障时自动将其剔除,并在其恢复正常后重新将其加入集群。而Keepalived在引入VRRP之后也可用于高可用集群,这样,Keepalived+LVS就可以实现前端LB的高可用和后端RS的负载均衡。

注意:Keepalived实际上是通过ipvsadm来管理和配置IPVS的,所以要使用Keepalived支持LVS必须安装ipvsadm

Keepalived对于LVS的支持是在配置文件中的LVS配置段中实现的。LVS配置段以virtual_server做为开始标识,分为virtual_server段、real_server段和健康监测段。

2.1、virtual_server段配置

virtual_server用于配置VIP、负载均衡算法、负载均衡机制等。常用配置如下:

virtual_server VIP 端口 {
    delay_loop 时间
    lb_algo 算法
    lb_kind 负载均衡实现机制
    persistence_timeout 时间
    persistence_granularity 子网掩码
    protocol 协议
    ha_suspend
    sorry_server IP 端口
    ...
}
  • virtual_server:虚拟服务器的开始,后跟VIP和端口
  • delay_loop:定义健康检查的时间间隔,单位为秒
  • lb_algo:定义负载均衡调度算法,值为rr|wrr|dh|sh|lc|wlc|sed|nq|lblc|lblcr
  • lb_kind:定义负载均衡实现的机制,值为DR|NAT|TUN
  • persistence_timeout:会话保持最大无响应超时时间,单位秒。定义该项后,用户的请求在定义的时间内会发送给同一个RS;当用户在定义的时间内一直没有进行操作,则下一次请求将会被发送到一个新的RS上。适用于动态网页session共享的环境
  • persistence_granularity:配合persistence_timeout使用,通过子网掩码来定义会话保持对一个IP生效还是对一组IP生效。默认值为255.255.255.255,表示单个客户端分配到一个RS上;255.255.255.0表示客户端IP所在的整个网段的请求都会分配给同一台RS
  • protocol:定义转发协议类型,有TCP和UDP两种可选
  • ha_suspend:在LB节点状态从Master切换到Backup时,不启用对RS节点的健康检查
  • sorry_server:备用节点,当所有的后端RS失效后启用该备用节点

2.2、real_server段配置

real_server段位于virtual_server段内,用于配置后端RS。常用配置如下:

real_server IP 端口 {
    weight 数值
    inhibit_on_failure
    notify_up  脚本
    notify_down 脚本
}
  • real_server:real_server段开始的标识,后跟RS的真实IP地址和端口
  • weight:定义RS的权重
  • inhibit_on_failure:在检测到RS节点故障之后将weight值改为0,而不是从IPVS中删除
  • notify_up:在检测到RS节点服务处于UP状态后执行的脚本
  • notify_down:在检测到RS节点服务处于DOWN状态后执行的脚本

2.3、健康检测段配置

Keepalived对于后端RS的健康检查支持多种方式,常见的有HTTP_GET、SSL_GET、TCP_CHECK、MISC_CHECK。健康检查段位于real_server段内。

2.3.1、TCP_CHECK

TCP_CHECK通过TCP协议连接后端RS的指定端口来判断后端RS是否正常。常用配置如下:

TCP_CHECK {
    connect_port 端口
    connect_timeout 时间 
    nb_get_retry|retry 次数
    delay_before_retry 时间 
}
  • connect_port:定义进行健康检查时连接的后端RS端口,如果没有定义,则使用real_server段指定的端口
  • connect_timeout:无响应超时时间,单位秒
  • nb_get_retry|retry:重试次数。在Keepalived 2.x版本之前使用nb_get_retry,2.x版本之后使用retry
  • delay_before_retry:重试间隔时间,单位秒
2.3.2、HTTP_GET|SSL_GET

通过对指定URL计算摘要信息来检查后端RS是否正常。常用配置如下:

HTTP_GET|SSL_GET {
    url {         
        path URI
        digest URL摘要信息
        status_code HTTP状态码 
    }
    bindto IP地址
    connect_port 端口	
    connect_timeout 时间
    nb_get_retry|retry 次数
    delay_before_retry 时间
} 
  • url:定义HTTP|SSL检查时的URL信息,可以指定多个
  • path:定义检查的详细URL路径
  • digest:URL的摘要信息,摘要信息可通过genhash工具获取。例如,获取192.168.0.80上index.html的摘要信息
    genhash -s 192.168.0.80 -p 80 -u /index.html
  • status_code:定义HTTP检查返回正常状态码的类型,一般是200
  • bindto:定义通过哪台服务器发送请求对后端RS进行健康检查
2.3.3、MISC_CHECK

MISC_CHECK健康检查方式可以通过执行一个外部程序或脚本来判断后端RS是否正常。常用配置如下:

MISC_CHECK {
    misc_path 脚本
    misc_timeout 时间
    misc_dynamic
}
  • misc_path:指定一个外部程序或脚本
  • misc_timeout:定义执行脚本的超时时间
  • misc_dynamic:动态调整RS节点的权重,前面加!表示不启用。在启用该功能后,Keepalived会根据返回码来动态调整RS节点的权重。如果返回码为0,表示健康检查正常,节点权重不变;如果返回码为1,表示健康检查失败,Keepalived将调整节点权重为0;如果返回码为2-255之间的任意值,表示健康检查正常,但Keepalived将会调整节点权重为返回码-2