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	#末尾添加
posted @ 2023-11-25 21:14  suyanhj  阅读(85)  评论(0)    收藏  举报