keepalived安装部署-主备节点

一、keepalived.conf配置文件说明

! Configuration File for keepalived

# 第一部分: 全局块
global_defs {
    # 接收邮件的邮箱列表
    notification_email {
        123@163.com
    }
    # 指定发件人
    notification_email_from eric@qq.com
    # 添加邮件服务器地址
    smtp_server smtp.exmail.qq.com
    # 设置邮件服务器连接超时时长              
    smtp_connect_timeout 30
    # 每个keepalived节点的唯一标识,建议设置为当前主机名,多个节点重名时是不受影响的,用于邮件通知;                
    router_id keepalived126
    # keepalived会以对所有通告报文检查,比较消耗性能,启用此配置后,如果收到的通告报文和上一个是同一个路由器则跳过检查,默认值为全检查
    vrrp_skip_check_adv_addr
    # 可设置ARP接口之间发送免费报文的延迟时间,可以精确到毫秒,默认是0
    vrrp_garp_interval 0
    # 设置非请求消息的发送延迟时间,默认为0
    vrrp_gna_interval 0
    # 表示严格遵守VRRP协议,启用此项后以下状况将无法启动服务——
    # a. 未设置VIP地址
    # b. 配置了单播邻居
    # c. 在VRRP的2版本中带有IPV6地址,如果开启了此项后没有设置vrrp_iptables则会自动开启iptables防火墙规则,导致VIP地址无法访问,建议不加此项
    vrrp_strict
    # 与vrrp_strict同时设置时可禁止iptables规则的生成,注释或者无vrrp_strict时可不加此项
    vrrp_iptables
    # 可指定组播IP范围,可选择224.0.0.0到239.255.255.255之间的地址,默认为224.0.0.18
    vrrp_mcast_group4 224.0.0.18
    

}

#第二部分:vrrp_instance,实例名出自实例组group所包含的那些名字。 
# 1 vrrp_script checkhaproxy这里是一个执行脚本,定时2S执行一次,可监控haproxy情况,haproxy故障keepalived权重减20(不监控可去掉)
vrrp_script checkhaproxy{
    script "/etc/keepalived/check_haproxy.sh"
    # 监控时间间隔
    interval 2
    # 负载参数
    weight -20
}

# 2 VRRP协议 实例块
# vrrp_instance模块后面的STRING为VRRP的实例名,一般设置为业务名称
vrrp_instance VI_1{ 
    # 定义当前keepalived的服务器是MASTER还是BACKUP(两台都配置成MASTER和BACKUP暂未发现区别)。
    # 两台都设置成BACKUP且没设置nopreempt,VIP漂移到priority大的节点,haproxy故障VIP漂移;
    # 两台都设置成BACKUP且设置nopreempt,哪个keepalived先启动,哪个就是主节点,haproxy故障VIP不漂移;
    # 两台都设置成BACKUP且一台设置nopreempt另一台没有设置nopreempt,haproxy故障时VIP不漂移到设置nopreempt的服务器。                            
    state BACKUP
    # 指定虚拟IP定义在那个网卡上面(本机指定为ens160 网卡)
    interface ens160
    # 虚拟路由ID,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一,范围是0-255
    virtual_router_id 111
    # 设置当前节点在此虚拟路由器中的优先级,优先级取值范围为1-254,值越大优先级越高                       
    priority 160
    # 设置 nopreempt 防止抢占资源
    nopreempt
    # 主备服务器之间的通信间隔,单位是秒,默认1秒。
    advert_int 1
    # 配置单播的源地址,即本机地址
    unicast_src_ip 192.168.220.129
    # 配置单播的目标地址,即对方节点地址,备有多台就配置多个地址         
    unicast_peer {
        192.168.192.26                
    }
    # 在切换到master状态后,延迟进行gratuitous ARP请求
    preempt_delay #抢占延时,默认5分钟

    # 服务器之间的认证方式
    authentication {
        # 认证类型,分为AH和PASS,AH为IPSC互联网安全协议认证,PASS为简单密码认证,推荐PASS认证。
        auth_type PASS
        # 认证所使用的密码,仅前8位有效,同一虚拟路由器的多个keepalived节点auth_pass值必须一致。
        auth_pass 12345678
    }
    # 定义虚拟IP块。客户通过该ip访问服务器
    virtual_ipaddress {
        192.168.180.168/24                     
    }
    #不监控nginx可去掉
    track_script {     ######执行监控nginx进程的脚本
        check_nginx
    }
# 第四部分:虚拟服务器virtual_server定义块,该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在virtual_server模块中的,是子模块。
    
virtual_server 192.168.180.168 23 {     # VIP地址,要和vrrp_instance模块中的virtual_ipaddress地址一致
    delay_loop 6                         # 健康检查时间间隔
    lb_algo rr                           # lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT                          # 负载均衡转发规则NAT|DR|RUN
    persistence_timeout 50               # 会话保持时间 
    protocol TCP                         # 使用的协议 
    persistence_granularity <NETMASK>    # lvs会话保持粒度 
  virtualhost <string>                 # 检查的web服务器的虚拟主机(host:头) 
  sorry_server<IPADDR> <port>          # 备用机,所有realserver失效后启用
  
    real_server 192.168.220.129 23 {        # RS的真实IP地址
            weight 1                     # 默认为1,0为失效
            inhibit_on_failure           # 在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除 
            notify_up <string> | <quoted-string>      # 在检测到server up后执行脚本
            notify_down <string> | <quoted-string>    # 在检测到server down后执行脚本   
        TCP_CHECK {                      # 常用
            connect_timeout 3            # 连接超时时间
            nb_get_retry 3               # 重连次数
            delay_before_retry 3         # 重连间隔时间
            connect_port 23              # 健康检查的端口的端口
            bindto <ip>   
          }
        HTTP_GET | SSL_GET{              # 不常用
            url{                         # 检查url,可以指定多个
                path /
                digest <string>          # 检查后的摘要信息
                status_code 200          # 检查的返回状态码
            }
            connect_port <port> 
            bindto <IPADD>
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 2
        }

        SMTP_CHECK{                      # 不常用
            host{
                connect_ip <IP ADDRESS>
                connect_port <port>      # 默认检查25端口
                bindto <IP ADDRESS>
            }
            connect_timeout 5
            retry 3
            delay_before_retry 2
            helo_name <string> | <quoted-string>  # smtp helo请求命令参数,可选
        }
 
        MISC_CHECK{                      # 不常用
            misc_path <string> | <quoted-string>  # 外部脚本路径
            misc_timeout                          # 脚本执行超时时间
            misc_dynamic                          # 如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
        }
    }
}


环境

[root@test1 ~]# keepalived -v
Keepalived v1.3.5 (03/19,2017)
HostNameIPDES
test1192.168.180.46master
test2192.168.180.47node-1
test3192.168.180.48node-2
test4192.168.181.18node-3

主节点

一、安装部署
[root@test1 ~]# yum install -y keepalived
二、配置文件
查看当前要指定虚IP的网卡
[root@test1 ~]# ip addr | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.180.46/24 brd 192.168.180.255 scope global noprefixroute ens160
[root@test1 ~]#
[root@test1 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {
     123@163.com
   }
   notification_email_from 123@163.com
   smtp_server smtp.exmail.qq.com
   smtp_connect_timeout 30
   router_id app46
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_nginx {                  # 定义监控nginx的脚本
    script "/etc/keepalived/check_nginx.sh"
    interval 1                             # 监控时间间隔
    weight -2                              # 负载参数
}
vrrp_instance VI_1 {
    ## 主机配置,从机为BACKUP 这里状态都指定为backup
    state BACKUP
    ## 网卡名称(需要修改)
    interface ens160
    virtual_router_id 199
    ## 权重值,值越大,优先级越高,backup设置比master小,这样就能在master宕机后讲backup变为master,而master回复后就可以恢复.
    priority 100                          ##另一个节点,数值改为90(需要修改)
    #nopreempt                            ###设置 nopreempt 防止抢占资源
    advert_int 1                          ######服务器之间的存活检查时间
    authentication {
        auth_type PASS
        auth_pass 30099
    }
    virtual_ipaddress {
        ## 同一网段虚拟IP(需要修改)
        192.168.180.60/24
    }
    track_script {     ######执行监控nginx进程的脚本
        check_nginx
    }
}

[root@test1 keepalived]# cat check_nginx.sh
#/bin/bash
counter=$(netstat -lntp|grep 30099|wc -l)
if [ "${counter}" = "0" ]; then
    exit 1
else
    exit 0
fi
三、启动
[root@test1 ~]# systemctl start keepalived.service && systemctl enable keepalived.service && systemctl status keepalived.service
四、查看是否创建成功
[root@test1 ~]# ip add | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.180.46/24 brd 192.168.180.255 scope global noprefixroute ens160
    # 发现多了一个虚拟IP就是成功了
    inet 192.168.180.60/24 scope global secondary ens160
[root@test1 ~]#

[备节点]

一、安装部署
[root@test2 ~]# yum install -y keepalived
二、配置文件
查看当前要指定虚IP的网卡
[root@test2 ~]# ip add | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.180.47/24 brd 192.168.180.255 scope global noprefixroute ens160
[root@test2 ~]#
[root@test2 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {
     123@163.com
   }
   notification_email_from 123@163.com
   smtp_server smtp.exmail.qq.com
   smtp_connect_timeout 30
   router_id app47
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_nginx {                                       ##定义监控nginx的脚本
    script "/etc/keepalived/check_nginx.sh"
    interval 1                            ######监控时间间隔
    weight -2                              ######负载参数
}
vrrp_instance VI_1 {
    ## 主机配置,从机为BACKUP 这里状态都指定为backup
    state BACKUP
    ## 网卡名称(需要修改)
    interface ens160
    virtual_router_id 199
    ## 权重值,值越大,优先级越高,backup设置比master小,这样就能在master宕机后讲backup变为master,而master回复后就可以恢复.
    priority 90               
    #nopreempt          ###设置 nopreempt 防止抢占资源
    advert_int 1       ######服务器之间的存活检查时间
    authentication {
        auth_type PASS
        auth_pass 30099
    }
    virtual_ipaddress {
        ## 同一网段虚拟IP(需要修改)
        192.168.180.60/24
    }
    track_script {     ######执行监控nginx进程的脚本
        check_nginx
    }
}

[root@test1 keepalived]# cat check_nginx.sh
#/bin/bash
counter=$(netstat -lntp|grep 30099|wc -l)
if [ "${counter}" = "0" ]; then
    exit 1
else
    exit 0
fi
三、启动
[root@test2 ~]# systemctl start keepalived.service && systemctl enable keepalived.service && systemctl status keepalived.service
四、查看是否创建成功

备节点与主节点不同,需要停掉主节点,备节点才可以查到虚拟IP;
由此可见KeepAlived 高可用是通过动态切换生成虚拟IP地址来达到的高可用!

[root@test2 ~]# ip add | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.180.47/24 brd 192.168.180.255 scope global noprefixroute ens160
    # 发现多了一个虚拟IP就是成功了
    inet 192.168.180.168/24 scope global secondary ens160
[root@test2 ~]#



常见问题

1 VRID 问题
Dec  4 09:18:45 test1 Keepalived_vrrp[27680]: VRRP_Instance(ERIC_VI_1) ignoring received advertisment...
Dec  4 09:18:46 test1 Keepalived_vrrp[27680]: (ERIC_VI_1): ip address associated with VRID 51 not present in MASTER advert : 192.168.180.47
Dec  4 09:18:46 test1 Keepalived_vrrp[27680]: bogus VRRP packet received on ens160 !!!
# 原因
# virtual_router_id 51 有冲突
# 解决办法
# 修改配置文件中 virtual_router_id 的值 51 改为 56 或其它值
2 虚拟IP 无法ping通

keepalived.conf 配置中默认 vrrp_strict 打开了,需要把它注释掉。重启keepalived即可ping通。

vrrp_script详解

1、vrrp_script能做什么

keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务进程,比如说nginx,keepalived+nginx实现nginx的负载均衡高可用,如果nginx异常,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换。这个时候,我们可以通过编写脚本对业务进程进行检测监控。

例如:编写个简单脚本查看haproxy进程是否存活

#!/bin/bash
count = `ps aux | grep -v grep | grep haproxy | wc -l`
if [ $count > 0 ]; then
    exit 0
else
    exit 1
fi

在keepalived的配置文件中增加相应配置项

vrrp_script checkhaproxy
{
    script "/home/check.sh"
    interval 3
    weight -20
}

vrrp_instance test
{
    ...
    
    track_script
    {
        checkhaproxy
    }
    
    ...
}
2、优先级更新策略

keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加

如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少

其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

这里需要注意的是:

1) 优先级不会不断的提高或者降低

2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight

3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况

这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

3、vrrp_script中节点权重改变算法

在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。

3.1、不设置weight

在vrrp_script模块中,如果不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置“weight”值来实现。

3.2、设置weight

vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败;

weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加;

主失败:

主 priority < 从 priority + weight 时会切换。

主成功:

主 priority + weight > 从 priority + weight 时,主依然为主

weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight)

主失败:

主 priority – abs(weight) < 从priority 时会切换主从

主成功:

主 priority > 从priority 主依然为主

4、配置不抢占nopreempt带来的问题

例如:A,B两台keepalived

A的配置大概为:

vrrp_script checkhaproxy
{
    script "/etc/check.sh"
    interval 3
    weight -20

}

vrrp_instance test
{
    ....
    
    state backup
    priority 80
    nopreempt

    track_script
    {
        checkhaproxy
    }

    ....
}

B的配置大概为:

vrrp_script checkhaproxy
{
    script "/etc/check.sh"
    interval 3
    weight -20
}

vrrp_instance test
{
    ....
    
    state backup
    priority 70

    track_script
    {
        checkhaproxy
    }

    ....
}

A,B同时启动后,由于A的优先级较高,因此通过选举会成为master。当A上的业务进程出现问题时,优先级会降低到60。此时B收到优先级比自己低的vrrp广播包时,将切换为master状态。那么当B上的业务出现问题时,优先级降低到50,尽管A的优先级比B的要高,但是由于设置了nopreempt,A不会再抢占成为master状态。

所以,可以在检测脚本中增加杀掉keepalived进程(或者停用keepalived服务)的方式,做到业务进程出现问题时完成主备切换。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值