Keepalived设计与实现
目录
Keepalived设计与实现
Keepalived是一个高度模块化设计的软件,源代码的结构似乎也很容易 看出这一点,里面只有 check core libipfwc libipvs-2.4 libipvs-2.6 vrrp
core keepalived的核心程序,比如全局配置的解析,进程启动等等;
vrrp Keepalived的vrrpd子进程以及相关的代码。
check keepalived的healthchecker子进程的目录,包括了所有的健康检查方 式以及对应的配置的解析,LVS的配置解析也在这个里面 libipfwc iptables(ipchains)库,主要用来配置LVS中的firewall-mark。
libipvs*也是使用LVS需要用到的。
多进程模式 =
keepalived采用了多进程的设计模式,每个进程负责不同的功能,我们 在使用LVS的机器上通常可以看到这样的进程:
Keepalived <父进程:内存管理,监控子进程 \_ Keepalived < VRRP子进程 \_ Keepalived < healthchecker子进程
有些命令行参数来控制不开启某些进程,比如不运行LVS的机器上,只开 启VRRP就可以了(-P),如果只运行healthchecker子进程,使用-C。
控制面板
所谓的控制面板就是对配置文件的编译和解析,Keepalived的配置文 件解析比较另类,并不是一次统统解析所有的配置,只在用到某模块的时 候才解析相应的配置,在每个模块里面都可以看到XXXparser.c这样的文 件,就是做这个作用的。
WatchDog
这种框架提供了对子进程(VRRP和healthchecker)的监控.
IPVS 封装
Keepalived里面所有对LVS的相关操作并不直接使用ipvsadm这样的 用户端程序,而是直接使用IPVS提供的函数进程操作,这些代码都 在 check/ipwrapper.c 中。
KeepAlived 的安装
安装Keepalived和安装其他开源软件一样,非常的简单,configure, make, make install就可以搞定,但是还是需要简单的说明一下这个操作过程:
./configure 一一prefix=/ \ 一一mandir=/usr/local/share/man \ 一一with-kernel-dir=/usr/src/kernels/2.6.9-67.EL-smp-i686/ make make install
•说明如下:
1. prefix这个指定为/吧,这样配置文件会放到目录下,方便操作。
2. mandir这个也放到Linux系统默认的man目录下,方便查看。
3. with-kernel-dir这是个重要的参数,这个参数并不表示我们要把Keepalived编进内核,而是指使用内核源码里面的头文件,也就是include目录。
◎如果要用到LVS,才需要这样的指定,否则是不需要的,而且如果要使用netlink,还需要link_watch.c这个文件
令注意
Use IPVS Framework IPVS框架一也即LVS的核心代码框架,如果不 使用LVS,可以在configure时指定参数disable-lvs,这样的话,这里看 到的就是No而不是Yes
IPVS sync daemon support IPVS同步进程,很显然,如果前面那项 是No的话,那么这里肯定也是No,当然如果前面这项是Yes-即使 用LVS,而不想使用LVS的同步进程(sync daemon),可以在configure的 时候指定 disable-lvs-syncd。
Use VRRP Framework VRRP框架,这基本上是必须的,Keepalived的 核心进程vrrpd。
Use LinkWatch所谓的Linkwatch大概意思是通过接收内核发出的关于网 卡的状态信息来判断网卡的状态,因为是内核发出的信息,这样在用 户端只需要捕捉这些信息即可,相比直接在用户端通过其他方式来 实现看起来会更省资源,Keepalived在网卡超过20块的情况下推荐使用。
简而言之,如果不使用LVS功能,那么只要看到Use VRRP Frame¬work 为Yes就可以,反之,必须有Use IPVS Framework为Yes,其他都 是 optional 的。
安装基本就这么简单,但是你可能还有疑问,到底在哪里下载Keepalived? 直接到Keepalived 的官网下吧:www. keepalived .org
KeepAlived 配置详解
Keepalived的所有配置都在一个配置文件里面设置,支持的配置项也比 较多。但分为三类: 1. 全局配置(Global Configuration)
2. VRRPD配置
3. LVS配置
很明显,全局配置就是对整个keepalived起效的配置,不管是否使 用LVS。VRRPD是keepalived的核心,LVS配置只在要使用keepalived来配 置和管理LVS时需要使用,如果仅使用keepalived来做HA2,LVS的配置完 全是不需要的。
配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围 内。#和!开头的行都是注释。
全局配置
全局配置包括两个子配置,即所谓的:全局定义(global definition)和静 态地址路由(static ipaddress/routes)
全局定义
全局定义主要设置keepalived的通知机制和标识:
global_defs
{
notification_email
{
admin@example.com
}
notification_email_from admin@example.com
smtp_server 127.0.0.1
stmp_connect_timeout 30
router_id my_hostname
} • notification_email指定keepalived在发生事件(比如切换)时,需要发 送email到的对象,可以有多个,每行一个。
• smtp_*指定发送email的smtp服务器,如果本地开启了 sendmail的话, 可以使用上面的默认配置。
• route_id运行keepalived的机器的一个标识。
静态地址和路由
所谓静态(static)就是说不会随vrrpd instance的开/关而变化的,VIP就 不是static的,会随着vrrpd而添加/删除。这个配置可以用来给服务器配置 静态的IP地址/路由,当然如果服务器的配置里面已经有这些配置,这里就 不需要设置了。
static_ipaddress
{
192.168.1.1/24 brd + dev eth0 scope global
}
static_routes
{
src $SRC_IP to $DST_IP dev $SRC_DEVICE
src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
}
每一行设置一个IP,这些配置都是Linux下ip这个命令的参数,比如上 面的 192.168.1.1/24 brd + dev ethO scope global, keepalived最终会 直接使用ip addr add 192.168.1.1/24 brd + dev ethO scope global来添加,所 以这里的配置都要符合ip命令的规则。
这就是全局配置段的全部。
VRRPD 配置
VRRPD的配置也包括2部分:VRRP同步组(synchroization group )和V RRP实 例(VRRP Instance)» VRRP Sync Groups(s)
不使用Sync Group的话,如果机器(或者说router)有两个网段,一个 内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内 网,那么当外网出现问题时,VRRPD认为自己仍然健康,那么不会发 送Master和Backup的切换,从而导致了问题。Sync group就是为了解决这 个问题,可以把两个实例都放进一个Sync Group,这样的话,group里面任 何一个实例出现问题都会发生切换。
vrrp_sync_group VG_1 {
group { inside_network #这里是实例名(比如VI_1)
outside_network
}
notify_master /path/to/to_master.sh notify_backup /path_to/to_backup.sh notify_fault "/path/fault.sh VG_1"
notify /path/to/notify.sh smtp_alert
} • notify_master指定当切换到Master时,执行的脚本,这个脚本可以传 入参数(引号引起),其他2个类推。
• notify指令有3个参数,这些参数由keepalived提供:$l(GROUP—INSTANCE),$2(group或 者 instance 的名字),$3(MASTER—BACKUP—FAULT)
• smtp_alter使用globaLdefs里面定义的邮件地址和smtp服务器在切换 后发送邮件通知。
VRRP 实例(ins tance)配置
VRRP实例就表示在上面开启了VRRP协议,这个实例说明了VRRP的 一些特性,比如主从、VRID等等,可以在每个interface上开启一个实 例。VRRP实例配置主要定义vrrp_sync_group里面的每个组的漂移IP等。
vrrp_instance inside_network {
state MASTER interface eth0 dont_track_primary
track_interface {
eth0
eth1
}
mcast_src_ip <IPADDR> garp_master_delay 10 virtual_router_id 51 priority 100 advert_int 1
authentication { auth_type PASS autp_pass 1234
}
virtual_ipaddress {
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> 192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
virtual_routes {
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> src 192.168.100.1 to
192.168.109.0/24 via 192.168.200.254 dev eth1 192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2
192.168.112.0/24 via 192.168.100.254
}
nopreempt
preemtp_delay 300
debug
}
state state指定instance的初始(Initial)状态,在两台router都启动后,马上 会发生竞选,高priority的会竞选为Master,所以这里的state并不表 示这台就一直是Master。
interface inside_network实例绑定的网卡
dont_track_primary 忽略VRRP的interface错误(默认不设置)
track_interface设置额外的监控,里面的任意一个网卡出现问题,都会进入FAULT状态
mcas t_src_ip发送多播包的地址,如果不设置,默认使用绑定的网卡的primary IP。
garp_master_delay 在切换到MASTER状态后,延迟进行gratuitous ARP请求
virtual_router_id VRID标记(0... 255)
priority 100高优先级竞选为MASTER, MASTER要高于BACKUP至少50
advert_int检查间隔,默认Is
virtual_ipaddress里面指定漂移地址(VIP),也就是切换到MASTER时, 这些IP会被添加,切换到BACKUP时,这些IP被删除(传给ipaddr 命令),所以每台服务器上可以不绑定任何虚拟地址,而都把他们 放virtuaLipaddress里面(可以多个),keepalived会自动使用ip addr进 行绑定(不需要以来ifcfg-eth0),ip add可以看到
virtual_routes和virtuaLipaddress—样,发生切换时添加/删除路由
lvs_sync_daemon_interface lvs syncd绑定的网卡
authentication这一段设置认证
auth_type认证方式,支持PASS和AH
auth_pass认证的密码
nopreempt设置为不抢占,注意这个配置只能设置在state为BACKUP的 主机上,而且这个主机的priority必须比另外一台高 preempt_delay抢占延迟,默认5分钟
debug Debug级另lj
notify_master 和sync group里面的配置一样。
LVS配置
LVS的配置也包括2部分:虚拟主机组(virtual server group)和虚拟主 机(virtual server) 0这些配置都会传递给ipvsadm作为参数。
虚拟主机组
这个配置段是可选的,目的是为了让一台RealServer上的某个service可 以属于多个Virtual Server,并且只做一次健康检查。
virtual_server_group <STRING> {
# VIP port
<IPADDR> <PORT>
<IPADDR> <PORT>
fwmark <INT> }
虚拟主机 virtuaLserver可以以下面3种方式中的任意一种配置:
1. virtuaLserver IP port
2. virtuaLserver fwmark int
3. virtuaLserver group string
如下例:
virtual_server 192.168.1.2 80 { # 设置一个virtual server: VIP:Vport
delay_loop 3 # service polling的delay时间
lb_algo rr|wrr|lc|wlc|lblc|sh|dh # LVS的调度算法
lb_kind NAT|DR|TUN # LVS集群模式
persistence_timeout 120 # 会话保持时间(秒)
persistence_granularity <NETMASK> # LVS会话保持粒度,ipvsadm中 的-M参数,默认是Oxffffffff,即根据每个客户端做会话保持。
protocol TCP #使用的协议是TCP还是UDP
ha_suspend # suspendhealthchecker's activity
virtualhost <string> # HTTP_GET做健康检查时,检查的Web服务器的虚拟主机(即Host:头)
sorry_server <IPADDR> <PORT> # 备用机,所有的real server失效后启用
#每台RealServer都需要一个下面的配置项
real_server <IPADDR> <PORT>
{
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失败时,将其weight设置为0,而不是直接从IPVS里面删除。
notify_up <STRING> | <QUOTED-STRING> # 在检测到service up后执行的脚本
notify_down <STRING> | <QUOTED-STRING> # 在检测到service down后执行的脚本
# 下面配置任意一种健康检查方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
HTTP_GET | SSL_GET
{ url { # HTTP/SSL检查的URL,这里可以指定多个URL
path /
digest <STRING> # SSL检查后的摘要信息(genhash工具算出) status_code 200 # HTTP检查的返回状态码
}
connect_port 80 # 健康检查端口
#以此地址发送请求对服务器进行健康检查
bindto <IPADD>
connect_timeout #连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 2 # 重连间隔时间(秒)
} # END OF HTTP_GET|SSL_GET
# TCP方式的健康检查
TCP_CHECK {
connect_port 80
bindto 192.168.1.1
connect_timeout 4
} # TCP_CHECK
# SMTP方式健康检查
SMTP_CHECK
#这里的配置意义和H TTP里面的类似 host {
connect_ip <IP ADDRESS>
connect_port <PORT> # 默认检查25端口
bindto <IP ADDRESS>
}
connect_timeout <INTEGER>
retry <INTEGER> delay_before_retry <INTEGER>
# "smtp HELO"请求命令的参数,可选的。
helo_name <STRING>|<QUOTED-STRING>
} #SMTP_CHECK
#MISC健康检查方式,执行一个程序
MISC_CHECK
{
#外部程序或脚本路径
misc_path <STRING>|<QUOTED-STRING>
#脚本执行的超时时间
misc_timeout <INT>
# 如果设置 了misc_dynamic的话,healthchecker程序 的退出状态码会用来动态调整服务器的权重(weigh t).
#返回0:健康检查OK,权重不被修改
#返回1:健康检查失败,权重设为0
#返回2-255:健康检查OK,权重设置为:退出状态码-2, 比如返回255,那么weight=255-2=253
misc_dynamic
}
} # Realserver
} # Virtual Server
