Keepalived

keepalived 高可用通过VRRP通信:

1、VRRP,全称虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。

2、VRRP用IP多播的方式(默认多播地址224.0.0.18)实现高可用对之间通信

3、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的

4、工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源,备节点可以有多个,通过优先级竞选

5、VRRP使用了加密协议加密数据,但keepalived官方目前还是推荐使用明文方式配置认证类型和密码

安装:

yum -y install keepalived

配置文件位置:

/etc/keepalived/keepalived.conf

示例配置:

##主节点示例配置:

    ! Configuration File for keepalived

global_defs {
   notification_email {
       123.com             ##报警通知邮箱
   }
   smtp_server 127.0.0.1
   smtp_connect_timeout 30 
   router_id lb01          ##ID为lb01,备节点要和主节点不同
}

vrrp_instance VI_1 {        ##实例名字为VI_1,相同实例的备节点名字要相同
    state MASTER            ##状态为MASTER,备节点需要为BACKUP
    interface eth0          ##通信接口为eth0,主备需要相同
    virtual_router_id 51    ##实例ID为51
    priority 150            ##优先级150,备节点的优先级必须比此数字低
    advert_int 1            ##通信检查间隔时间一秒
    authentication {        
        auth_type PASS      ##PASS认证类型,主备相同
        auth_pass 1111      ##密码,主备相同
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1 ##虚拟IP为10.0.0.3绑定接口为eth0,别名eth0:1,主备相同
    }
}
View Code
##备节点示例配置:

    ! Configuration File for keepalived

global_defs {
   notification_email {
       123.com
   }
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
    }
}
View Code

问题:

##问题:

    在主节点使用ip addr | grep 10.0.0.3查看是否有虚拟IP

   [root@localhost keepalived]# ip addr | grep 10.0.0.3

    inet 10.0.0.3/24 scope global secondary eth0:1

    表示配置成功

    在备节点使用以上命令没有输出,如果有输出相同内容表示keepalived工作不正常,同一个IP同一时刻只能出现在一台服务器

    

    如果查看备节点有VIP信息,说明高可用裂脑了,裂脑是两台服务器争抢统一资源导致的,如果出现这种情况

    1、排查主备服务器通信是否正常、如果不正常是否有iptables防火墙阻挡

    2、主备两台服务器的keepalived.conf配置文件是否有错误,例如同一实例的virtual_router_id配置不一致

##双实例双主配置示例第一台:

##双实例主配置文件:

 ! Configuration File for keepalived

global_defs {
   notification_email {
       123.com             
   }
   smtp_server 127.0.0.1
   smtp_connect_timeout 30 
   router_id lb01          
}

vrrp_instance VI_1 {        
    state MASTER            
    interface eth0         
    virtual_router_id 51    
    priority 150        
    advert_int 1            
    authentication {        
        auth_type PASS     
        auth_pass 1111      
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1 
    }
}

vrrp_instance VI_1 {        
    state BACKUP           
    interface eth0          
    virtual_router_id 56   
    priority 100            
    advert_int 1           
    authentication {        
        auth_type PASS      
        auth_pass 1111     
    }
    virtual_ipaddress {
        10.0.0.4/24 dev eth0 label eth0:2 
    }
}
View Code

##双实例双主配置示例第二台:

 ! Configuration File for keepalived

global_defs {
   notification_email {
       123.com             
   }
   smtp_server 127.0.0.1
   smtp_connect_timeout 30 
   router_id lb02          
}

vrrp_instance VI_1 {        
    state BACKUP            
    interface eth0         
    virtual_router_id 51    
    priority 100        
    advert_int 1            
    authentication {        
        auth_type PASS     
        auth_pass 1111      
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1 
    }
}

vrrp_instance VI_1 {        
    state MASTER           
    interface eth0          
    virtual_router_id 56   
    priority 150            
    advert_int 1           
    authentication {        
        auth_type PASS      
        auth_pass 1111     
    }
    virtual_ipaddress {
        10.0.0.4/24 dev eth0 label eth0:2 
    }
}
View Code

##解决服务监听的网卡上不存在IP地址的问题:

    如果配置使用:listen 10.0.0.3:80 的方式指定IP监听服务,而本地网卡上没有10.0.0.3这个IP,nginx就会报错

    解决办法:

            在/etc/sysctl.conf中加入如下内核参数配置:

            net.ipv4.ip_nonlocal_bind=1   #表示忽略配置中监听的vip是否存在

            echo 'net.ipv4.ip_nonlocal_bind=1'>>/etc/sysctl.conf  

            sysctl -p

##解决高可用服务只针对物理服务器的问题

    实际情况中,业务停止而keepalived服务还在工作的情况,会导致vip无法找到对应的服务

    解决方法:

        1、写守护进程脚本,当nginx有问题时就停掉本地的keepalive服务,实现票已到对端继续提供服务

        脚本如下:

#!/bin/bash
while true
    do
        if [ `netstat -tlunp|grep nginx|wc -l` -ne 1 ];then
            /etc/init.d/keeplived stop
        fi
        sleep 5
    done
View Code
nohup sh chk_nginx.sh &

更改keepalived配置文件

        vrrp_script chk_nginx_proxy {
  
            /root/scripts/chk_nginx_proxy.sh
                interval 2
                 weight 2
      
                }
  vrrp_instance VI_1 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 150
      advert_int 1
     authentication {
         auth_type PASS
          auth_pass 1111
      }   
      virtual_ipaddress {
          10.0.0.3/24 dev eth0 label eth0:1
      }
  track_script
      {
          chk_nginx_proxy
      }
  }
View Code

解决多组keepalived服务器在同一个局域网的冲突问题:

    当在同一个局域网中部署了多组keepalived服务器对时,而又未使用专门的心跳线通信时,可能用户发生IP躲避地址冲突问题

    导致接管错乱,不同组的keepalived都会使用224.0.0.18作为多播地址,解决办法是在同组的keepalived服务器的配置

    文件中指定独一无二的多播地址,配置如下

    global_def { 

        router_id LVS_19 vrrp_mcast_group4 224.0.0.19

    }

##监测脑裂的脚本:

#!/bin/bash
   lb01_vip=10.0.0.12
   while true
       do
           ping -c 2 -W 3 $lb01_ip &>/dev/null
           if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
               echo "ha is split brain waring"
           else
               echo "ha is ok"
          fi
          sleep 5
      done
View Code
原文地址:https://www.cnblogs.com/Template/p/9268431.html