青蛙学Linux—使用LVS实现负载均衡集群
从Linux的2.4内核开始,LVS的主要模块IPVS已经集成在了Linux的内核中,无需再另外安装。但是要使用IPVS的功能,则需要其他软件的配合。常见的有IPVS管理软件ipvsadm和Keepalived。
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