keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,后来又加入了VRRP的功能,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由出现的单点故障问题,它能够保证网络的不间断、稳定的运行。
所以,keepalived一方面具有服务器健康检测功能,另一方面也具有HA cluster负载均衡功能。
Keepalived的官方站点是http://www.keepalived.org,可以在这里下载到各种版本,我们这里下载的是keepalived-1.1.19.tar.gz,安装步骤如下:
下载安装keepalived,依赖于openssl和openssl-devel,:
#yum -y install openssl-devel popt-devel
#yum install wget
#wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
#tar zxvfkeepalived-1.2.13.tar.gz
#cd keepalived-1.2.13
#Yuminstall gcc
#./configure--prefix=/usr/local/keepalived >--with-kernel-dir=/usr/src/kernels/2.6.18-8.el5-i686
说明:在编译选项中-with-kernel-dir”这是个很重要的参数,但这个参数并不是要把Keepalived编译进内核,而是指定使用内核源码里面的头文件,就是include目录。如果要使用LVS时,才需要用到此参数,否则是不需要的。
#Make&& make install
#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#cp /usr/local/keepalived /etc/sysconfig/keepalived /etc/sysconfig/
#cp /usr/local/keepalived /etc/rc.d/init.d/keepalived /etc/init.d/
# mkdir /etc/keepalived
# cd /etc/keepalived
# cp /usr/local/keepalived /etc/keepalived/keepalived.conf ./
注:由于keepalived配置文件有语法错误也能启动,因此看到启动了lvs服务,不代表配置文件没有错误,如果遇到lvs不能正常转发,及时跟踪日志进行处理。
启动keepalived:
servicekeepalived start
---通过查看日志判断keepalived(因为缺少校验)是否启动成功:
# tail -f /var/log/messages
Oct 15 19:48:07 192 systemd: StartingSYSV: Start and stop Keepalived...
Oct 15 19:48:07 192 Keepalived[10782]:Starting Keepalived v1.2.13 (09/30,2016)
Oct 15 19:48:07 192 Keepalived[10783]:Starting Healthcheck child process, pid=10784
Oct 15 19:48:07 192 Keepalived[10783]:Starting VRRP child process, pid=10786
Oct 15 19:48:07 192 Keepalived_healthcheckers[10784]:Netlink reflector reports IP 10.1.31.155 added
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Netlink reflector reports IP 10.1.31.125added
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Netlink reflector reports IPfe80::20c:29ff:fe7b:4fc5 added
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Registering Kernel netlink reflector
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Registering Kernel netlink command channel
Oct 15 19:48:07 192 Keepalived_vrrp[10786]:Netlink reflector reports IP 10.1.31.155 added
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Netlink reflector reports IP 10.1.31.125 added
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Netlink reflector reports IP fe80::20c:29ff:fe7b:4fc5added
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Registering Kernel netlink reflector
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Registering Kernel netlink command channel
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Registering gratuitous ARP shared channel
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Truncating auth_pass to 8 characters
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Configuration is using : 18439 Bytes
Oct 15 19:48:07 192 systemd: StartedSYSV: Start and stop Keepalived.
Oct 15 19:48:07 192 keepalived: Startingkeepalived: [ 确定 ]
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Configuration is using : 64860 Bytes
Oct 15 19:48:07 192Keepalived_vrrp[10786]: Using LinkWatch kernel netlink reflector...
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: IPVS : Virtual service [10.1.31.125]:80illegal timeout.
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: IPVS : Virtual service [10.1.31.125]:80illegal timeout.
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: IPVS : Virtual service [10.1.31.125]:80illegal timeout.
Oct 15 19:48:07 192 Keepalived_healthcheckers[10784]:Using LinkWatch kernel netlink reflector...
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Activating healthchecker for service[10.1.31.161]:8081
Oct 15 19:48:07 192Keepalived_healthcheckers[10784]: Activating healthchecker for service[10.1.31.163]:8082
Oct 15 19:48:07 192Keepalived_vrrp[10786]: VRRP sockpool: [ifindex(2), proto(112), unicast(0),fd(10,11)]
Oct 15 19:48:08 192Keepalived_vrrp[10786]: VRRP_Instance(VI_1) Transition to MASTER STATE
Oct 15 19:48:09 192 Keepalived_vrrp[10786]:VRRP_Instance(VI_1) Entering MASTER STATE
Oct 15 19:48:09 192Keepalived_vrrp[10786]: VRRP_Instance(VI_1) setting protocol VIPs.
Oct 15 19:48:09 192Keepalived_vrrp[10786]: VRRP_Instance(VI_1) Sending gratuitous ARPs on ens33for 10.1.31.125
Oct 15 19:48:14 192Keepalived_vrrp[10786]: VRRP_Instance(VI_1) Sending gratuitous ARPs on ens33for 10.1.31.125
在通过Keepalived搭建高可用的LVS集群实例中,主、备Director Server都需要安装Keepalived软件,安装成功后,默认的配置文件路径为/etc/Keepalived/Keepalived.conf
一个完整的keepalived配置文件,有三个部分组成,分别是全局定义部分、vrrp实例定义部分以及虚拟服务器定义部分。
全局定义部分
Keepalived.conf:
global_defs {
notification_email {
[email protected] #邮件报警地址
}
notification_email_from [email protected]#邮件来源
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id NodeMaster #运行keepalived服务器的一个标识,发邮件时显示在邮件标题中的信息
}
Keepalived:
VRRP:解决静态路由出现的单点故障问题,保障网络不间断、稳定的运行
vrrp实例定义部分
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER表示此主机是主用服务器,BACKUP表示是备用服务器。
interface ens33 #指定HA监测网络的接口。
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地址,每行一个。
10.1.31.125
}
}
虚拟服务器定义部分
virtual_server 10.1.31.125 80 { #设置虚拟服务器,需要指定虚拟ip地址和服务端口,ip与端口之间用空格隔开。
delay_loop 6 #设置健康检查时间,单位是秒。
lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法。
lb_kind DR #设置LVS实现负载均衡的机制,可以有NAT、TUN和DR三个模式可选。
persistence_timeout 50 #会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中session共享提供了一个很好的解决方案。
有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。
需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受50秒的时间限制。
protocol TCP #指定转发协议类型,有tcp和udp两种。
real_server 10.1.31.161 80 { #配置服务节点1,需要指定real server的真实IP地址和端口,ip与端口之间用空格隔开。
weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源。
TCP_CHECK { #realserve的状态检测设置部分,单位是秒
connect_timeout 10 #10秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 10.1.31.163 80 { #配置服务节点2
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置Keepalived.conf时,需要特别注意配置文件的语法格式,因为Keepalived在启动时并不检测配置文件的正确性,即使没有配置文件,Keepalived也照样能启动起来,因而配置文件一定要正确。
在默认情况下,Keepalived在启动时会查找/etc/Keepalived/Keepalived.conf配置文件,如果你的配置文件放在了其它路径下,可以通过“Keepalived -f”参数指定你所在的配置文件路径即可。
Keepalived.conf配置完毕后,将此文件拷贝到备用Director Server对应的路径下,然后做两个简单的修改即可:
Ø 将“state MASTER”更改为“state BACKUP”
Ø 将priority 100更改为一个较小的值,这里改为“priority80”
最后,还要配置集群的Real server节点,以达到与DirectorServer相互广播通信并忽略arp的目的,脚本的内容已经在上面进行介绍,这里不做解释。
VIP之keepalived时间配置归纳:
1 VIP1秒同步一次MASTER和BACKUP
2 VIP6秒健康检查一次RIP
3 VIP的keepalived会话保持时间且是最大无响应超时时间为60s,即60秒内如果用户没执行任何操作则下次就被分发到其他的RIP节点,否则会话保持分发到固定节点。
4 VIP对RIP状态监测5秒无响应超时,重试3次,重试间隔3秒。
在主、备Director Server上分别启动Keepalived服务,可以执行如操下作:
[root@DR1~]#/etc/init.d/Keepalived start
接着在两个Real server上执行如下脚本:
[root@rs1~]#/etc/init.d/lvsrsstart
至此,Keepalived+lvs高可用的LVS集群系统已经运行起来了。
注意:启动RIP前先分别在RIP节点/etc/init.d/目录下配置lvsrs文件并启动成功:
vi /etc/init.d/lvsrs #编辑一个lvsrs脚本,并放到/etc/init.d/下
#description: start Real Server
VIP=10.1.31.125
/etc/rc.d/init.d/functions
case"$1" in
start)
echo " Start LVS of Real Server"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Director server"
echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
chmod 755 /etc/init.d/lvsrs
chmod 755 /etc/rc.d/init.d/functions
service lvsrs start
高可用性
LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。
高可靠性
LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。
适用环境
LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。
LVS对Real Server的操作系统没有任何限制,Real Server可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等
LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。
访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求,当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR。
也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,RealServer返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和DirectorServer位于同一个网段,也可以是独立的一个网络。
因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
负载调度算法
IPVS实现了如下八种负载调度算法,这里我们详细讲述最常用的四种调度算法,剩余的四种调度算法请参考其它资料。
l 轮叫调度(Round Robin)
“轮叫”调度也叫1:1调度,调度器通过“轮叫”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。
加权轮叫调度(Weighted Round Robin)
“加权轮叫”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。
同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。
IPVS实现了如下八种负载调度算法,这里我们详细讲述最常用的四种调度算法,剩余的四种调度算法请参考其它资料。
l 最少链接调度(Least Connections)
“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
l 加权最少链接调度(Weighted Least Connections)
“加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。
其它四种调度算法分别为:基于局部性的最少链接(Locality-Based Least Connections)、带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)、目标地址散列(Destination Hashing)和源地址散列(SourceHashing),对于这四种调度算法的含义,这里不再讲述,如果想深入了解这其余四种调度策略的话,可以登陆LVS中文站点zh.linuxvirtualserver.org,查阅更详细的信息。