LVS负载均衡之高可用Keepalived
一、架构图设计
软件环境:
Redhat Linux 5.8系列32位操作系统
二、keepalived介绍及工作方式
1、 介绍keepalived之前我们首先先介绍一下VRRP(虚拟路由协议)
VRRP:虚拟路由冗余协议
能够提高网络的稳定性和可靠性,其由IETF标准RFC2338定义。
1.VRRP的工作原理
如图所示,VRRP协议将LAN网段上的两台或者多台路由可以作为一台“虚拟”路由使用,通过同一个虚拟IP地址和虚拟MAC地址而对外提供服务。如果其中一台出现故障,另一台就能接替它,继续完成路由功能。
VRRP协议组中包括一台主路由、备份路由和一台虚拟路由组成。VRRP协议中活跃路由称为主路由,其转发发送到虚拟路由的数据包。而其他VRRP组中非主路由的路由都处于备份状态。虚拟路由是向最终用户代表一台可以连续工作的路由。
VRRP根据优先级大小选择主路由,同一个VRRP组中优先级最大的路由成为主路由,状态为Master。组中其他路由都处于备份状态,并检测主路由的状态。主路由每隔一段时间会发送一个VRRP通告,通告其工作正常。如果VRRP组中的备份路由长时间没有收到主路由的通告,就将自己改为Master状态。VRRP组内可能有多台备份路由同时认为自己是主路由,这时每台主路由都会比较收到的VRRP通告中的优先级与本地的优先级的大小。如果本地优先级小于VRRP通告的优先级,则自身路由状态为备份状态,否则为Master状态不变。最终一个VRRP组中优先级最大的路由成为新的主路由。
VRRP协议共定义了三种状态:Master(主状态)、Backup(备份状态)、Initialize(初始状态)。
n初始状态:所有路由都从初始状态开始,即进程启动后进入此状态。
n备份状态:接收主路由发送的VRRP组播通告,由此判断主路由的状态;丢弃发送到虚拟路由的MAC地址和IP地址的数据包;不响应对虚拟IP地址的ARP请求。
n主状态:定期发送VRRP组播通告;响应对虚拟IP地址的ARP请求,并且发送免费ARP报文使网络内主机知道虚拟IP地址和虚拟MAC地址的对应关系;转发目的地址是虚拟MAC地址的IP数据包。
VRRP三种状态间的转换关系,如图所示。
VRRP协议提供了三种认证方式(无认证、简单字符认证和MD5认证)可以根据不同的网络环境使用不同的认证方式。
2、 keepalived理论原理
nkeepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。
nkeepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
nLayer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器
n发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。
nLayer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
nLayer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
nvip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。
三、LVS介绍及工作方式
nLVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)
四、服务配置
1、服务器ip地址规划:
VIP:172.16.39.100
ipvs1:172.16.39.1
ipvs2:172.16.39.2
realserver1:172.16.39.3
realserver2:172.16.39.4
client:172.16.39.36
2、分别配置两台realserver转发功能
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
3、分别配置两台realserver的虚拟ip
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
4、配置lvs转发器ipvs
安装ipvsadm
yum install ipvsadm -y
5、配置keepalived
安装keepalived
首先先去下载keepalived包
wgethttp://www.keepalived.org/software/keepalived-1.1.15.tar.gz
tar zxvf keepalived-1.1.15.tar.gz
cd keepalived-1.1.15
./configure && make && make install
配置keepalived相关路径
cp /home/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /home/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /home/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /home/keepalived/sbin/keepalived /sbin/
配置keepalived主配置文件
vi /etc/keepalived/keepalived.conf
global_defs { notification_email { cowherds@sina.cn } notification_email_from cowherds@sina.cn smtp_connect_timeout 3 smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_script chk_httpd { script "killall -0 httpd" interval 1 weight 2 } vrrp_script chk_mantaince_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight 2 } vrrp_instance VI_1 { interface eth0 state MASTER # BACKUP for slave routers priority 101 # 100 for BACKUP virtual_router_id 51 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.39.100/16 dev eth0 label eth0:0 } track_script { chk_haproxy chk_mantaince_down } real_server 172.16.39.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.100.4 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
配置BACKUP节点的keepalived.conf
global_defs { notification_email { cowherds@sina.cn } notification_email_from cowherds@sina.cn smtp_connect_timeout 3 smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_script chk_httpd { script "killall -0 httpd" interval 1 weight 2 } vrrp_script chk_mantaince_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight 2 } vrrp_instance VI_1 { interface eth0 state BACKUP # BACKUP for slave routers priority 100 # 100 for BACKUP virtual_router_id 51 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.39.100/16 dev eth0 label eth0:0 } track_script { chk_haproxy chk_mantaince_down } real_server 172.16.39.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.100.4 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
然后就可以起送keepalived了
启动的时候记得看日志哦