zoukankan      html  css  js  c++  java
  • nginx:负载均衡实战(四)nginx+keepalived配置双机热备

    1.下载安装

    下载keepalived地址:http://www.keepalived.org/download.html
    解压安装:
    tar -zxvf keepalived-1.2.18.tar.gz

    安装openssl依赖 yum install -y openssl openssl-devel
    cd keepalived
    -1.2.18/
    ./configure --prefix=/$URL/keepalived(这个是你解压的keepalived的目录下的keepalived,这个命令目前找不到博客说是用来干哈的,等找到了这里更新一下。。)

    安装 make
    && make install

    2.安装为系统服务

    创建文件夹,将keepalived配置文件进行复制:($URL是你装keepalived的地方 )
    mkdir /etc/keepalived
    cp /$URL/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    然后复制keepalived脚本文件:
    cp /$URL/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ 
    cp
    /$URL/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    #使用whereis keepalived可以查看keepalived的相对位置
    ln
    -s /$URL/sbin/keepalived /usr/sbin/ #这句可以不用执行,只执行下面这一句就可以了
    ln -s /$URL/local/keepalived/sbin/keepalived /sbin/

    可见安装为系统服务的时候需要在/user/sbin下面有这样的一个软连接。

    这个时候可以启动一下service keepalived start试试看成功了么

    3.修改配置文件

    vi /etc/keepalived/keepalived.conf

    主:

    ! Configuration File for keepalived
    
    global_defs {
       router_id bhz005 ##标识节点的字符串,通常为hostname
    }
    ## keepalived 会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。
    如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。
    如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。
    vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh" ##执行脚本位置
        interval 2 ##检测时间间隔
        weight -20 ## 如果条件成立则权重减20(-20)
    }
    ## 定义虚拟路由 VI_1为自定义标识。
    vrrp_instance VI_1 {
    state MASTER   ## 主节点为MASTER,备份节点为BACKUP
        ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth6)
    interface eth6  
    virtual_router_id 172  ## 虚拟路由ID号
        mcast_src_ip 192.168.1.172  ## 本机ip地址
        priority 100  ##优先级配置(0-254的值)
        Nopreempt  ## 
        advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
        authentication {  
            auth_type PASS
            auth_pass bhz ## 真实生产环境下对密码进行匹配
        }
    
        track_script {
            chk_nginx
        }
    
        virtual_ipaddress {
            192.168.1.170 ## 虚拟ip(vip),可以指定多个
        }
    }

    ! Configuration File for keepalived
    
    global_defs {
       router_id bhz006
    }
    
    vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight -20
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface eth7
        virtual_router_id 173
        mcast_src_ip 192.168.1.173
        priority 90 ##优先级配置
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass bhz
        }
    
        track_script {
            chk_nginx
        }
    
        virtual_ipaddress {
            192.168.1.170
        }
    }

     注意:当前为抢占式配置,也就是说,master在宕机后backup会顶上去成为主。然后原来的master修好以后,会回来抢夺master的位置。非抢占式就是说master即使宕机了然后修好回来,也不会和当前的新master争夺新的位置,是吧,大不了本阿哥不当皇帝,佛着也挺好的。那么怎么配置佛系非抢占呢?将主和从的状态都变为backup,加上nopreempt 即可不争夺资源,但是这种情况下,心跳脚本必须检测我们nginx的状况,当nginx挂了的时候拉起来,实在拉不起来的时候就得杀掉我们的keepalived,否则的话不能实现切换。

    nopreempt 

    4.脚本编写

    脚本的编写思路就像上面非抢占的说的,检测nginx进程,然后进程为0的话拉起nginx,如果nginx是扶不起来的阿斗的话把keepalived杀了。

    #!/bin/bash
    echo "[nginx_check.sh]:now prepareing to healthy check " >> /var/log/messages
    n=`ps -C nginx --no-heading|wc -l`
    if [ $n -eq "0" ]; then
    echo "[ nginx_check.sh]:now start nginx">> /var/log/messages
    systemctl start nginx
    n2=`ps -C nginx --no-heading|wc -l`
    if [ $n2 -eq "0" ]; then
    echo "[nginx_check.sh]:nginx down,keepalived will stop" >> /var/log/messages
    systemctl stop keepalived
    fi
    fi

     写完一定要赋予这个脚本权限,我这里直接给出最简单的777哈

    chmod 777 /etc/keepalived/nginx_check.sh

    5.启动keepalived(得先启动nginx)  

    service nginx start
    service keepalived start
    ps -ef | grep nginx 
    ps -ef | grep keepalived

    这时候keepalived的控制台会一直打印日志

    如果启动出错,通过systemctl status keepalived.service查看错误日志

    如果报错如下:

    [root@BanAn-nginx2 sbin]# systemctl status keepalived.service
    ● keepalived.service - SYSV: Start and stop Keepalived
       Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)
       Active: failed (Result: exit-code) since 一 2018-12-17 17:02:33 CST; 1min 2s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 25668 ExecStart=/etc/rc.d/init.d/keepalived start (code=exited, status=1/FAILURE)
    
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: Starting SYSV: Start and sto....
    12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: Starting keepalived: /…令
    12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: [失败]
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service: control ...1
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: Failed to start SYSV: Start ....
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: Unit keepalived.service ente....
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service failed.
    Hint: Some lines were ellipsized, use -l to show in full.
    [root@BanAn-nginx2 sbin]# systemctl status keepalived.service -l
    ● keepalived.service - SYSV: Start and stop Keepalived
       Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)
       Active: failed (Result: exit-code) since 一 2018-12-17 17:02:33 CST; 2min 9s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 25668 ExecStart=/etc/rc.d/init.d/keepalived start (code=exited, status=1/FAILURE)
    
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: Starting SYSV: Start and stop Keepalived...
    12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: Starting keepalived: /bin/bash: keepalived: 未找到命令
    12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: [失败]
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service: control process exited, code=exited status=1
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: Failed to start SYSV: Start and stop Keepalived.
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: Unit keepalived.service entered failed state.
    12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service failed.
    [root@BanAn-nginx2 sbin]# cd /usr/sbin/

    那么这样做就可以了

    cd /usr/sbin/
     rm -f keepalived 
     cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/

    好的,现在的东西起来了哈!

     

    ps:关闭keepalived:

    /etc/init.d/keepalived stop

    6.测试

    6-1 虚拟ip查看

    首先我们看看虚拟ip起来没有。不要用ifconfig,用 ip a

    ip a

    在这里会出现我们在主从里面配置的虚拟ip,我这里配的是18,和上面不太一样哈。如果没有出来的自己检查网卡去。

    如果没有出来的话就是配置出错,如果两台主从机同时都出现这个虚拟的ip,说明发生了脑裂

    6-2 脑裂问题

    查看日志

    tail -f  /var/log/messages

    发现master和backup机都是mastaer模式启动的

    通过查看别人的经历,发现VRRP基于报文实现的。master设置一定时间发送一个报文给backup如果backup没有收到就自己成为master。可推出导致问题的原因是因为backup没有收到文

    所以自己成为了master。

    VRRP控制报文只有一种:VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内。这保证了VRID在不同网络中可以重复使用。为了减少网络带宽消耗只有主控路由器才可以周期性的发送VRRP通告报文。备份路由器在连续三个通告间隔内收不到VRRP或收到优先级为0的通告后启动新的一轮VRRP选举。

    centos7安装keepalived后,不关闭防火墙,虚拟ip不能实现漂移,双机都为master,不能实现双机热备的效果。原因是防火墙中没有方形vrrp的组播 IP 244.0.0.18。centos7下使用的防火请是firewall,本人不会使用centos7默认的防火墙放行组播IP,所以禁用掉centos7默认的防火墙,使用iptables防火墙。

         

    1、关闭默认的firewall防火墙
    #systemctl stop firewalld.service停止firewalld服务
    #systemctl disable firewalld.service进制开机自启动
    
    2、开启iptables
    #yum install iptables(根据centOS7的版本和内核,有些版本已经装过,可以跳过此命令)
    
    #yum install iptables-services
    
    
    3、编辑iptables文件
    #vim /etc/sysconfig/iptables
    在文件中添加一下内容
    -A OUTPUT -o eno16777736 -d 224.0.0.18 -j ACCEPT    注解:eno16777736 是网卡名称
    -A OUTPUT -o eno16777736 -s 224.0.0.18 -j ACCEPT
    -A INPUT -i eno16777736 -d 224.0.0.18 -j ACCEPT
    -A INPUT -i eno16777736 -s 224.0.0.18 -j ACCEPT
    
    4、开启服务,设置开机自启动
    #service iptables restart
    
    #chkconfig iptables on或者systemctl enable iptables.service开机自启
    
    此时就能实现虚拟ip的漂移,当master(keepalived)挂掉时,虚拟ip会漂移到backup(keepalived)上,master启动后虚拟ip又飘逸回来。

    6-3 测试方法

    【1】抢占式

    抢占式的配置下,首先查看日志,确定哪台是主哪些是从机。然后修改主机的nginx.conf,让该配置文件不正常。

    然后service nginx stop,主机会尝试拉起来,拉不动后主机keepalived宣布over,备用机变为主机。

    最后将原主机的nginx.conf恢复正常,看看原主机会不会回来夺回master,如果夺回说明抢占式配置成功。

    【2】非抢占式配置

    同抢占式,首先查看日志确定主从,修改主的nginx,conf,主拉不动nginx宣布keepalived凉了,于是切换备用机为主。

    然后恢复之前的主,如果正常恢复而且不去抢夺说明是成功的。

    ps:本项目中使用抢夺的,因为不想执行kill keepalived的进程。

     

  • 相关阅读:
    201805140815_《缓存操作函数封装》
    201802071223_《更换两个二进制》
    201801301359——《注意Javascript这种形式》
    201708310807_《算法-Javascript实现最大公约数》
    重拾java openjdk1.8 语法小试
    代码轮子之很简单但是挺管用的基于C# Task的模拟并发的代码
    docker1.12 安装pxc(Percona XtraDB Cluster )测试
    .net orm比较之dapper和Entity Framework6的简单测试比较
    StackExchange.Redis使用和封装小试
    docker1.12 安装redis3官方集群 攻略
  • 原文地址:https://www.cnblogs.com/daysn/p/10132358.html
Copyright © 2011-2022 走看看