• keepalived


    实践

    我自己是先学的网络,在网络里面就有一个协议,我们经常会用到,就是VRRP(虚拟网关冗余协议),后来学了运维之后才知道,keepalived也是通过这个协议实现的高可用。

    它的应用范围比较广泛,我们这里是给负载均衡做双机热备,防止单点故障。

    环境:

    负载均衡1 192.168.80.2
    负载均衡2 192.168.80.8

    都要安装

    yum -y install keepalived
    

    配置文件

    配置文件分为三个部分:

    • 全局配置部分

    • VRRP协议配置部分

    • LVS服务管理配置部分

    //lb01全局部分
    global_defs {
       router_id lb01     #保留这一行就可以了,这个是唯一标识符,就写自己的主机名就可以了不能重复
    }
    
    //lb02全局部分
    global_defs {
       router_id lb02 
    }
    
    //lb01的vrrp部分
    vrrp_instance ZH {      #实例名字,随便取,这里是ZH,同一个组保持一致。
        state MASTER		#身份是主
        interface eth0      #虚拟IP出现在哪个网卡上
        virtual_router_id 51 #家庭身份信息,同一个组保持一致。
        priority 150        #更改优先级为150
        advert_int 1        #没用
        authentication {    #认证用的到,很少会用到
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {  #虚拟出的IP地址
            192.168.80.10/24
        }
    }
    //lb02的vrrp部分
    vrrp_instance ZH {      #实例名字,随便取,这里是ZH,同一个组保持一致。
        state BACKUP		#身份是备
        interface eth0      #虚拟IP出现在哪个网卡上
        virtual_router_id 51 #家庭身份信息,同一个组保持一致。
        priority 100        #默认优先级100
        advert_int 1        #没用
        authentication {    #认证用的到,很少会用到
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {  #虚拟出的IP地址
            192.168.80.10/24
        }
    }
    

    ip -a 查看会出来一个虚拟地址,主有,备没有,主死了,备就有了,默认开启抢占。

    异常处理

    脑裂问题

    出现原因:

    高可用备服务器收到不到从服务器发送的组播包,备服务器上会自动生成VIP地址。

    备收不到组播包的原因:

    出现这种问题出现两种原因:物理层面和软件层面

    软件层面:防火墙和selinux

    物理层面:心跳线断了就无法通信了,就都想成为主了。

    逻辑原因:安全策略原因,防火墙策略,交换机ACL策略

    如何解决?

    如何解决呢?用监控或用脚本,出现脑裂就发邮件通知。

    先解决问题,即使都想成为主,只要关一台的keepalie的服务就可以临时解决,然后后面再分析。

    脚本如何编写呢?

    只要在备上面过滤到VIP,只要过滤到就说明主出现了异常,就是这么简单,用个if判断一下即可。

    /bin/bash
    if a s eth0 | grep "192.168.80.10" > /dev/null
    if [ $? -eq 0 ]
    	echo "keepalived error! " | mail -s "keepaalied !!!" 746620446@qq.com
    fi
    

    再写入到定时任务里面,每三分钟看一次就差不多,实时监控的话就要用到while监控,不过,我觉得是范不上。

    假如主nginx挂了怎么办?

    假如主上的nginx挂了的话,主上的keepalived也没有存在的必要了,而且如果存在的话还会让备认为主还存活着,用户的请求就无法正常的过渡到备上面,这时候就要求当主上的nginx挂了之后,主要主动放弃keeplived的,通过一个小脚本就可以实现了,脚本的名字不要叫nginx哟!不要忘记放入到定时任务里面,不要忘记加执行权限!

    #!/bin/bash
    num=`ps -ef | grep -c nginx`
    if [ $sum -lt 3 ]
    then
    	systemctl stop keepalived
    fi
    

    上述脚本是我们自行编写的,比较简单粗暴,nginx出了毛病立马就停止keepalived,但如果nginx又恢复了呢?恢复了之后是无法自动抢占了,因为keepalived进程已经停止了,其实keepalived已经帮我们想好了解决方法,其实不用关闭掉keepalived,当nginx挂了之后,keepalied自动把把优先级调低一点就好了呀!怎么做呢?这个有点难以理解,不过也不是太难,我们先来准备一个脚本。

    #!/bin/bash
    num=`ps -ef | grep -c nginx`
    if [ $sum -lt 2 ]
    then
    	exit 1         #nginx挂了之后输出异常1
    else
    	exit 0         #nginx正常时输出正常0
    fi
    

    当权重的值是正数的时候,收到脚本的“正常”信号,优先级=权重+当前优先级,假设当前优先是150,权重是10,那么运行正常的时候真正的优先级是160,如果nginx挂了之后,收到脚本的“异常”信号,优先级保持150不变。

    上面的脚本理解了之后,还没完呢?我们要将脚本添加到配置文件,我们还要在主的keepalived的配置文件里面添加一些内容。

    // 将这一段放在全局配置和vrrp中间
    vrrp_script check_web {             
    	script "/server/scripts/check_web.sh"     #脚本要有执行权限
    	interval 2    #二秒检查一次
    	weight 10
    }
    
    //将这段放在VRRP的实例里面
    track_script{
    	check_web          #调用脚本,当前是主,默认优先级是150
    }
    
    

    nginx正常时脚本向外输出“0”,优先级是150+10=160,当nginx挂掉时脚本向外输入“1”,而优先级会回到150,那备的优先级用155就好了,不能默认100了。

    如果备还想保持备的优先级100不变的话,那么主这边就得把权重换成负数,收到脚本的真信号(nginx)正常,优先级保持不变(150),收到脚本的假信号(nginx异常),就得求差,用权重减优先级(10-150=90),这样也可以。

    双主模型

    我们在防火墙上经常做这种双主的,其实就是互为主备。

    一般一个干活,另一个就闲着,那能不能平时两个都干,坏一个,另一个也正常干,这就 双主模型,互相为主备。

    A负责www,B为www备份

    B负责blog,A为blog的备份

    安全问题

    只希望用户用VIP,而不希望用用负载均衡的真实地址。修改主的nginx的配置文件,只侦听VIP的80端口,而不侦听IP的80端口,但是只侦听VIP会不生效,可能会报错,如何解决呢?无法绑定VIP,需要修改内核信息。

    echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
    sysctl -p
    systemctl restart nginx
    
  • 相关阅读:
    UML用例图总结
    项目管理心得:一个项目经理的个人体会、经验总结
    UML类图符号简介
    C++中栈和堆上建立对象的区别
    Win32 API
    Python
    remove extra kernel
    Create short cut
    Set Form Position
    Get folder
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/12080729.html
Copyright © 2020-2023  润新知