“Keepalived是一个C语言写的路由软件,它的主要目标是向linux系统和基础组件提供简单而健壮的负载均衡和高可用设施。负载均衡框架依赖于广泛使用的LVS(IPVS)内核,它提供了layer4(传输层)负载均衡。keepalived实现了一组检测器(checkers),根据负载均衡器的健康状态,动态的、自适应的维护管理它们。另一方面,高可用性是通过VRRP协议实现,VRRP协议是路由器(router,具有路由功能的软硬件,比如LVS)failover的基石。此外,keepalived实现了一组hooks,hooks关系到一些VRRP状态机,这些状态机提供了底层的、高速的协议交互。Keepalived框架能够独立使用(LVS不是必须的),或者与其他系统一起来提供弹性的基础架构。”
简单而言,keepalived基于VRRP协议,实现了路由器故障转移,解决了负载均衡器的单点故障问题,实现了高可用性。我们需要首先简单了解一下VRRP协议的基本工作原理。
VRRP,全称“Virtual Router Redundancy Protocol”,即虚拟路由器冗余协议。路由器将会把接收到的数据包发送给目标服务器,如果目标地址不在本网段,则路由给下一个路由器;当路由器故障时,那么本网段内所有以此路由器作为默认路由的下一跳的主机将无法与外部通讯,即单点问题。VRRP就是为了解决此问题而提出的,它为具有多播组播或者广播能力的局域网设计。
VRRP将局域网中的一组路由器组成一个虚拟路由器,它包括一个Master(活跃的)和多个Backup(备份)路由器,为了便于理解,这里的路由器,我们暂且认为是部署keepalived的服务器节点。每个路由器都有自己的IP,此外还有一个VIP,此IP由Master持有,网络主机与持有VIP的路由器通讯。如果Master故障,那么backup将通过选举策略选出一个新的Master,重新持有此虚拟IP,继续向网络内的主机提供路由服务,从而避免了路由器的单点问题。
VRRP路由器组中,按照优先级选择Master,优先级为0~255,0表示VIP持有者主动放弃Master角色;优先级较高的路由器将会绑定到VIP上,此后Master将周期性的发送VRRP通知报文(广播),如果backup在连续三个通知间隔时间内收不到VRRP或者收到优先级为0的通知,则启动新一轮的VRRP选举。
为了安全,VRRP路由器组中的路由器,都需要明确指定VRID和报文加密的密码,以避免恶意修改VRRP通知信息。这些我们都可以在keepalived配置方式中得以体现。
一、Keepalived简介
Keepalived由原生的ANS/IOS C编写,此软件围绕一个中央IO复用器,以提供实时的网络设计;设计的重点就是在各个元素之间提供模块化,这就是创建一个核心libary的原因,以移除重复的代码。另一方面,主要目标就是创建一个安全、稳定的代码,以确保产品的健壮性和稳定性。
为了确保其健壮性和稳定性,守护进程(daemon)被拆分为3个不同的进程;整体设计是一个轻量级的父进程负责监控2个forked子进程。这两个子进程,一个负责VRRP框架,另一负责健康监测(healthchecking);每个子进程都有自己的调度IO复用器,这样VRRP调度的抖动(jitter)进行了优化,因为VRRP调度,比healthcheckers更加合理和重要;同时这种设计,最小化了健康监测进程对外部librairies的使用,最小化了子进程自己的操作和空主轮询(idle mainloop)以避免内部故障。父进程监控框架称之为watchdog,设计方式为:每个子进程打开一个accpet unix domain socket,父进程与这些socket建立链接,并间歇性发送“hello”数据包,如果父进程不能通过链接将hello数据包发给子进程,那么它只需简单的重启子进程即可。watchdog的这种设计有2个好处,首先所有的hello数据包均是由父进程通过IO复用器调度器(scheduler)发送给子进程,这样它可以检测到子进程调度框架的死锁(然后重启它们),此外可以通过“sysV”信号检测死的子进程。
Keepalived可以不需要LVS的支持,即可单独使用。
二、安装与配置
宿主机器:Centos 2.6.32 64位。(通过“uname -r”指令查看)
1、下载最新版keepalived,解压。
2、执行“./configure --prefix=/usr/local/keepalived”,此处最好指定prefix的路径,以便维护。如果此指令正常执行,应该输出如下信息
Keepalived configuration
------------------------
Keepalived version : 1.2.19
Compiler : gcc
Compiler flags : -g -O2 -DFALLBACK_LIBNL1
Extra Lib : -lssl -lcrypto -lcrypt -lnl
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : Yes
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
SNMP support : No
SHA1 support : No
Use Debug flags : No
其中“IPVS”和“VRRP”相关的配置必须为“YES”,如果你在此过程中出现错误,极有可能时缺少必要的lib,请你按需安装,如下为参考列表:popt-devel(解析命令行选项),openssl、openssl-devel,libssl-dev,libnl-devel,ipvsadm,还有“gcc”(编译C文件,需要首先安装);对于linux系统,通常上述lib都已经安装,不过libnl-devel可能需要手动安装。
如果上述一切正常则继续执行“make && make install”,安装完毕。那么我们将会在“/usr/local/keepalived”目录中得到keepalived安装后的配置文件和执行bin。
配置文件在“/usr/local/keepalived/etc/keepalived”目录下,同时在samples目录下还有一些可以参考的例子。可执行文件在“/usr/local/keepalived/sbin”目录下。大部分运维人员比较倾向于使用service方式启动这些比较常用的服务。接下来我们只需简单的操作几个文件可以:
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
#可以通过service启动keepalived服务
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir -p /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
##配置文件路径,可以通过在/etc/init.d/keepalived文件中修改
3、接下来我们测试一种场景:我们有一个web站点,使用nginx做负载均衡,2个nginx一主一备,它们之间使用keepalived来监控健康状况并支持自动切换。
集群部署拓扑结构:
1)nginx_1,内网IP:192.168.1.100,外网IP为61.172.xxx.10
2)nginx_2,内网IP:192.168.1.101,外网IP为61.172.xxx.11
3)虚拟IP:61.172.xxx.231,需要注意,虚拟IP也需要向运营商申请,只是这个IP暂且不需要映射到具体的物理机器罢了(无MAC映射)。不过,如果你的VIP不需要对外部访问可用,完全可以使用局域网IP作为VIP。
在上述两个节点上都部署keepalived。
我们的站点域名解析到了虚拟IP上,根据Keepalived工作原理,那么其中一个keepalived节点(俗称router)持有VIP,即为Master,另一个keepalived为backup;web流量将会转发到Master节点上的nginx上,如果此上的nginx(或者keepalived)故障失效,那么另一个节点接管(takeover)为Master并持有VIP,那么web流量也会转发到此节点,这样就达成了“nginx”故障转移的设计要求。
4、nginx安装:参见其他文档,核心配置摘要如下:
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.html;##一个静态资源服务。
}
}
5、keepalived Master配置:
global_defs {
#通知email,根据实际情况配置
notification_email {
#收件人
[email protected]
}
#发信人,可以伪装任意地址
notification_email_from [email protected]
#server地址,保持不变
smtp_server 127.0.0.1
stmp_connect_timeout 30
#节点名标识,好像并没有太大意义,建议和backup保持一致
router_id NGINX_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/keepalived/chk_nginx.sh"
#执行脚本的间隔时间
interval 3
weight 2
}
vrrp_instance VI_NGINX {
#标记为master,其实选举并不根据此值,而是根据权重。
state MASTER
#选择网卡,如果你的VIP是外网,就选择外网网卡接口,否则就选择内网。
#本次测试,eth0为外网网卡
interface eth0
#虚拟路由ID,小于255,最终用于构成虚拟MAC地址
#必须与backup一致
virtual_router_id 100
#优先级,0-254
priority 200
#通知间隔,单位:秒
advert_int 5
authentication {
auth_type PASS
#通知使用的秘钥,backup保持一致。
auth_pass 123456
}
track_script {
chk_http_port #添加脚本执行
}
virtual_ipaddress {
#虚拟IP,backup保持一致,可以有多个。
61.172.xxx.231
}
}
6、keepalived Backup配置:
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
stmp_connect_timeout 30
router_id NGINX_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/keepalived/chk_nginx.sh"
#执行脚本的间隔时间
interval 3
weight 2
}
vrrp_instance VI_NGINX {
state BACKUP
interface eth0
virtual_router_id 100
priority 200
advert_int 5
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_http_port
}
virtual_ipaddress {
61.172.xxx.231
}
}
7、配置文件中,有一个track_script,此脚本将会间歇性被调用。我们可以在此脚本中执行一些探测程序,比如检测nginx的活性:
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #nginx命令的路径
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
脚本的意思为:检测nginx进程是否已经启动,如果没有启动(或者已经失效)则立即启动,如果启动失败,则关闭keepalived;关闭的keepalived节点为Master,那么VIP会被释放,通过VRRP触发新一轮选举,最终backup接管VIP并继续服务。
nginx进程失效,keepalived会负责重启它,如果keepalived节点失效,则需要人工启动。
8、启动keepalived:
如果你执行的是默认安装,则可以到“/usr/local/keepalived/sbin”,执行“./keepalived”。如果基于service方式启动,则“service keepalived start”即可。我们可以看到,启动了三个keepalived进程。关闭keeaplived,可以直接使用“killall keepalived”。
我们还可以使用“./keepalived -h”查看其他帮助指令。
9、其他:
开发可以通过“ifconfig”指令查看服务器各个网络接口的信息,不要配置错了网络接口,否则VIP无法绑定。当然也可以通过此指令来查看VIP是否绑定到了指定的网卡上。