• 【Keepalived】KP + NGINX 多机热备学习


    案例搭建

    环境是三台机器,两台也可以

    最后一个IP是测试的VIP

     192.168.124.21 centos6-1
     192.168.124.22 centos6-2
     192.168.124.23 centos6-3
    
     192.168.124.29 centos6-x

    每台机器都安装nginx和keepalived(简称KP)

    yum install -y nginx
    yum install -y keepalived

    在每台机器的Nginx静态页面上添加机器标识

    vim /usr/share/nginx/html/index.html

    位置:

    保存后,都把Nginx跑起来,检查页面效果:

    配置KP:

    将KP的配置文件进行备份

    cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

    然后清空源文件的所有配置(除了第一行声明),只保留一个配置

    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.124.29
        }
    }

    配置项:

        state MASTER  # 节点角色 MASTER / BACKUP
        interface eth0  # 网卡名称 默认配置 
        virtual_router_id 51 # 虚拟路由ID 节点之间一致
        priority 100  # 权重,数值越高,路由分配到此节点的几率越高
        advert_int 1 # 主备节点间同步检查间隔(秒)
    
        virtual_ipaddress { # 配置虚拟地址(VIP) 节点之间一致
            192.168.124.29
        }

    将1号机的主节点配置分发给其他机器

    scp /etc/keepalived/keepalived.conf root@centos-2:/etc/keepalived
    scp /etc/keepalived/keepalived.conf root@centos-3:/etc/keepalived

    其他机器只需要更改下面高亮的地方:

    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 {
            192.168.124.29
        }
    }

    KP配置完成后,全部启动

    service keepalived start

    检查主节点是否多出一个VIP地址

    [root@centos6-1 ~]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:b3:0b:d7 brd ff:ff:ff:ff:ff:ff
        inet 192.168.124.21/24 brd 192.168.124.255 scope global eth0
        inet 192.168.124.29/32 scope global eth0
        inet6 fe80::20c:29ff:feb3:bd7/64 scope link 
           valid_lft forever preferred_lft forever

    访问VIP地址查看页面:

    可以发现访问VIP地址分配到了1号机上面

    现在把1号机的KP下线,模拟节点故障

    service keepalived stop

    可以发现路由分配到了2号机

    把2号机的KP也下线,就分配到最后的3号机上面

     

    现在把1号机的KP重新启动起来,访问又会回到1号机上面

     

    KP的作用可以保障服务的正常运作,就是高可用。

    MASTER挂了就让BACKUP顶上去用,当MASTER好了,就重新分配回来继续运行

    这样保证主节点故障的时候还能持续提供应用服务

    从上面的案例可以得知,KP是通过节点下线来完成IP飘逸的

    下面的问题如何知道服务是故障的状态

    KP监测配置

    在KP配置文件追加新的配置块:

    # 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
    vrrp_script CHK_NGIXN {
        script "/etc/keepalived/check_nginx.sh" # 脚本位置
        interval 2  # 间隔长度(秒)
        weight 2 # 权重?
    }

    原先的实例配置块,绑定这个脚本

    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.124.29
        }
        track_script {
            CHK_NGINX
        }
    }
        

    KP附带一个定时执行任务,周期性的执行这个脚本

    检查我们想绑定的服务是否为故障状态

    这里是check_nginx脚本的内容:

    最重要的是下面我标亮的语句

    #nginx是否正常运行,如果不正常重启一次,如不能恢复则关闭keepalive,漂移vip地址
    #!/bin/bash
    #检测nginx是否启动了
    A=`ps -C nginx --no-header |wc -l`
    if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx                        
          service nginx start                #重启nginx
         # systemctl start nginx.service  #Centos7.X用此命令
          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
                  killall keepalived
          fi
    fi

    然后每一台机器都这样进行配置,用来检测Nginx是否健康

    总结一下几个关键点:

    1、做VIP热备需要绑定一个VIP 和 一个路由ID上面

    2、KP的主节点只能存在一个,其余的都是备节点

    3、使用Tracer配置块来做心跳检测,检测的脚本触发了故障状态,需要把KP下线,来实现IP飘逸

  • 相关阅读:
    EnterpriseLibrary
    如何只保证窗口只打开一次[即只运行一个进程]
    设计模式之工厂方法模式
    设计模式之代理类
    asp.net mvc应用架构的思考--Unity的应用及三层代码
    为什么我说不要用TransactionScope
    Redis入门学习
    实战分层架构
    asp.net mvc 4多级area实现技巧
    jsonp其实很简单【ajax跨域请求】
  • 原文地址:https://www.cnblogs.com/mindzone/p/15999047.html
Copyright © 2020-2023  润新知