Keepalived 高可用集群应用实践

keepalived简介

http://www.keepalived.org

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

类似的HA工具还有heatbeat、drbd等,heatbeat、drbd配置都较为复杂。

keepalived理论工作原理

keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

 Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。

 Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

 Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。

keepalived作用

随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要的浪费?同时实现商业硬件一样的高性能高可用的功能?有什么好的负载均衡可伸张可扩展的方案吗?答案是肯定的!有!我们利用 LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。

LVS+Keepalived 介绍

LVS

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

Keepalvied

Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。keepalived简介  keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

===================================================================================

Keepalived介绍

Keepalived是一个基于VRRP协议来实现的WEB 服务高可用方案,可以利用其来避免单点故障。一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

keepalived是VRRP的完美实现,因此在介绍keepalived之前,先介绍一下VRRP的原理。

 VRRP协议简介

在现实的网络环境中,两台需要通信的主机大多数情况下并没有直接的物理连接。对于这样的情况,它们之间路由怎样选择?主机如何选定到达目的主机的下一跳路由,这个问题通常的解决方法有二种:

·在主机上使用动态路由协议(RIP、OSPF等)

·在主机上配置静态路由

很明显,在主机上配置路态路由是非常不切实际的,因为管理、维护成本以及是否支持等诸多问题。配置静态路由就变得十分流行,但路由器(或者说默认网关default gateway)却经常成为单点。

VRRP的目的就是为了解决静态路由单点故障问题。

VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。

工作机制

在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台的物理的机器并不能同时工作,而是由一台称为MASTER的负责路由工作,其它的都是BACKUP,MASTER并非一成不变,VRRP让每个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER拥有一些特权,比如 拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。

VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址 224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由 器中,不管谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为MASTER的改变而修改自己的路由配置,对他们来 说,这种主从的切换是透明的。

在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRPAdvertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包), 多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。

由于安全性考虑,VRRP包使用了加密协议进行加密。

==========================================

vrrp简介
随着Internet的迅猛发展,基于网络的应用逐渐增多。这就对网络的可靠性提出了越来越高的要求。斥资对所有网络设备进行更新当然是一种很好的可靠性解决方案;但本着保护现有投资的角度考虑,可以采用廉价冗余的思路,在可靠性和经济性方面找到平衡点。

虚拟路由冗余协议就是一种很好的解决方案。在该协议中,对共享多存取访问介质(如以太网)上终端IP设备的默认网关(Default Gateway)进行冗余备份,从而在其中一台路由设备宕机时,备份路由设备及时接管转发工作,向用户提供透明的切换,提高了网络服务质量。
一、协议概述
在基于TCP/IP协议的网络中,为了保证不直接物理连接的设备之间的通信,必须指定路由。目前常用的指定路由的方法有两种:一种是通过路由协议(比如:内部路由协议RIP和OSPF)动态学习;另一种是静态配置。在每一个终端都运行动态路由协议是不现实的,大多客户端操作系统平台都不支持动态路由协议,即使支持也受到管理开销、收敛度、安全性等许多问题的限制。因此普遍采用对终端IP设备静态路由配置,一般是给终端设备指定一个或者多个默认网关(Default Gateway)。静态路由的方法简化了网络管理的复杂度和减轻了终端设备的通信开销,但是它仍然有一个缺点:如果作为默认网关的路由器损坏,所有使用该网关为下一跳主机的通信必然要中断。即便配置了多个默认网关,如不重新启动终端设备,也不能切换到新的网关。采用虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP)可以很好的避免静态指定网关的缺陷。
在VRRP协议中,有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定IP地址和MAC地址的逻辑路由器。处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器,一个VRRP组中有且只有一台处于主控角色的路由器,可以有一个或者多个处于备份角色的路由器。VRRP协议使用选择策略从路由器组中选出一台作为主控,负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。当由于某种原因主控路由器发生故障时,备份路由器能在几秒钟的时延后升级为主路由器。由于此切换非常迅速而且不用改变IP地址和MAC地址,故对终端使用者系统是透明的。

工作原理 

一个VRRP路由器有唯一的标识:VRID,范围为0—255。该路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。主控路由器负责对ARP请求用该MAC地址做应答。这样,无论如何切换,保证给终端设备的是唯一一致的IP和MAC地址,减少了切换对终端设备的影响。
VRRP控制报文只有一种:VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内。这保证了VRID在不同网络中可以重复使用。为了减少网络带宽消耗只有主控路由器才可以周期性的发送VRRP通告报文。备份路由器在连续三个通告间隔内收不到VRRP或收到优先级为0的通告后启动新的一轮VRRP选举。
在VRRP路由器组中,按优先级选举主控路由器,VRRP协议中优先级范围是0—255。若VRRP路由器的IP地址和虚拟路由器的接口IP地址相同,则称该虚拟路由器作VRRP组中的IP地址所有者;IP地址所有者自动具有最高优先级:255。优先级0一般用在IP地址所有者主动放弃主控者角色时使用。可配置的优先级范围为1—254。优先级的配置原则可以依据链路的速度和成本、路由器性能和可靠性以及其它管理策略设定。主控路由器的选举中,高优先级的虚拟路由器获胜,因此,如果在VRRP组中有IP地址所有者,则它总是作为主控路由的角色出现。对于相同优先级的候选路由器,按照IP地址大小顺序选举。VRRP还提供了优先级抢占策略,如果配置了该策略,高优先级的备份路由器便会剥夺当前低优先级的主控路由器而成为新的主控路由器。
为了保证VRRP协议的安全性,提供了两种安全认证措施:明文认证和IP头认证。明文认证方式要求:在加入一个VRRP路由器组时,必须同时提供相同的VRID和明文密码。适合于避免在局域网内的配置错误,但不能防止通过网络监听方式获得密码。IP头认证的方式提供了更高的安全性,能够防止报文重放和修改等攻击。
三、 应用实例
最典型的VRRP应用:RTA、RTB组成一个VRRP路由器组,假设RTB的处理能力高于RTA,则将RTB配置成IP地址所有者,H1、H2、H3的默认网关设定为RTB。则RTB成为主控路由器,负责ICMP重定向、ARP应答和IP报文的转发;一旦RTB失败,RTA立即启动切换,成为主控,从而保证了对客户透明的安全切换。
在VRRP应用中,RTA在线时RTB只是作为后备,不参与转发工作,闲置了路由器RTA和链路L1。通过合理的网络设计,可以到达备份和负载分担双重效果。让RTA、RTB同时属于互为备份的两个VRRP组:在组1中RTA为IP地址所有者;组2中RTB为IP地址所有者。将H1的默认网关设定为RTA;H2、H3的默认网关设定为RTB。这样,既分担了设备负载和网络流量,又提高了网络可靠性。
VRRP协议的工作机理与CISCO公司的HSRP(Hot Standby Routing Protocol)有许多相似之处。但二者主要的区别是在CISCO的HSRP中,需要单独配置一个IP地址作为虚拟路由器对外体现的地址,这个地址不能是组中任何一个成员的接口地址。
使用VRRP协议,不用改造目前的网络结构,最大限度保护了当前投资,只需最少的管理费用,却大大提升了网络性能,具有重大的应用价值。

==============================================================

keepalive的简单应用管理VIP的飘动

环境

两台web服务器ip分别为10.0.0.84、10.0.0.89

两台keepalived服务器(nginx负载均衡器)主ip 10.0.0.87 备ip10.0.0.88

#安装keepalived安装、启动 (两台keepalived机器上

yum -y install keepalived

rpm -qa keepalived

/etc/init.d/keepalived start

ps -ef|grep keep|grep -v grep

ls -l /etc/keepalived/keepalived.conf

head -13 /etc/keepalived/keepalived.conf

cd /etc/keepalived/

启动keepalived服务并检查

[root@lb02 ~]# /etc/init.d/keepalived start

[root@lb02 ~]# ps -ef |grep keep|grep -v grep

root 15766 1 0 09:52 ? 00:00:00 /usr/sbin/keepalived -D

root 15768 15766 0 09:52 ? 00:00:00 /usr/sbin/keepalived -D

root 15769 15766 0 09:52 ? 00:00:00 /usr/sbin/keepalived -D

[root@lb02 ~]#

#启动后会有三个keepalived进程表示安装正确

[root@lb02 ~]# /etc/init.d/keepalived stop

停止 keepalived: [确定]

[root@lb02 ~]#

(1)全局定义(Globai Defininions)

[root@lb02 ~]# head -13 /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

1111111@qq.com

}

notification_email_from 1111111@qq.com

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_lb02

}

vrrp_instance VI_1 {

[root@lb02 ~]#

(2)VRRP 实例定义区块

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.200.16

192.168.200.17

192.168.200.18

}

}

Keepalived高可用服务单实例实战

主keepalived服务器MASTER

[root@lb02 ~]# cd /etc/keepalived/

[root@lb02 keepalived]# cat keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

1111111@qq.com

}

notification_email_from 1111111@qq.com

smtp_server 192.168.200.1

smtp_connect_timeout 30


router_id LVS_lb02

}

vrrp_instance VI_1 {


state MASTER

interface eth0


virtual_router_id 55


priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.6/24 dev eth0 label eth0:1

}

}

[root@lb02 keepalived]#

设置的VIP 是10.0.0.6

配置完毕后启动keepalived服务

[root@lb02 keepalived]# /etc/init.d/keepalived start

正在启动 keepalived: [确定]

查看是否有虚拟IP

[root@lb02 keepalived]# ip add |grep 10.0.0.6

inet 10.0.0.6/24 scope global secondary eth0:1

[root@lb02 keepalived]#

以上是主keepalived服务器MASTER

备keepalived服务器 BACKUP

[root@lb01 ~]# cd /etc/keepalived/

[root@lb01 keepalived]# cat keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

1111111@qq.com

}

notification_email_from 1111111@qq.com

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_lb01

}

vrrp_instance VI_1 {


state BACKUP

interface eth0


virtual_router_id 55


priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.6/24 dev eth0 label eth0:1

}

}

[root@lb01 keepalived]#

两台keepalived都开启keepalived服务

查看虚拟IP在那台机器上

LB02

[root@lb02 keepalived]# /etc/init.d/keepalived start

正在启动 keepalived: [确定]

[root@lb02 keepalived]# ip add |grep 10.0.0.6

inet 10.0.0.6/24 scope global secondary eth0:1

[root@lb02 keepalived]#

LB01

[root@lb01 keepalived]# /etc/init.d/keepalived start

正在启动 keepalived: [确定]

[root@lb01 keepalived]# ip add |grep 10.0.0.6

[root@lb01 keepalived]#

Lb02关闭keepalived或者关机

[root@lb02 keepalived]# /etc/init.d/keepalived stop

停止 keepalived: [确定]

[root@lb02 keepalived]# ip add |grep 10.0.0.6

[root@lb02 keepalived]#

在lb01查看虚拟IP

[root@lb01 keepalived]# ip add |grep 10.0.0.6

inet 10.0.0.6/24 scope global secondary eth0:1

[root@lb01 keepalived]#

单实例主备配置文件对比

双实例双主模式配置

HOSTNAME IP 说明 代理 绑定
Lb01 10.0.0.9 www域名服务
Lb02 10.0.0.6 Bbs域名服务

配置LB02上的keepalived服务

[root@lb02 keepalived]# cat keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

1111111@qq.com

}

notification_email_from 1111111@qq.com

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_lb02

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 55

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.6/24 dev eth0 label eth0:1

}

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 70

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.9/24 dev eth0 label eth0:1

}

}

红色为新增

[root@lb02 keepalived]#

LB01 上的keepalived的配置文件;

[root@lb01 keepalived]# cat keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

1111111@qq.com

}

notification_email_from 1111111@qq.com

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_lb01

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 55

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.6/24 dev eth0 label eth0:1

}

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 70

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.9/24 dev eth0 label eth0:1

}

[root@lb01 keepalived]#

两台keepalived重新启动

[root@lb02 keepalived]# /etc/init.d/keepalived restart

停止 keepalived: [确定]

正在启动 keepalived: [确定]

[root@lb02 keepalived]#

[root@lb02 keepalived]# ip add |egrep "10.0.0.6|10.0.0.9"

inet 10.0.0.6/24 scope global secondary eth0:1

[root@lb02 keepalived]#

[root@lb01 keepalived]# /etc/init.d/keepalived restart

停止 keepalived: [确定]

正在启动 keepalived: [确定]

[root@lb01 keepalived]#

[root@lb01 keepalived]# ip add |egrep "10.0.0.6|10.0.0.9"

inet 10.0.0.9/24 scope global secondary eth0:1

[root@lb01 keepalived]#

关掉备服务器 查看结果

[root@lb01 keepalived]# /etc/init.d/keepalived stop

停止 keepalived: [确定]

[root@lb01 keepalived]# ip add |egrep "10.0.0.6|10.0.0.9"

[root@lb01 keepalived]#

在主服务器上查看、

[root@lb02 keepalived]# ip add |egrep "10.0.0.6|10.0.0.9"

inet 10.0.0.6/24 scope global secondary eth0:1

inet 10.0.0.9/24 scope global secondary eth0:1

[root@lb02 keepalived]#

关掉主 查看

[root@lb02 keepalived]# /etc/init.d/keepalived stop

停止 keepalived: [确定]

[root@lb02 keepalived]# ip add |egrep "10.0.0.6|10.0.0.9"

[root@lb02 keepalived]#

在备服务器上查看

[root@lb01 keepalived]# /etc/init.d/keepalived start

正在启动 keepalived: [确定]

[root@lb01 keepalived]# ip add |egrep "10.0.0.6|10.0.0.9"

inet 10.0.0.9/24 scope global secondary eth0:1

[root@lb01 keepalived]# ip add |egrep "10.0.0.6|10.0.0.9"

inet 10.0.0.9/24 scope global secondary eth0:1

inet 10.0.0.6/24 scope global secondary eth0:1

[root@lb01 keepalived]#

wen, zhongjie

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: