keepalived配置

global_defs {  
   notification_email {  
     xxxxxx@sina.com   #设置报警邮件地址,可以设置多个,每行一个。需要开启sendmail服务。  
   }  
   notification_email_from keepalived@localhost  #设置邮件的发送地址  
   smtp_server 127.0.0.1                         #设置SMTP Server地址  
   smtp_connect_timeout 30                       #设置SMTP Server的超时时间  
   router_id LVS_DEVEL          #表示运行Keepalived服务器的一个标识。发邮件时显示大邮件主题中的信息  
} 

vrrp_script chk_lvs { 
    script "/etc/keepalived/scripts/check.py" ###监控脚本
    interval 1 ###监控时间设置为1s
}

vrrp_sync_group VG_1{ #监控多个实例 一个vrrp组中有一个vrrp实例failover,那么这个组中所有的vrrp实例都会发生切换
    group {
    VI_1 #实例名
    VI_2
    }
    notify_master /etc/keepalived/scripts/lvs_master.sh     #指定当切换到master时,执行的脚本
    notify_backup /etc/keepalived/scripts/lvs_backup.sh     #指定当切换到backup时,执行的脚本
    smtp_alert   #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}

vrrp_instance VI_1 {            #vrrp 实例定义部分  
    state MASTER                #指定Keepalived的角色,MASTER表示主机是主服务器。BACKUP表示此主机是备用服务器   
    interface eth1              #指定HA监测网络的接口(服务器的网卡)  
    virtual_router_id 51        #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下MASTER与BACKUP必须是一致的  
    priority 50                 #定义优先级,数字越大,优先级越高  
    #nopreempt            #设置为不抢占,说明:这个配置只能在BACKUP主机上面设置
    #preempt_delay        #backup抢占为master的延迟,默认无延迟,说明:这个配置只能在BACKUP主机上面设置
    #unicast_src_ip @src_ip  #如果两台主机不在同一网段,则需要指定单播模式原地址
    #unicast_peer {
    #    @peer_ip                 #单播模式目的地址
    #}
    authentication {  
        auth_type PASS          #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信  
        auth_pass 1111  
    }  
    virtual_ipaddress {        #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个,只有主机在同一网段才生效  
       192.168.100.250
       192.168.100.160/24 dev eth0 label eth0:1  
    }  
    track_script {
        chk_lvs ###调用上面定义的chk_lvs
    }
    notify_master /etc/keepalived/scripts/lvs_master.sh     #指定当切换到master时,执行的脚本
    notify_backup /etc/keepalived/scripts/lvs_backup.sh     #指定当切换到backup时,执行的脚本
}  

#lvs配置,如果只是做高可用则只需要上面的即可
virtual_server 192.168.100.250 80 {   #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开  
    delay_loop 6              #设置第一次检查启动延迟  
    lb_algo rr                #设置负载调度算法,这里设置rr,即轮询算法  
    lib_kind DR               #设置LVS实现负载均衡机制,有NAT、TUN、DR三个模式可选  
    persistence_timeout 600   #会话保持单位时间,单位是秒,默认6分钟
    protocol TCP              #指定转发协议类型,有TCP和UDP两种  
    real_server 192.168.100.60 80 {  #配置服务节点1,需要指定real server的真实IP地址和端口  
        weight 1                     #配置服务节点的权值,权值数字越大,权值越高  
        TCP_CHECK {                  #relserve的状态检测设置部分,单位是秒  
           connect_timeout 10 #表示10秒无响应超时  
           nb_get_retry 3     #表示重试次数  
           dealy_before_retry 3  #表示重试间隔  
        }  
    }  
    real_server 192.168.100.80 80 {  
        weight 1  
        TCP_CHECK {  
          connect_timeout 10  #表示10秒无响应超时  
          nb_get_retry 3     #表示重试次数  
          dealy_before_retry 3  #表示重试间隔  
        }  
    }  
}      

  

在使用keepalived过程中的一些坑:

1.两台主备机器不在一个网段,导致vrrp组播消息无法发送,此时使用 unicast_src_ip 和  unicast_peer 字段,通过单播的方式发送消息, 同时由于不在一个网段,所以主备机无法使用arp协议切换vip,所以禁用keepalived的virtual_ipaddress字段并通过nginx的tcp模块做数据转发。

2.关于notify_master 和 notify_backup 脚本被调用的时机 以及 keepalived选举机制:

  2.1当keepalived启动时会首先调用notify_backup使节点状态变为 BACKUP(无论在conf文件中state是什么),然后开始对外发送vrrp数据包,此时所有节点都会对外发送以及收到其他节点发送过来的vrrp数据包,然后每个节点会判断接收到的vrrp数据包中priority的值,如果该值大于自身的priority,那么该节点会停止对外发送vrrp数据包,并且保持状态为BACKUP不变,一段时间后网络内只会有一台机器在对外持续发送vrrp数据包,此时该节点就成为主节点,主节点调用notify_master脚本将自己的状态改为MASTER,其他节点状态不变。

  2.2当主节点状态异常(track_script退出状态码非零或者机器出现故障),此时其他节点就不在会收到主节点发送vrrp数据包,此时开始新的一轮选举(参考2.1),新的主节点会调用notify_master将自己的状态改为MASTER。(这里有一个误区,我原以为当主节点track_script退出状态码非零时,调用notify_backup脚本改变状态,但实际上并不会,仅仅只是停止发送vrrp数据包)

  2.3当主节点服务恢复的时候(track_script退出状态码为零或者机器恢复),会首先调用notify_backup使节点状态变为 BACKUP(无论在conf文件中state是什么),然后开始对外发送vrrp数据包开始新的一轮选举(同2.1),在为被选举成为主节点后调用notify_master脚本将自己的状态改为MASTER。

一句话概括:当节点启动或者恢复的时候keepalived会先调用notify_backup脚本,然后开始新的一轮选举,而当节点故障时,keepalived不会执行任何notify脚本。

3.在实际运行中发现一个问题,就是我的notify_master脚本的运行时间远远长过notify_backup,此时如果BACKUP节点先启动,由于没有其他节点,它执行notify_master脚本,在执行的过程中MASTER节点启动了,该节点会执行notify_backup脚本将状态切换为BACKUP,但是notify_backup执行很快,导致notify_master在notify_backup之后才执行完,这时会出现就会出现两个主节点导致严重问题。 解决方案:1.尽量缩短脚本执行时间 2.保证MASTER节点先启动。

 

在使用keepalived给lvs做高可用是注意事项:

1.会话保持 (ipvsadm -A -t [ip:port] -s wrr -p [timeout]) 对于tcp长连接,如果客户端每次tcp请求都被lvs分配到不同的real server上,那就会出现严重问题。所以会话保持设定在同一个tcp长链接中,tcp请求都被分配到同一台real server。

2.链接信息同步  当开启会话保持时,由于LVS负载均衡器需要保存大量的连接信息,记录每个TCP连接由哪台真实服务器处理,当主负载均衡器宕机以后,备机提升为主,但备机缺省没有这些连接信息,会导致客户端的连接失效,为了解决这一问题,LVS在Linux内核实现了同步连接信息的功能.

查看连接信息   ipvsadm -Ln -c

查看同步进程信息   ipvsadm -L --daemon

开启同步  ipvsadm --start-daemon [master|backup] --mcast-interface=[网卡名称] --syncid [编号,主备需要一致]

关闭同步  ipvsadm --stop-daemon [master|backup] 

lvs_master.sh

#!/bin/bash
echo $(date "+%Y-%m-%d %H:%M:%S") "The keepalived service is master." >> /home/keepshell/gexin.txt
ipvsadm --stop-daemon backup
ipvsadm --start-daemon master --mcast-interface=eth0 --syncid 1

  

lvs_backup.sh

#!/bin/bash
echo $(date "+%Y-%m-%d %H:%M:%S") "The keepalived service is backup." >> /home/keepshell/gexin.txt
ipvsadm --stop-daemon master
ipvsadm --start-daemon backup --mcast-interface=eth0 --syncid 1

  

参考资料:https://www.keepalived.org/manpage.html

posted on 2019-11-19 18:22  八叶一刀  阅读(627)  评论(0编辑  收藏  举报

导航