Keepalived[保持在线] 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。
Keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
首先,每个节点有一个初始优先级,由配置文件中的priority配置项指定,MASTER节点的priority应比BAKCUP高。运行过程中keepalived根据vrrp_script的weight设定,增加或减小节点优先级。规则如下:
解绑VIP:ip addr del
绑定VIP:ip addr add
wget url安装包
tar
zxvf keepalived-1.2.7.
tar
.gz
cd
keepalived-xxx
.
/configure
--bindir=
/usr/bin
--sbindir=
/usr/sbin
--sysconfdir=
/etc
--mandir=
/usr/share
make
&&
make
install
|
keepalived只有一个配置文件/etc/keepalived/keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
主要是配置故障发生时的通知对象以及机器标识。
global_defs {
notification_email {
# notification_email 故障发生时给谁发邮件通知
...
}
notification_email_from [email protected]
# notification_email_from 通知邮件从哪个地址发出
smtp_server smtp.abc.com
# smpt_server 通知邮件的smtp地址
smtp_connect_timeout 30
# smtp_connect_timeout 连接smtp服务器的超时时间
enable_traps
# enable_traps 开启SNMP陷阱(Simple Network Management Protocol)
router_id host163
# router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
}
|
static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。
static_ipaddress {
10.210.214.163
/24
brd 10.210.214.255 dev eth0
...
}
static_routes {
10.0.0.0
/8
via 10.210.214.1 dev eth0
...
}
|
用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值。
vrrp_script chk_http_port {
script
"
interval 1
#健康检查周期
weight -10
# 优先级变化幅度,如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。
}
|
vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。
vrrp_sync_group VG_1 {
#监控多个网段的实例
group {
inside_network
# name of vrrp_instance (below)
outside_network
# One for each moveable IP.
...
}
notify_master
/path/to_master
.sh
# notify_master表示切换为主机执行的脚本
notify_backup
/path/to_backup
.sh
# notify_backup表示切换为备机师的脚本
notify_fault
"/path/fault.sh VG_1"
# notify_fault表示出错时执行的脚本
notify
/path/notify
.sh
# notify表示任何一状态切换时都会调用该脚本,且在以上三个脚本执行完成之后进行调用
smtp_alert
# smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)
}
vrrp_instance VI_1 {
state MASTER
# state MASTER或BACKUP,当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
interface eth0
# interface 节点固有IP(非VIP)的网卡,用来发VRRP包
use_vmac dont_track_primary
# use_vmac 是否使用VRRP的虚拟MAC地址,dont_track_primary 忽略VRRP网卡错误(默认未设置)
track_interface {
# track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
eth0
eth1
}
#mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP
mcast_src_ip lvs_sync_daemon_interface eth1
#lvs_sync_daemon_interface 绑定lvs syncd的网卡
garp_master_delay 10
# garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒
virtual_router_id 1
# virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播, 同一网段中virtual_router_id的值不能重复,否则会出错
priority 100
#priority用来选举master的,根据服务是否可用,以weight的幅度来调整节点的priority,从而选取priority高的为master,该项取值范围是1-255(在此范围之外会被识别成默认值100)
advert_int 1
# advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)
authentication {
# authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)
auth_type PASS
#认证方式
auth_pass 12345678
#认证密码
}
virtual_ipaddress {
# 设置vip
10.210.214.253
/24
brd 10.210.214.255 dev eth0
192.168.1.11
/24
brd 192.168.1.255 dev eth1
}
virtual_routes {
# virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息
172.16.0.0
/12
via 10.210.214.1
192.168.1.0
/24
via 192.168.1.1 dev eth1
default via 202.102.152.1
}
track_script {
chk_http_port
}
nopreempt
# nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动
preempt_delay 300
# preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项
debug
notify_master| notify_backup| notify_fault| notify| smtp_alert
}
|
virtual_server_group一般在超大型的LVS中用到,一般LVS用不到这东西
virtual_server IP Port {
delay_loop
# delay_loop 延迟轮询时间(单位秒)
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
# lb_algo 后端调试算法(load balancing algorithm)
lb_kind NAT|DR|TUN
# lb_kind LVS调度类型NAT/DR/TUN
persistence_timeout
#会话保持时间
persistence_granularity
#lvs会话保持粒度
protocol TCP
#使用的协议
ha_suspend
virtualhost
# virtualhost 用来给HTTP_GET和SSL_GET配置请求header的
alpha
omega
quorum
hysteresis
quorum_up|
quorum_down|
sorry_server
#备用机,所有realserver失效后启用
real_server{
# real_server 真正提供服务的服务器
weight 1
# 默认为1,0为失效
inhibit_on_failure
#在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up|
# real server宕掉时执行的脚本
notify_down|
# real server启动时执行的脚本
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
TCP_CHECK {
connect_timeout 3
#连接超时时间
nb_get_retry 3
#重连次数
delay_before_retry 3
#重连间隔时间
connect_port 23
#健康检查的端口的端口
bindto
}
HTTP_GET|SSL_GET {
url {
# 检查url,可以指定多个
path
# path 请求real serserver上的路径
digest
# 用genhash算出的摘要信息
status_code
# 检查的http状态码
}
connect_port
# connect_port 健康检查,如果端口通则认为服务器正常
connect_timeout
# 超时时长
nb_get_retry
# 重试次数
delay_before_retry
# 下次重试的时间延迟
}
SMTP_CHECK {
host {
connect_ip
connect_port
#默认检查25端口
bindto
}
connect_timeout 5
retry 3
delay_before_retry 2
helo_name |
#smtp helo请求命令参数,可选
}
MISC_CHECK {
misc_path |
#外部脚本路径
misc_timeout
#脚本执行超时时间
misc_dynamic
#如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,
#检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
}
}
}
|