zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    OCA读书笔记(11)
    shell命令--rev
    OCA读书笔记(10)
    shell命令--cut
    OCA读书笔记(9)
    shell命令--tail
    天气的研究
    网络知识汇总(2)
    shell命令--head
    OCM读书笔记(2)
  • 原文地址:https://www.cnblogs.com/Template/p/9268431.html
Copyright © 2011-2022 走看看