layout: post
title: Keepalived—HA原理
date: 2018-03-13
tags: [“Cluster services”,”软件服务”]
一、keepalived简介
Keepalived是一个用C编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载均衡和高可用性设施。 Loadbalancing框架依赖于众所周知且广泛使用的提供Layer4负载平衡的Linux虚拟服务器(IPVS)内核模块。 Keepalived实现了一组检查器,根据其健康动态地自适应维护和管理负载均衡服务器池。 另一方面,通过VRRP协议实现高可用性。 VRRP是路由器故障转移的基础砖块。 此外,Keepalived还为VRRP有限状态机提供了一系列挂钩,以提供低级别和高速协议交互。 Keepalived框架可以独立使用,也可以一起使用,以提供弹性基础设施。
二、工作原理
1、Keepalived采用是模块化设计,不同模块实现不同的功能,keepalived主要有三个模块,分别是core、check和vrrp。
core**:**是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等。
check**:** 负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;可基于脚本检查对IPVS后端服务器健康状况进行检查。
vrrp**:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的以上是主要组件;下面是其他库: libipfwc:iptables/ipchains库,配置LVS会用到 libipvs*:配置LVS会用到注意,keepalived和LVS完全是两码事,各司其职相互配合。
2、软件设计
keepalived启动后会产生三个进程:1、守护进程;2、vrrp子进程;3、healthcheckor子进程
守护进程中的WatchDog会监管vrrp和healthcheckor两个子进程,healthchecker子进程实现检查各自服务器的健康程度,如果healthchecker子进程检查到MASTER上服务不可用,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。
三、配置文件
1、配置文件组件部分:
- GLOBAL CONFIGURATION
- Global definitions
- Static routes/addresses
- VRRPD CONFIGURATION
- VRRP synchronization group(s):vrrp同步组
- VRRP instance(s):即一个vrrp虚拟 路由器
- LVS CONFIGURATION
- Virtual server group(s)
- Virtual server(s):ipvs集群的vs和rs
2、 配置语法:
全局配置:
global_defs {
notification_email {
root@localhost #调用sendmail模块,节点状态发生变化发送通知
}
notification_email_from keepalived@localhost #定义邮件发送人
smtp_server 127.0.0.1 #定义smtpserver
smtp_connect_timeout 30 #定义发送超时时间
router_id node1 #节点名,在另一结点为node2
vrrp_mcast_group4 224.0.100.100 #定义组播地址
}
自定义脚本配置:
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外
vrrp_script <SCRIPT_NAME> {
script ""
interval INT
weight -INT
}
vrrp实例,配置虚拟路由器:
vrrp_instance <STRING> {
....
}
上下文参数:
state MASTER'BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP
interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口
virtual_router_id VRID:当前虚拟路由器惟一标识,范围是0-255
priority 100:当前物理节点在此虚拟路由器中的优先级;范围1-254(master要比slave高)
advert_int 1:vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH'PASS
auth_pass <PASSWORD> 仅前8位有效
}
virtual_ipaddress { #虚拟IP
#格式 <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态
实现地址转移
eth0
eth1
...
}
nopreempt:定义工作模式为非抢占模式
preempt_delay 300:抢占式模式,节点上线后触发新选举操作的延迟时长,默认模式
track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
定义通知脚本:
notify_master ':当前节点成为主节点时触发的脚本
notify_backup ':当前节点转为备节点时触发的脚本
notify_fault ':当前节点转为"失败"状态时触发的脚本
notify ':通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
IPVS实例配置(如果是做lvs的主备):
virtual_server real_server {
...
real_server {
...
}
virtual_server的上下文参数:
delay_loop <INT>:检查后端服务器的时间间隔
lb_algo rr'wrr'lc'wlc'lblc'sh'dh:定义调度方法
lb_kind NAT'DR'TUN:集群的类型
persistence_timeout <INT>:持久连接时长
protocol TCP:服务协议,仅支持TCP
sorry_server <IPADDR> <PORT>:所有RS故障时,备用服务器地址
real_server <IPADDR> <PORT>{ #真是服务器地址和端口
weight <INT> RS权重
notify_up <STRING>'<QUOTED-STRING> RS上线通知脚本
notify_down <STRING>'<QUOTED-STRING> RS下线通知脚本
HTTP_GET'SSL_GET'TCP_CHECK'SMTP_CHECK'MISC_CHECK {
...
}:定义当前主机的健康状态检测方法
HTTP_GET'SSL_GET:应用层检测
HTTP_GET'SSL_GET {
url {
path <URL_PATH>:定义要监控的URL
status_code <INT>:判断上述检测机制为健康状态的响应码
digest <STRING>:判断为健康状态的响应的内容的校验码
}
connect_timeout <INTEGER>:连接请求的超时时长
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>:发出健康状态检测请求时使用的源端口
}
TCP_CHECK { 第四层检测
connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址
bind_port <PORT>:发出健康状态检测请求时使用的源端口
connect_timeout <INTEGER>:连接请求的超时时长
}
}