欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

keepalived

程序员文章站 2022-12-11 08:30:18
简介 keepalived是HA Cluster(High Availability Cluster,高可用集群)的一个服务软件,用来防止单点故障。 keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议),以软件的形式实现服务器热备 ......

简介

keepalived是ha cluster(high availability cluster,高可用集群)的一个服务软件,用来防止单点故障。

keepalived采用vrrp(virtual router redundancy protocol,虚拟路由冗余协议),以软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用ip地址(vip),这个vip只存在master上并对外提供服务;如果keepalived检测到master宕机或服务故障,备用服务器(backup)会自动接管vip成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。

高可用集群主要有两种实现模式:主备模式和主主模式:
主备模式:一个或多个vip,一台主机对外提供服务,另外一台做备用机,当主服务器出现问题,备用服务器接管ip继续提供服务;
主主模式:两个或多个vip,两台主机都对外提供服务,可以是同一个服务,也可以是不同的服务,这种模式提高了硬件的投入,也对负载均衡起到一定的效果。

keepalived主要有三个模块,分别是ipvs wrapper、checkers、vrrp stack。ipvs wrapper模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析;checkers负责健康检查,包括常见的各种检查方式;vrrp stack模块是来实现vrrp协议的。

配置文件

keepalived的默认配置文件为/etc/keepalived/keepalived.conf,其主程序文件为/usr/sbin/keepalived。keepalived的配置文件的组成主要分为三部分,而每个部分下面又包含着各自的子段,其组成及配置如下:

1、global configuration:全局配置段,包括 global definitions、static routes/address/rules

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协议检查,下列情况将会阻止启动keepalived:1. 没有vip地址。2. 单播邻居。3. 在vrrp版本2中有ipv6地址。
}

static routes/address/rules:用于配置keepalived中不会被vrrp移除的静态地址、路由或者规则,基本不用。

2、vrrpd configuration:vrrp相关配置段

vrrp instance(s):定义vrrp同步组。

vrrp_instance vip_1 {    #定义vrrp实例,vip_1为自定义实例名
    state master|backup    #指定此虚拟路由器在vrrp组的角色
    interface eno16777736    #绑定物理接口
    virtual_router_id 14    #唯一标识id,用于区分vrrp实例,范围为0-255
    priority 100    #设定优先级,范围为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 {    #配置需要监控的网络接口,一旦接口出现故障该vrrp实例转为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>    #当前节点转为fault状态时触发的通知脚本
    notify_stop <string>|<quoted-string>     #当前节点停止时所触发的通知脚本
}

vrrp script(s):定义周期性执行的脚本,用于检查相应的服务或ip状态。

vrrp_script <script_name> {    #定义周期执行的脚本,vrrp instances会根据脚本的退出码来调整优先级
    script <string>|<quoted-string>    #定义执行脚本的存放路径
    interval int     #定义调用执行脚本的周期,默认为1s
    timeout <integer>    #脚本执行超时时间,脚本执行超时后,则被认为失败
    rise <integer>        #定义脚本检查成功多少次,才认可当前的状态为正常
    fall <integer>        #定义检查失败多少次,才认为当前状态为失败
}

3、lvs configuration:lvs配置段

virtual server(s):用于定义虚拟服务器的设置,虚拟服务器可以用ip port、fwmark、virtual server group(s)来定义。

virtual_server ip port | virtual_server fwmark <int>  |virtual_server group string
{
    delay_loop <int>    #健康检查的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh    #lvs调度方法
    lb_kind nat|dr|tun    #集群类型
    persistence_timeout <int>    #持久连接时长
    protocol tcp|udp|sctp    #服务协议
    sorry_server <ipaddr> <port>    #备用服务器
    real_server <ipaddr> <port>{
        weight <int>    #指定权重,默认是1
        notify_up <string>|<quoted-string>    #服务器健康检查成功时执行的脚本
        notify_down <string>|<quoted-string>    #服务器健康检查失败时执行的脚本
        http_get|ssl_get {    #应用层检测
            url {
                path <url_path>    #定义要监控的url
                status_code <int>    #健康状态的响应码
                digest <string>    #健康状态的响应的内容的校验码
            }
            nb_get_retry <int>    #重试次数
            delay_before_retry <int>    #重试之前的延迟时长
            connect_ip <ip address>    #向哪个ip地址发起健康状态检测请求,默认是real server的ip地址
            connect_port <port>    #向哪个port发起健康状态检测请求,默认是real server的端口
            bindto <ip address>    #发起连接的接口的ip地址
            bind_port <port>    #发起连接的接口的地址端口
            connect_timeout <integer>    #连接请求的超时时长
        }
        tcp_check {
            connect_ip <ip address>    #向哪个ip地址发起健康状态检测请求,默认是real server的ip地址
            connect_port <port>    #向哪个port发起健康状态检测请求,默认是real server的端口
            bindto <ip address>    #发起连接的接口的ip地址
            bind_port <port>    #发起连接的接口的地址端口
            connect_timeout <integer>    #连接请求的超时时长
        }
    }
}

 配置实例:主主模式

#一台主机配置vip_1、vip_2互为主备
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 vip_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 vip_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 } } #一台主机配置vip_1、vip_2互为主备 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 vip_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 vip_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 } }