高可用之KeepAlived(一):基本概念和配置文件分析
KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
1.概述
KeepAlived主要有两个功能:
- (1).能够对RealServer进行健康状况检查,支持4层、5层和7层协议进行健康检查;
- (2).对负载均衡调度器实现高可用,防止Director单点故障。
在keepalived设计之初,它只是LVS周边的一个辅助工具,用于LVS的监控状况检查,因此它和LVS的兼容性非常好。如果某一个realserver节点宕了,keepalived会将此节点从管理列表中踢出去,当此节点恢复后又将此节点加回管理列表,这样能够就让realserver负载均衡变的智能化。但是,此时的调度器存在单点故障的可能性,因此有必要对其实现高可用。
实现LVS高可用可以使用多种软件来实现,如heartbeat,但是heartbeat本身不能实现ipvs的健康状况检查,需要搭配Ldirectord(安装完heartbeat就有了)来进行健康检查。所幸的是keepalived后来也加入了高可用的功能,而且配置起来也相当简单。相比于heartbeat+Ldirectord,keepalived的检查速度极快,故障转移也极快,布置也简单的多。所以一般来说,要管理ipvs,都会选择使用keepalived。下图列出了构建LVS高可用的几种工具:

keepalived实现故障转移的功能是通过VRRP(virtual router redundancy protocol虚拟路由器冗余协议)协议来实现的。 在keepalived正常工作的时候,主节点(master)会不断的发送心跳信息给备节点(backup),当备节点不能在一定时间内收到主节点的心跳信息时,备节点会认为主节点宕了,然后会接管主节点上的资源,并继续向外提供服务保证其可用性。当主节点恢复的时候,备节点会自动让出资源并再次自动成为备节点。
注意,使用keepalived监控、高可用LVS集群时(即常说的keepalived+lvs),并不需要在Director上使用ipvsadm等管理工具额外配置ipvs规则。因为keepalived中集合了管理ipvs规则的组件(即稍后模型图中的ipvs wrapper),可以直接在keepalived的配置文件中配置ipvs相关规则,在解析配置文件时会通过特定的组件将规则发送到内核中的ipvs模块。
2. VRRP协议
VRRP协议的出现是为了解决静态路由的单点故障,它是通过一种竞选机制来将路由任务交给某个vrrp路由器的。
在VRRP物理结构中,有多个物理的VRRP路由器,其中有一台称为"master"即主节点路由器,其他的都是"backup"备节点路由器,谁是master谁是backup,这是通过他们的优先级来定义竞选的。
在VRRP虚拟结构中,虚拟路由器是通过"MAC+VRID"的形式来标识的,如"00-00-5E-00-01-{VRID}"。在VRRP虚拟结构中,不管是master还是backup,VRID必须一致。它们对外都是相同的VIP,客户端并不需要因为master的切换而修改自己的路由配置。
VRRP结构中路由器之间的通信是通过IP多播的方式实现的(也可以配置为其它通信方式)。但是,只有master节点才会发送VRRP广告包(vrrp advertisement message)。当master节点宕掉的时候,backup中优先级最高的VRRP设备会抢占并升级为master。
3.keepalived架构模型
Keepalived服务启动的时候,将产生三个相关进程,一个父进程和两个子进程。
PID 111 Keepalived <-- Parent process fork and monitor children
112 \_ Keepalived <-- VRRP child
113 \_ Keepalived <-- Healthchecking child
父进程负责fork和监控子进程,因此父进程也称为WatchDog。两个子进程都会开启本地套接字Unix Domain Socket。当keepalived服务启动后,父进程会通过unxi domain socket每隔5秒发送一个"Hello"消息给子进程,如果父进程无法发送消息给子进程,将认为子进程出现问题,于是会重启子进程。
下图是keepalived设计架构图:

其中:
Checkers组件:负责RealServer的健康状况检查,并在LVS的拓扑中移除、添加RealServer。它支持layer4/5/7层的协议检查。该组件使用独立的子进程负责,但被父进程监控。VRRP组件:提供Director的故障转移功能从而实现Director的高可用。该组件可独立提供功能,无需LVS的支持。该组件使用独立的子进程负责,但被父进程监控。System Call组件:提供读取自定义脚本的功能。该组件在使用时,将临时产生一个子进程来执行任务。IPVS wrapper组件:负责将配置文件中IPVS相关规则发送到内核的ipvs模块。Netlink Reflector:用来设定、监控vrrp的vip地址。
4.安装keepalived
使用keepalived,完全可以yum安装。本文仅给出编译安装的方法,后文的所有配置都使用yum安装的keepalived。
官方各版本源码下载地址:http://www.keepalived.org/download.html。以下是编译安装keepalived-1.2.19版本的过程。
yum -y install openssl-devel
tar xf keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
./configure --prefix=/usr/local/keepalived-1.2.19
make && make install
其中./configure的·--with-kernel-dir·是在管理LVS时需要使用的,如果不用配合LVS,则可以不用此选项。
再做一下编译安装的规范行为。
ln -s /usr/local/keepalived-1.2.19 /usr/local/keepalived
echo "MANPATH /usr/local/keepalived/share/man" >>/etc/man.config
echo "export PATH=/usr/local/keepalived/sbin:$PATH" > /etc/profile.d/keepalived.sh
chmod +x /etc/profile.d/keepalived.sh
. /etc/profile.d/keepalived.sh
编译安装后,在安装目录下生成以下一些目录,其中keepalived程序在sbin目录下。
[root@xuexi ~]# cd /usr/local/keepalived
[root@xuexi keepalived]# ls
bin etc lib sbin share
在etc目录下,有配置文件、SysV管理脚本和大量配置文件示例。
[root@xuexi keepalived]# ls etc
keepalived rc.d sysconfig
[root@xuexi keepalived]# ls etc/keepalived/
keepalived.conf samples
[root@xuexi keepalived]# ls etc/rc.d/init.d/
keepalived
但需要注意的是,这里提供的SysV服务管理脚本是错误的,原因是脚本中的keepalived命令路径错误。所以修改该文件。
#原文
start() {
echo -n $"Starting $prog: "
daemon keepalived ${KEEPALIVED_OPTIONS}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}
#修改后
start() {
echo -n $"Starting $prog: "
daemon /usr/local/keepalived/sbin/keepalived ${KEEPALIVED_OPTIONS}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}
5.配置keepalived的日志
默认keeepalived的日志会记录到/var/log/messages中。可以配置keepalived使其记录到其它文件中。
先修改/etc/sysconfig/keepalived文件,以下是原文内容。
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D"
要配置独立的日志,将其中的"KEEPALIVED_OPTIONS"改为如下:
KEEPALIVED_OPTIONS="-D -S 0"
上面配置使用local0这个设备来记录日志,因此去修改rsyslog的配置文件/etc/rsyslog.conf,添加该设备记录日志的级别和路径。
# Keepalived log config
local0.* /var/log/keepalived.log
再重启rsyslog。
service rsyslog restart
6.keepalived配置文件详解
配置文件分为3部分:全局部分、VRRPd部分(即实现高可用部分)以及LVS虚拟服务部分(健康状况检查以及管理的集群服务)。
选项很多,具体的意义可以man keepalived.conf。默认内容如下:
! Configuration File for keepalived
global_defs { #全局部分定义邮件报警系统,可以不用定义
notification_email { #定义邮件发送目标
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #定义邮件发送人
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL #标识keepalived服务器的字符串,实现高可用时需要使用它标识节点
# 全局部分关于静态地址和静态路由的配置,可以man keepalived.conf,不过几乎不用配置这部分
}
#定义vrrp实例。一个配置文件中可以实现多实例。但不同主机上互为master<-->backup的实例名需相同
vrrp_instance VI_1 {
state MASTER #定义实例的角色状态是master还是backup
interface eth0 #定义vrrp绑定的接口,即接收或发送心跳通告的接口,即HA监测接口
virtual_router_id 51 #虚拟路由标识(VRID),同一实例该数值必须相同,即master和backup中该值相同
#同一网卡上的不同vrrp实例,该值必须不能相同。取值范围0-255
priority 100 #该vrrp实例中本机的keepalived的优先级,优先级最高的为master。该选项的优先级
#高于state选项,即若state指定的是backup,但这里设置的值最高,则仍为master。
advert_int 1 #心跳信息发送和接收时间间隔,单位为秒
authentication { #认证方式,同一实例中这个配置必须完全一样才可通过认证。只建议使用PASS认证
auth_type PASS
auth_pass 1111 #最多支持8字符,超过8字符将只取前8字符
}
virtual_ipaddress { #设置的VIP。只有master节点才会设置。master出现故障后,VIP会故障转移到backup。
#这些vip默认配置在interface指定的接口别名上,可使用dev选项来指定配置接口。
#使用ip add的方式添加。若要被ifconfig查看,在IP地址后加上label即可。
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.16 label eth0:1
192.168.200.17
192.168.200.18
192.168.200.19/24 dev eth1
}
}
#定义虚拟服务部分
virtual_server 192.168.200.100 443 { #虚拟服务地址和端口,使用空格分隔,其中地址为VIP
delay_loop 6 #健康检查时间间隔
lb_algo rr #定义负载均衡LB的算法,这里使用的是rr调度算法
lb_kind NAT #lvs的模型,有NAT/DR/TUN三种
nat_mask 255.255.255.0
persistence_timeout 50 #持久会话保持时长
protocol TCP #监控服务的协议类型,1.3.0版本之前只支持tcp,之后还支持udp
real_server 192.168.201.100 443 { #定义real_server部分,地址和端口使用空格分隔
weight 1 #LVS权重
SSL_GET { #健康状况检查的检查方式,常见的有HTTP_GET|SSL_GET|TCP_CHECK|MISC_CHECK。
url {
path / #指定ssl_get健康状况检查的路径,例如检查index.html是否正常
digest ff20ad2481f97b1754ef3e12ecd3a9cc
#健康状况需要状态码,可以是status_code、digest或digest+status_code
#digest值用keepalived的genhash命令生成,一般使用status_code即可
status_code 200
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #表示3秒无响应就超时,即此realserver不健康,需重试连接
nb_get_retry 3 #表示重试3次,3次之后都超时就是宕机,防止误伤(nb=number)
delay_before_retry 3 #重试的时间间隔
#上述配置需12秒才能判断节点故障,时间太久,应改小
}
}
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358 #定义当所有Real server都宕机的时候,由哪台服务器继续提供服务
#一般在keepalived本机给定一个web页面,提示网站正在维护的信息
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
关于配置文件中的几种时间间隔:
- advert_int N1:vrrp主备之间发送和接收心跳信息的时间间隔。和Checker组件无关。
- delay_loop N2:是健康状况检查的时间间隔。每隔几秒就检查一次。
- connect_timeout N3:连接RS的超时时间,连接不上说明不健康,需要重试连接来判定RS是否故障。
- nb_get_retry N4:一个节点不健康的判定重试次数。要重试N次,N次内都不健康说明节点故障了。
- delay_before_retry N5:判定某节点不健康后过N秒再进行重试判定。
N2和N5的区别在于:当上一次健康检查结果是正常的,将会隔N2秒再检查。如果某次检查不健康,即联系不上RS,则每隔N5秒重试一次,直到N4次后才判定该RS已经故障。因此,最终需要N3+N4*N5才能判定一个节点的故障。
虽然健康检查的失败次数是可以指定的,但一般都会设置多于1次防止误伤。另外,成功的检查只需一次即可。
keepalived支持4层、5层和7层的健康状况检查,按检查类型又可分为TCP检查(4层)、HTTP检查(5层)、SSL_HTTP检查(5层)以及自定义的MISC检查(可实现7层)。其中:
- TCP_CHECK:通过TCP连接来检查后端RS是否健康。
- HTTP_GET:通过获取指定页面来检查后端RS是否健康。是否健康是根据是否匹配digest、status_code来判断的。
- SSL_GET:和HTTP_GET一样,只不过使用的协议是HTTPS。
- MISC_CHECK:通过加载自定义健康状况检查的脚本来检查对象是否健康,要求这些脚本中健康与否的返回值为0或1。
使用MISC_CHECK检查时,方式如下:
MISC_CHECK {
misc_path /path_to_script/script.sh
(or misc_path “ /path_to_script/script.sh <arg_list>”)
}
高可用之KeepAlived(一):基本概念和配置文件分析的更多相关文章
- 高可用之KeepAlived(2):keepalived+lvs
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 17.Linux高可用之Keepalived
1.什么是高可用,为什么要设计高可用? 两台机器启动着相同的业务系统,当有一台机器宕机,另外一台服务器能快速的接管,对于访问的用户是无感知的. 减少系统不能提供服务的时间. 2.高可用使用什么工具来实 ...
- 高可用软件Keepalived
关于高可用软件Keepalived的使用及配置请参见:http://www.voidcn.com/blog/9124573/article/p-5990263.html
- centos7.4安装高可用(haproxy+keepalived实现)kubernetes1.6.0集群(开启TLS认证)
目录 目录 前言 集群详情 环境说明 安装前准备 提醒 一.创建TLS证书和秘钥 安装CFSSL 创建 CA (Certificate Authority) 创建 CA 配置文件 创建 CA 证书签名 ...
- 高可用工具keepalived学习笔记
keepalived完全遵守VRRP协议包括竞选机制,至于VRRP是什么这里不说了参考http://wenku.baidu.com/link? url=1UbkmHuQlGECgC90P7zF6u2x ...
- 高可用实现KeepAlived原理简介
一.简介 目前主流实现web网站及数据库服务高可用软件包括:keepalived.heartbeat.corosync,cman;高可用简称HA: 官方站点:https://www.keepalive ...
- keepalived高可用系列~ keepalived+proxysql
一 简介:介绍下高可用通用的方案 二 目的:一个中间件提供服务,故障后,另一个中间件提供服务 三 手段: 应用keepalived的vrrp_scripts服务 四 具体配置 global_defs ...
- keepalived高可用系列~keepalived+mysql
一 简介:建立读写分离模式 二 keepalived相关配置 vrrp_instance VI_1 { state MASTER // 可修改 interface eth0 virtual_r ...
- JAVAEE——宜立方商城03:Nginx负载均衡高可用、Keepalived+Nginx实现主备
1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...
随机推荐
- J.U.C JMM. pipeline.指令重排序,happen-before
pipeline: 现在的CPU一般采用流水线方式来执行指令.一个指令执行周期被分成:取值,译码,执行,访存,写会,更新PC若干阶段.然后,多条指令可以同时存在于流水线中,同时被执行,来提高系统的吞吐 ...
- Spring学习之路一
Spring 官网:http://projects.spring.io/spring-framework/ Spring下载地址:https://repo.spring.io/simple/libs- ...
- Java数据持久层框架 MyBatis之API学习一(简介)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- Effective Java 第三版——28. 列表优于数组
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Javascript学习--时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- mysql主从同步(4)-Slave延迟状态监控
mysql主从同步(4)-Slave延迟状态监控 转自:http://www.cnblogs.com/kevingrace/p/5685511.html 之前部署了mysql主从同步环境(Mysql ...
- 反应堆模式(reactor)
在提到高性能服务器编程的时候肯定有听过reactor模式,如果只是简单的写一个服务器和客户端建立连接的程序来熟悉一下使用socket函数编程,一般这种情况都是同步方式实现的,服务器阻塞等待客户端的连接 ...
- PHP 构造方法 __construct()(转)
PHP 析构方法 __destruct() 构造方法是类中的一个特殊方法.当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() . 在一个类中只能声 ...
- CentOS之7与6的区别
前言 centos7与6之间最大的差别就是初始化技术的不同,7采用的初始化技术是Systemd,并行的运行方式,除了这一点之外,服务启动.开机启动文件.网络命令方面等等,都说6有所不同.让我们先来了解 ...
- NFS+sersync+Keepalived高可用方案
标签(linux): nfs+keepalived 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 这套解决方法案的优点是配置比较简单.容易上手,缺点是当主NFS ...