一、Keepalived简介
Keepalived是HA cluster的一种实现方案,其以vrrp协议为实现基础,在N台具有相同功能的路由器或服务器中选出一个master或多个backup,这些路由器或服务器会共用一个对外提供服务的VIP。在此HA cluster集群中,master主机会发送组播来跟backup主机进行通信确认双方是否存活。当backup主机在指定的时间内没有收到vrrp组播报文则认为master主机宕机了,此时就会在所有的backup主机中根据vrrp协议来选举出新的master主机来保证服务的高可用性。
keepalived主要有三个模块,分别是ipvs wrapper、checkers和vrrp stack。ipvs wrapper模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。checkers负责健康检查,包括常见的各种检查方式。vrrp stack模块是来实现VRRP协议的。
二、HA Cluster的配置前提:
(1) 各节点时间必须同步; ntp, chrony
(2) 确保iptables及selinux不会成为阻碍;
(3) 各节点之间可通过主机名互相通信(对KA并非必须);
建议使用/etc/hosts文件实现;
(4) 确保各节点的用于集群服务的接口支持MULTICAST通信;
D类:224-239;
三、Keepalived的配置文件及组成
Keepalived的默认配置文件为/etc/keepalived/keepalived.conf,其主程序文件为/usr/sbin/keepalived。
Keepalived的配置文件的组成主要分为三部分,而每个部分下面又包含着各自的子段,其组成及配置如下:
1、GLOBAL CONFIGURATION:全局配置段
Global definitions:用于定义全局设置,常用的参数及示例如下:
global_defs {
notification_email { #用于指定报警邮件发往的邮箱地址
root@localhost
}
notification_email_from keepalived@localhost #用于指定报警邮件的发件人
smtp_server 127.0.0.1 #用于指定邮件服务器的地址
smtp_connect_timeout 30 #用于指定邮件服务器的连接超时时长
router_id node1 #路由器的标识
vrrp_mcast_group4 224.0.100.19 #用于设置vrrp的广播地址,在同一个HA cluster中的机器,要确保其广播地址一致才能接受到相应的vrrp报文
vrrp_strict #执行严格的vrrp协议检查,某些情况下会禁止到vip的访问。
}
Static routes/address/rules:用于配置keepalived中不会被VRRP移除的静态地址、路由或者规则,一般不会使用。
2、VRRPD CONFIGURATION:VRRP相关配置段
- VRRP instance(s):用于定义vrrp同步组,其常用的格式及参数如下:
vrrp_instance <STRING> {
state MASTER|BACKUP #用于指定此虚拟路由器在vrrp组的角色状态
interface eno16777736 #用于绑定当前虚拟路由器所使用的物理接口
virtual_router_id 14 #用于指定当前虚拟路由器在vrrp组的唯一标识id,范围为0-255
priority 100 #用于设置当前虚拟路由器在vrrp组里面的优先级,范围为1-254;
advert_int 1 #用于设置虚拟路由器发送vrrp通告的时间间隔
nopreempt|preempt #定义工作模式为非抢占或抢占模式;
preempt_delay 300 #定义在抢占式模式下,节点上线后触发新选举操作的延迟时长;
authentication { #用于设置vrrp组协商的方式及密码
auth_type PASS #定义认证类型为简单密码认证
auth_pass 571f97b2 #定义密码串,最长不超过8个字符
}
virtual_ipaddress { #用于指定需要在绑定的物理接口上添加的虚拟ip地址
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
10.1.0.91/16 dev eno16777736
}
track_interface { #配置需要监控的网络接口,一旦接口出现故障,此虚拟路由器转为FAULT状态
eth0
eth1
...
}
track_script { #用于调用在vrrp_script中定义的脚本,然后根据脚本的来进行监控调整
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-254..254>
}
notify_master <STRING>|<QUOTED-STRING> #当前节点成为主节点时触发的通知脚本;
notify_backup <STRING>|<QUOTED-STRING> #当前节点转为备节点时触发的通知脚本;
notify_fault <STRING>|<QUOTED-STRING> #当前节点转为“失败”状态时触发的通知脚本;
notify_stop <STRING>|<QUOTED-STRING> #当前节点停止时所触发的通知脚本
}
- VRRP script(s):用于定义周期性执行的脚本,可定义调用用于检查相应的服务或Ip的状态的脚本。
vrrp_script <SCRIPT_NAME> { #定义周期执行的脚本,此脚本的退出码决定了当前监控的vrrp组的运行状态
script <STRING>|<QUOTED-STRING> #定义执行脚本的存放路径
interval INT #定义调用执行脚本的周期,默认为1s。
timeout <INTEGER> # 脚本执行超时时间,脚本执行超时后,则被认为失败
rise <INTEGER> # 定义脚本检查成功多少次,才认可当前的状态为正常
fall <INTEGER> #定义检查失败多少次,才认为当前状态为失败
}
3、LVS CONFIGURATION:LVS配置段
- Virtual server(s):用于定义虚拟服务器的设置,虚拟服务器可以用Ip端口、fwmark或virtual server group来定义。
virtual_server IP port | virtual_server fwmark <int> |virtual_server group string
{
delay_loop <INT> #=服务轮询的时间间隔;
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义调度方法;
lb_kind NAT|DR|TUN #集群的类型;
persistence_timeout <INT> #持久连接时长;
protocol TCP|UDP|SCTP #服务协议;
sorry_server <IPADDR> <PORT> #备用服务器地址;
real_server <IPADDR> <PORT>{
weight <INT> #设置real server的权重
notify_up <STRING>|<QUOTED-STRING> #当出现匹配字符串时,就认为服务是up的
notify_down <STRING>|<QUOTED-STRING> #当出现匹配字符串时,就认为服务是down的
HTTP_GET|SSL_GET { #对real server作应用层检测
url {
path <URL_PATH> #定义要监控的URL;
status_code <INT> #判断上述检测机制为健康状态的响应码;
digest <STRING> #判断上述检测机制为健康状态的响应的内容的校验码;
}
nb_get_retry <INT> #重试次数;
delay_before_retry <INT> #重试之前的延迟时长;
connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求
connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址;
bind_port <PORT> #发出健康状态检测请求时使用的源端口;
connect_timeout <INTEGER> #连接请求的超时时长;
}
TCP_CHECK {
connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求
connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址;
bind_port <PORT> #发出健康状态检测请求时使用的源端口;
connect_timeout <INTEGER> #连接请求的超时时长;
}
}
}
四、keepalived的配置实例
- 高可用的ipvs集群
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.93/16 dev eno16777736
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 10.1.0.93 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 10.1.0.69 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 10.1.0.71 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
TCP_CHECK {
nb_get_retry 3
delay_before_retry 2
connect_timeout 3
}
}
}
- 双主模型:
主机配置:
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 15
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
10.1.0.92/16 dev eno16777736
}
}
备机配置:
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node2
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 16
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
vrrp_instance VI_2 {
state MASTER
interface eno16777736
virtual_router_id 17
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
10.1.0.92/16 dev eno16777736
}
}