keepalived是集群管理中保证集群高可用的一个服务软件,功能类似于heartbeat,防止单点故障。keepalived是以VRRP协议为实现基础的,VRRP即虚拟路由冗余协议。该协议将N台提供相同功能的路由器组成一个路由器组,这个组里面有个master和多个backup,master上绑定一个对外提供服务的VIP。当backup收不到vrrp包时,就会认为当前master宕机了,这时将根据定义的优先级从backup中选举一个新的master。
keepalived主要有三个模块:core、check和vrrp。core模块为keepalived的核心,负责进程的启动、维护以及全局配置文件的加载和解析;check负责健康检查,包括常见的各种检查方式。vrrp模块是实现VRRP协议的
keepalived参数配置
global_defs区域
主要是配置故障发生时的通知对象以及机器标识
1
2
3
4
5
6
7
8
9
10
11
12
|
global_defs {
notification_email {
a@abc.com
b@abc.com
...
}
notification_email_from alert@abc.com
smtp_server smtp.abc.com
smtp_connect_timeout 30
enable_traps
router_id host163
}
|
- notification_email:故障发生时发送邮件通知
- notification_email_from:通知邮件发出的账号
- smtp_server:邮箱服务器
- smtp_connect_timeout:连接smtp服务器的超时时间
- enable_traps:开启SNMP陷阱
- Router_id:标识本节点的字条串,通常可以设置为主机名
static_ipaddress和static_routes区域
Static_ipaddress和static_routes区域配置的是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置
1
2
3
4
5
6
7
8
|
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
...
}
|
以上标识在启动关闭keepalived时在本机执行如下命令,因此强烈建议配置时忽略该区域
1
2
3
4
|
# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
# /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0
|
vrrp_script区域
该区域用于健康检查,当检查失败时会将vrrp_instance的priority减少相应的值
1
2
3
4
5
|
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80"
interval 1
weight -10
}
|
- script:执行的检查脚本
- interval:执行的时间间隔
- weight:检查失败时priority值的变化
vrrp_instance和vrrp_sync_group区域
vrrp_instance用来定义对外提供服务的VIP区域及其相关属性;vrrp_sync_group用来定义vrrp_instance组,使得组内成员动作一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
vrrp_sync_group VG_1 {
group {
http
mysql
}
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
}
vrrp_instance http {
state MASTER
interface eth0
use_vamc
dont_track_primary
track_interface {
eth0
eth1
}
mcast_src_ip <IPADDR>
garp_master_delay 10
lvs_sync_daemon_interface eth1
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
autp_pass 1234
}
virtual_ipaddress {
10.240.204.169
}
virtual_routes {
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
}
}
|
- notify_master/backup/fault:分别表示切换为主/备/出错时所执行的脚本;notify表示任何一种状态切换都会调用指定脚本
- smtp_alert:是否开启邮件通知
- State:可以选择master或backup,但是否为master是由prority的值决定的
- interface:节点网卡,用于发VRRP包
- use_vmac:是否使用VRRP的虚拟MAC地址
- dont_track_primary:忽略VRRP网卡错误
- track_interface:监控网卡
- mcast_src_ip:修改vrrp组播报的源地址,默认为master的ip
- garp_master_delay:当切为主状态多久更新ARP缓存,默认5秒
- lvs_sync_daemon_insterface:绑定lvs sync的网卡
- Virtual_router_id:取值在0-225之间,用于区分多个instance的VRRP组播。检查网络中存在的vrid:tcpdump -nn -i any net 224.0.0.0/8
- prority:设置优先级,取值在1-255,值最高的将成为master
- advert_int:发VRRP包的时间间隔,即健康检查的时间间隔
- authentication:认证区域,有PASS和HA
- virtual_ipaddress:VIP配置
- virtual_routes:虚拟路由,当IP漂过来之后需要添加的路由信息
- nopreempt:允许优先级较低的成为master
virtual_server_group和virtual_server区域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
virtual_server IP Port {
delay_loop <INT>
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT|DR|TUN
persistence_timeout <INT>
persistence_granularity <NETMASK>
protocol TCP
ha_suspend
virtualhost <STRING>
alpha
omega
quorum <INT>
hysteresis <INT>
quorum_up <STRING>|<QUOTED-STRING>
quorum_down <STRING>|<QUOTED-STRING>
sorry_server <IPADDR> <PORT>
real_server <IPADDR> <PORT> {
weight <INT>
inhibit_on_failure
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
HTTP_GET|SSL_GET {
url {
path <STRING>
# Digest computed with genhash
digest <STRING>
status_code <INT>
}
connect_port <PORT>
connect_timeout <INT>
nb_get_retry <INT>
delay_before_retry <INT>
}
}
}
|
- delay_loop:延迟轮询时间,单位为秒
- lb_algo:后端调试算法
- lb_kind:调度类型NAT/DR/TUN
- virualhost:用来HTTP_GET和SSL_GET配置请求header
- Sorry_server:当所有real server宕掉时,sorry server顶替
- Real_server:提供服务的节点
- weight:权重
- notify_up/down:当real server宕机或启动时执行的脚本
- path:请求real server的路径
- digest/status_code:分别表示用genhash算出的结果和http状态码
- connect_port:健康检查,如果端口通则表示服务器正常
- connect_timeout,nb_get_delay,delay_before_retry分别表示超时时长、重试次数、下次尝试的时间延迟
keepalived安装
安装依赖包
1
|
$ yum install libnl libnl-devel libnfnetlink-devel keepalived -y
|
编译安装keepalived
1
2
3
|
$ yum install libnl libnl-devel libnfnetlink-devel -y
$ ./configure --prefix=usr/local/app/keepalived
$ make && make install -j 4
|