keepalived服务
keepalived服务
基于vrrp协议,原本是服务于ipvs的软件
官网: http://keepalived.org/
官方文档:
功能:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
keepalived工作机制:
与vrrp原理一样,但是提供了后端的服务器健康检测,还能够配置ipvs的规则,A主机挂掉后,B主机能经过keepalived生成一份A的规则、接手ip地址
软件架构:
核心组件核心组件:
- checkers(健康检测)
- vrrp栈(VIP消息通告)
- WatchDog(哮天犬,监控vrrp栈和checkers)
- system call(vrrp协议转换时调用脚本的功能)
- SMTP(邮件)
- ipvs wrapper(生成ipvs)
- Netlink Reflector(网络接口)
控制组件:
- 配置文件分析器
- IO复用器
- 内存管理器
安装配置:
主配置文件: /etc/keepalived/keepalived.conf
systemd文件: /usr/lib/systemd/system/keepalived.service
配置文件示例:/usr/share/doc/keepalived/
主配置文件解读:
顶级配置有3段,每个有2个子段
GLOBAL CONFIGURATION 全局配置和静态路由
Global definitions
static routes/addr
VRRPD CONFIGURATION VRRP栈(虚拟路由)的配置
vrrp synchronization groups vrrp同步组,将多个VIP设成一个组。一般在lvs-nat模型才必须用
vrrp instances 每个vrrp实例即一个vrrp路由器
LVS CONFIGURATION 配置ipvs
virtual server groups 有多台rs集群服务时,可以定义成组
virtual server ipvs集群的vs和rs
全局段详解:
global_defs {
notification_email { #出现故障时,发给哪个邮箱
root@localhost
1137127273@qq.com
}
notification_email_from #邮件的发件地址,可伪装假的
smtp_server 127.0.0.1 #smtp邮件服务器地址
smtp_connect_timeout 30 #邮件服务器的连接超时时间
vrrp_skip_check_adv_addr #对所有通告报文都检查,会比较消耗性能,启用后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认全部检查
vrrp_strict #严格遵守VRRP协议,启用后有以下情况会导致服务启动失败和无法访问:
无VIP地址
配置了单播邻居
VRRP版本2中有ipv6地址
没有配置vrrp_iptables时,会自动开启iptables规则,默认的规则会导致VIP无法访问,建议不开此配置
注意:云环境中需要关闭此配置
strict_mode [on|off|true|false|yes|no] 意义同上,两者取一个设置即可,建议关闭
vrrp_garp_interval 0 #免费ARP消息报文发送延迟,0为立即发送
vrrp_gna_interval 0 #NA消息发送延迟(不请自来的)
vrrp_mcast_group4 arp多播地址 #组播IP范围,224.0.0.0到239.255.255.255,默认:224.0.0.18。根据需要修改,有多个集群、多网段需要更改
vrrp_iptables #与vrrp_strict同时开启时,不会添加防火墙规则,如果没有配置严格模式,就不用开启此配置
route_id int 路由器的id,可主机名、可不写
script_user user 执行脚本的用户
enable_script_security 启用安全模式,禁止以root执行脚本
}
VRRP instance(虚拟路由器实例)段详解:
vrrp_instance 唯一实例名 {
state MASTER/BACKUP #指明是主/备
interface 网卡 #配置的网卡
user_vmac #使用哪个虚拟mac地址
garp_master_delay 1 #设置当切为主状态后多久更新ARP缓存,keepalived依赖ARP报文更新IP信息,如果缺少以下参数,会导致某些场景下,主设备不发送ARP导致通信异常(在云环境中需要配置2个garp参数)
garp_master_refresh 5 #设置主节点发送 ARP 报文的时间间隔
track_interface {
网卡 #监听的网卡,故障时转移
}
mcast_src ip #多播时,使用哪个ip做源地址
unicast_src_ip ip #使用单播模式,用哪个ip做sip
unicast_peer {
ip #指定接收单播的目标ip,也就是另一个keepalived主机ip
...
}
virtual_router_id num #多个虚拟路由器时的VRID标识,取值是0~255
priority 100 #优先级,取值1~254,当非抢占模式时,节点都配置为相同的优先级可以减少抖动造成的切换次数
advert_int 1 #每隔多久通告一次心跳、优先级信息,单位s,较小时,易受网络抖动影响发生频繁倒换和暂时双主(脑裂)。当参数过大时,主机器故障后,主备倒换慢(即服务暂停时间长)
authentication { #认证方式
auth_tpye PASS|AH #认证类型PASS为简单字符认证;AH为ipsec认证,不推荐使用
auth_pass 1234 认证的密码,8字符限制,同一VRRP的密码要一样
}
virtual_ipaddress { #虚拟路由器的ip地址,不指定掩码时默认32位
<IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING>] [scope <SCOPE>]
[label <LABEL>] [peer <IPADDR>] [home]
[-nodad] [mngtmpaddr] [noprefixroute]
[autojoin] [no_track] [preferred_lft nn|forever]
1.1.1.10/8 dev ens160 ip配置在哪个网卡
1.1.1.11/8 dev ens224 label ens224:2 配置在哪个网卡哪个别名
}
track_interface { #监控网络接口,一旦出现故障,则转为fault状态并实现地址转移到指定的网卡
ens160
}
virtual_routes { #虚拟路由,给VRID设置虚拟路由
src 1.1.1.10 to 2.2.2.0/16 via 2.2.2.10 dev ens 224
1.1.1.10/8 via 2.2.2.25 dev ens160
1.1.1.0/8 dev ens160
}
nopreempt #工作在非抢占模式,默认是抢占模式
preempt_delay 300 #默认抢占时先等待300s,再动手
notify_master string|脚本 #如果变成master,用什么方式通知
notify_backup string|脚本 #变成baskup了,用什么通知
notify_fault string|脚本 #故障了,用什么通知
notify string|脚本 #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知,可传参master...等
notify_stop string|脚本 #当停止vrrp时触发
track_script { #调用由vrrp_script定义的脚本
脚本名1
...
}
}
lvs段详解
virtual_server_group name {
ip port
1.1.1.10-100 #支持地址池
fwmark 标记 #防火墙标记
}
virtual_server ip:port、防火墙标记、组 { #可基于防火墙做负载均衡集群、定义的虚拟服务器组
delay_loop num #每隔多久对RS做一次健康检测
lvs_sched rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nq #新版本选项,调度算法
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #老版本选项,调度算法
lb_kind NAT|DR|TUN #,老版本写法,集群类型,必须大写
TUN [type {ipip|gue port NUM|gre} [nocsum|csum|remcsum]] #仅tun模式支持这些
lvs_method NAT|DR|TUN #新版本写法,集群类型
persitence_timeout num #持久连接时间
protocol TCP #只支持tcp协议
virtualhost RS主机 #对哪个RS做健康检测
quorum num #RS主机的权重总数要大于此数,才算一个集群,默认为1
quorum_up 脚本 #满足时,脚本通知谁
quorum_down 脚本 #不满足时脚本通知谁
sorry_server sry主机 端口 #sorry页面的主机,也叫备用主机
real_server ip port {
weight num #设置RS权重
notify_up #RS上线时,用哪个脚本发邮件通知
notify_down ##RS下线时,用哪个脚本发邮件通知
***HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK检测方法,前两个是7层,后2个是4层,最后一个可自定义
HTTP_GET|SSL_GET {
url { #定义请求的url,可多个url定义
path url #指定url是哪个
digest 校验码 #要与给定的校验码一样才OK
status_code num #响应码是多少OK
{
retry num #RS故障时,重试次数,新版本写法
nb_get_retry int #重试次数,老版本写法
delay_before_retry num #两次重试间隔时间
connect_ip ip #向哪个ip做检测
connect_port port #向哪个port做检测
connect_timeout num #向RS请求连接的超时时间,默认5s
bindto ip #DIP每次请求RS时的固定sip
bind_port port #DIP请求RS时用哪个固定port
}
TCP_CHECK { #tcp的检测(ip、port)
connect_ip
connect_port
bindto
bind_port
connect_timeout #用tcp检测时,可以只用这个
}
MISC_CHECK { #自定义检测
misc_path 脚本 #指定自定义的脚本
misc_timeout num #检测超时时间
warmup num #热身检测,刚开始可失败次数
}
}
}
vrrp_script段详解:
利用vrrp_script指令,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能
参考配置文件:/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck
定义脚本定义脚本:
- 自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
- 通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点
注意:
- 如果是直接命令执行,第一个命令必须是全路径:/usr/bin/test
- []、&、>等特殊符号不能正常识别,建议换成test 条件,或者直接调用脚本文件
- 一个定义段只能一个脚本、命令生效
vrrp_script name { #单独配置段,定义全局脚本
script string|脚本
interval int 执行间隔,默认1s
timeout int 超时时间
weight int 权重的操作,取值:-254~254,负数为失败时把原优先级减去多少;正数时为成功时,把原优先级与此数值相加多少
fall int 脚本执行失败几次标记为失败,建议2次以上
rise int 脚本连续检测成功几次,可以把标记为失败的服务转为成功
user 用户名 执行脚本的user
init_fail 默认标记为失败状态,检测成功后再转为成功状态
}
调用脚本:
vrrp_instance web1 {
...
track_script {
name
}
}
vrrp_sync_group(同步组)段详解:
lvs nat模型需要把vip和dip都同步,此时要用同步组,但lvs nat模型很少使用
vrrp_sync_group vg_1 {
group {
web1 #定义的实例,1个实例只能同步一个ip
VT_1
}
}
vrrp_instance web1 {
ens160的ip
}
vrrp_instance VT_1 {
ens224的ip
}
日志收集
将keepalived日志发给rsyslog处理
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
systemctl restart keepalived rsyslog
模块化配置
当生产环境复杂时,/etc/keepalived/keepalived.conf文件中内容过多,不易管理,可以将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件:
include 路径/*.conf
#全局配置放在keepalived.conf中
#每个子配置段单独放在一个conf中
mkdir /etc/keepalived/conf.d
vim /etc/keepalived.conf
include /etc/keepalived/conf.d/*.conf #末尾添加

浙公网安备 33010602011771号