zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    第一个android开发,记录三
    第一个android开发,记录二
    第一个android开发,记录一
    第一行代码LitePal的问题
    第二阶段冲刺个人总结5
    PHP中验证码的制作教程
    选项卡的制作代码
    HTML5布局总结篇
    PHP实现简单的计算器
    PHP中的运算符
  • 原文地址:https://www.cnblogs.com/wukejia/p/11891304.html
Copyright © 2011-2022 走看看