keepalived配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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

1
2
3
4
#!/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

1
2
3
4
#!/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   八叶一刀  阅读(644)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示