Nginx知多少系列之(十四)Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

目录

1.前言

2.安装

3.配置文件详解

4.工作原理

5.Linux下托管.NET Core项目

6.Linux下.NET Core项目负载均衡

7.负载均衡策略

8.加权轮询(round robin)策略剖析

9.IP哈希(ip hash)策略剖析

10.最少连接(least_conn)策略剖析

11.随机(random)策略剖析

12.URL哈希(url hash)策略剖析

13.响应时间(fair)第三方模块详解

14.Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

15.Linux下.NET Core项目Nginx+Keepalived高可用(双主模式)

16.Linux下.NET Core项目LVS+Keepalived+Nginx高可用集群

17.构建静态服务器

18.日志分析

19.优化策略

20.总结

 

在这里我们简单介绍下Keepalived,它是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。在这里我们就不先详细的介绍keepalived的相关内容,这一部分内容后面的文章会有提到。这里主要讲解如何去利用keepalived部署高可用的双机主从模式。

 

所谓的双机主从模式,就是前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态。

 

如果在尝试的过程中,遇到不明上下文的,例如像VM如何安装,Nginx如何安装部署等可以看《Nginx知多少系列之(一)前言》《.NET Core项目部署到Linux(Centos7)(一)前言》两个专题系列。

 

注意:遇到不明白的地方、哪里有不对的以及有好的建议的,记得评论留言喔,我会尽快回复!

 

1.环境以及相关文章

 

服务器 IP 说明
LB-Master 192.168.157.150 Nginx负载均衡主服务器(Keepalived主服务器)
LB-Slave 192.168.157.200 Nginx负载均衡备服务器(Keepalived从服务器)
Web Server-01 192.168.157.130 后端服务器站点-1(Nginx+.NET Core)
Web Server-02 192.168.157.131 后端服务器站点-2(Nginx+.NET Core)
Web Server-03 192.168.157.132 后端服务器站点-3(Nginx+.NET Core)

 

 

 

2.Web Server和主从服务器Nginx的部署

 

在文章《Nginx知多少系列之(七)负载均衡策略》里我们已经介绍了如何部署三台服务器以及用一台Nginx服务器作为负载均衡。每一台服务器的IP根据你自身的环境所变化,不需要保持一致。我们还需要额外在部署一台Nginx服务器作为从服务器,和之前部署的Nginx一模一样。

 

接下来我们要对主从服务器的负载均衡做简单的轮询配置

 

#进入Nginx配置文件目录
cd /etc/nginx/conf.d

#编辑配置文件
sudo vim upstream.conf

#按i进入编辑模式,输入下面的内容

upstream netCoreDemo  {
    server 192.168.157.130;
    server 192.168.157.131;
    server 192.168.157.132;
}

server {
    listen   80;
    location / {
      proxy_pass  http://netCoreDemo;
    }
}

#编辑好后,按Esc,再输入:wq保存退出

#重启nginx
sudo nginx -s reload

 

记得是主从服务器的负载均衡策略配置要保持一致。接下来我们单独看看主从服务器(主:192.168.157.150   从:192.168.157.200)的访问效果。

 

 

 

3.Keepalived安装

 

我们这先介绍如何使用yum安装,这里需要在主从Nginx服务器都安装keepalived,即192.168.157.150和192.168.157.200。

 

#安装keepalived
sudo yum install -y keepalived

 

如下图,我们已经成功安装keepalived了,这个时候还不能启动,因为需要做一些配置 

 

 

记得是两台服务器都要装Keepalived哦!

 

4.Keepalived配置文件

 

我们来先配置Master节点的信息(192.168.157.150)

 

#进入keepalived目录
cd /etc/keepalived

#备份配置文件
sudo cp keepalived.conf keepalived.conf.bak

#删除配置文件,里面的配置太长了,这里我们做简单配置,所以还是删了在创建新的比较方便哈
sudo rm -rf keepalived.conf

#创建新配置文件
sudo touch keepalived.conf

#编辑配置文件
sudo vim keepalived.conf

#按i进入编辑模式,复制下面的配置信息

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_01
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.157.100
    }
}

#按Esc,然后:wq保存退出

 

接下来配置BACKUP节点的信息(192.168.157.200)

 

#进入keepalived目录
cd /etc/keepalived

#备份配置文件
sudo cp keepalived.conf keepalived.conf.bak

#删除配置文件,里面的配置太长了,这里我们做简单配置,所以还是删了在创建新的比较方便哈
sudo rm -rf keepalived.conf

#创建新配置文件
sudo touch keepalived.conf

#编辑配置文件
sudo vim keepalived.conf

#按i进入编辑模式,复制下面的配置信息

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_02
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.157.100
    }
}

#按Esc,然后:wq保存退出

 

下面是配置文件的部分解析

 

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_01  #keepalived标识信息,自定义
}
vrrp_instance VI_1 {
    state MASTER  #指定实例初始状态,实际的MASTER和BACKUP是选举决定的
    interface ens33  #指定实例绑定的网卡
    virtual_router_id 51 设置VRID标记,多个集群不能重复(0..255),同一组的或主从的必须保持一致
    priority 100  #设置优先级,优先级高的会被竞选为Master,MASTER和BACKUP的优先级要不一样
    advert_int 1  #检查的时间间隔,默认1s
    authentication {  #设置认证
        auth_type PASS  #认证方式,支持PASS和AH,官方建议使用PASS
        auth_pass 1111  #认证的密码
    }
    virtual_ipaddress {  #设置VIP,可以设置多个,用于切换时的地址绑定。
        192.168.157.100
    }
}

 

查看网卡信息

 

#查看网卡信息
ifconfig

 

 

5.启动Keepalived

 

我们已经把主从节点的配置信息都弄好啦。马上就可以启动keepalived测试效果咯,是不是有点期待??接下来才是填坑的开始……

 

我们先来启动主服务器的keepalived

 

#启动主服务器的Keepalived
sudo service keepalived start

#查看keepalived状态
service keepalived status

 

 

我们也可以在/var/log/messages看到启动信息,如果发生错误也可以在里面看到

 

#查看日志文件
sudo less /var/log/messages

#less查看一个文件时,可以使用类似vi的command命令,在command模式下按G跳到文件末尾,再使用f或B来翻页

less filename
:G 跳到底部,就可以用 向上 向下 箭头 或 向滚动鼠标来查看log了

 

 

是不是很开心,看上图我们已经启动成功了,我们先来看看VIP(虚拟IP)是不是已经分配了

 

#查看IP信息
ip add

 

 

我们可以看到上图,在150主服务器里,已经分配了之前我们配置的virtual_ipaddress:192.168.157.100

 

主服务器的keepalived已经启动成功了,我们接下来按照同样的方式去启动从服务器的keepalived。可以参考上面的操作,我们直接看图吧。

 

 

 

 

看到上图和主服务器显示的一模一样,同时也分配了VIP,我们先不管其他问题,先来验证下,使用VIP:192.168.157.100是不是能访问站点

 

 

 

恭喜你,已经用VIP访问成功了,但是这里有个问题了,下面我们会接着讲。

 

6.Keepalived脑裂问题

 

正常的部署keepalived里只有主服务器才会分配到VIP,当主服务器宕机之后,VIP才会漂移到从服务器,这个时候从服务器就负责之前主服务器的工作。那现在主从服务器都有VIP,那就是常说的脑裂问题。下面我们来解释下什么是脑裂?

 

脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。

 

就像我们上面的那样,主服务器和从服务器都有VIP,然后互相争抢资源了,那这个时候我们怎么解决呢?这有两种解决方案:

 

①、直接干脆的,关闭防火墙

 

在这里避免别的问题出现,我们先重启机器,然后在执行关闭防火墙,开启keepalived的操作

 

#重启Linux
sudo reboot

#查看防火墙状态
service firewalld status

#暂时性关闭防火墙,下次开机又会打开
sudo service firewalld stop

#永久性关闭防火墙
sudo systemctl disable firewalld

#开启服务器的keepalived
sudo service keepalived start

 

 

主从服务器都完成操作后,记得是两台服务器都要做相应的操作。我们在看看VIP的分配情况

 

 

 

 

如上图,在192.168.157.150主服务器,已经成功分配到了VIP。然后在192.168.157.200从服务器未分配到VIP,这样就解决了主从服务器都有VIP,产生脑裂的问题啦(当然其他原因导致的脑裂问题还是会存在的,产生脑裂的情况可是有很多的)。但是除非这台电脑是内网访问的,不然都是增加对应的策略,而不是简单粗暴的关闭防火墙就完事了,关闭防火墙容易导致安全性问题。

 

②、设置防火墙规则

 

在这里我们对主从服务器都开启组播地址,然后在开启主从服务器的keepalived,在看看VIP是不是只有主服务器才有。

 

#开启组播地址
sudo firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

#刷新防火墙配置
sudo firewall-cmd --reload

#查看防火墙状态
service firewalld status

#开启keepalived
sudo service keepalived start

#查看keepalived的状态
service keepalived status

#查看ip信息
ip add

 

 

 

 

上图显示的IP结果和直接关闭防火墙的信息是一致的,说明是有效的解决了脑裂的问题。我们来看看访问的效果

 

 

7.Keepalived主从切换

 

在上面我们已经解决主从服务器都出现VIP的问题了,虽然现在是访问正常的,但是还没达到我们想要实现的目的,这样纯碎只是说在原来的基础上用了一个VIP是对外访问而已,和高可用没有关系。那接下来我们就实践如何保证高可用主从切换,当主服务器出现问题,例如宕机,服务停止等问题后,从服务器能接管过来确保站点的访问正常。

 

①、直接服务器宕机

 

首先我们直接关机主服务器,然后看看VIP:192.168.157.100是不是漂移到了从服务器上,访问站点是不是也正常。

 

#主服务器直接关机

#在从服务器尝试PING 主服务器IP 192.168.157.150
ping 192.168.157.150

#查看IP信息
ip add

 

 

哦豁,从上图可以看到主服务器已经彻底关机了,PING也PING不通了。同时我们看从服务器的IP信息,VIP:192.168.157.100已经漂移到从服务器上啦。说明什么呢?说明主服务器出现问题后,从服务器能马上接管,保证站点的正常访问啦。

同时我们也可以看看keepalived的日志信息

 

#查看日志文件
sudo less /var/log/messages

#less查看一个文件时,可以使用类似vi的command命令,在command模式下按G跳到文件末尾,再使用f或B来翻页

less filename
:G 跳到底部,就可以用 向上 向下 箭头 或 向滚动鼠标来查看log了

 

 

可以看到上图在15:15分我们把主服务器关机之后,从服务器就Transition to MASTER STATE,即转变为MASTER的状态,接管MASTER的工作。那站点是不是也访问成功了呢?直接上图

 

 

访问正常,现在已经做到了主服务器出问题,从服务器能接管的啦。那当我们把主服务器开机后会怎么样呢??我们来看看IP 信息,日志以及访问的效果。

 

 

 

 

 

当我们把主服务器开机后,发现VIP又漂移回主服务器拉,在日志里也有显示Received advert with higher priority 100,ours 99。在组播里我们收到更高的优先级100,我们才90,那从服务器要改为BACKUP STATE以及移除对应的VIP。

 

②、停止keepalived的服务

 

这里我们采用停止服务的方式去测试主从切换,停止主服务器的keepalived,为了方便测试,我们把主服务器的Nginx也停止了。然后看看VIP是否漂移以及访问是否正常。

 

#停止keepalived服务
sudo service keepalived stop

#查看keepalived状态
service keepalived status #停止Nginx sudo nginx
-s stop #查看ip信息 ip add

 

 

当我们把主服务器的keepalived和nginx都停止后,发现个问题就是keepalived服务停止了,VIP竟然没有释放,那从服务器是什么情况??我们看看从服务器的IP信息

 

 

从服务器的IP信息里并没有发现VIP漂移过来,说明主从切换失败了,那站点访问情况如何??

 

 

VIP并没有漂移,还是在原来的主服务器上,但我们已经把Nginx服务停止了,所以出现了访问不了的情况。正常来说这个时候应该是从服务器接管。但并没有,这是为什么呢??

在上面我们已经把keepalived的服务已经停止了,但是我们来看看keepalived的进程还在不在?

 

#查看keepalived的进程
ps aux |grep keepalived

 

 

哦豁??看到没有,服务停止了,进程竟然还在,说明service keepalived stop并没有清理干净,所以才导致VIP没有漂移,主从切换失败的。这个时候我们要想到是systemd服务脚本的问题

 

#进入keepalived.service目录
cd /usr/lib/systemd/system

#编辑keepalived.service
sudo vim keepalived.service

#按i进去编辑模式

#注释掉
KillMode=process

#按Esc,然后:wq保存退出

#重新加载配置
sudo systemctl daemon-reload

#开启主服务器的keepalived
sudo service keepalived start

#停止主服务器的keepalived服务
sudo service keepalived stop

#查看keepalived 状态
service keepalived status

#查看IP信息

 

 

 

 

当我们修改了system服务脚本,重启了之后,发现主从切换正常了,VIP也漂移到了192.168.157.200从服务器,站点访问也是正常的。至于把主服务器的keepalived重新开启之后,效果和之前直接关机开机后的是一样的,这里就不重复验证了。你们可以直接开启服务去验证下。

 

那现在已经实现了Nginx高可用主从模式,当主服务器宕机后,从服务器接管。主服务器正常后,从服务器重新移交给回主服务器。这里的检测是keepalived出现问题的情况下,会主从切换。那如果keepalived是正常的,服务器也是正常的,就是Nginx挂了??那结果会怎么样?我们又如何去解决??

 

8.Keepalived日志的配置

 

keepalived的日志默认是写到/var/log/messages里面的,在上面我们也看到过相关的日志,但是很多系统消息之类的都会往/var/log/messages,这样就显得太多太杂,有时候分不清,那这个之后就想把日志分离出来,在这里我们把keepalived的日志单独放到了/var/log/keepalived.log

 

#编辑keepalived配置文件
sudo vim /etc/sysconfig/keepalived

#按i 进入编辑模式

#把KEEPALIVED_OPTIONS="-D" 修改为KEEPALIVED_OPTIONS="-D -d -S 0"

KEEPALIVED_OPTIONS="-D -d -S 0"

#按Esc 然后:wq保存退出

#修改rsyslog文件
sudo vim /etc/rsyslog.conf

#按i 进入编辑模式

#在文件的最后添加下列的内容,local0这里记得前面不要有#,不然会注释,不起作用的

# keepalived -S 0 
local0.*                                                /var/log/keepalived.log

#按Esc 然后:wq保存退出

#重新启动日志
service rsyslog restart

 

在上面我们可以看到把rsyslog里的自定义信息local0都输出到/var/log/keepalived.log里面去,在这之后,我们修改了keepalived的配置为KEEPALIVED_OPTIONS="-D -d -S 0",是要把keepalived的日志指定为local0,这样在keepalived把日志输出类型为local0,而local0的日志又被定义转储存在/var/log/keepalived.log里。

 

我们可以验证下keepalived的日志是不是到了/var/log/keepalived.log里

 

#重启keepalived
sudo service keepalived restart

#查看日志
sudo tail -f  /var/log/keepalived.log

 

 

在上图已经看到keepalived的日志已经到了/var/log/keepalived.log,到这里我们就已经把keepalived的日志分离出来啦。

 

9.Nginx心跳检测

 

现在就有那么一种情况就是,服务器并没有宕机,keepalived也好好的,就是nginx服务挂了,那会出现访问不到页面,我们首先把主服务的Nginx停掉,验证下效果

 

#停止主服务器的Nginx
sudo nginx -s stop

 

 

看上图,虽然keepalived是运行的,但是站点一样无法访问,而且也不会漂移VIP,这样就做不到高可用集群,那这个时候我们就要keepalived去检测nginx的心跳,如果Nginx挂了就尝试去重新启动,如果启动不了就直接把keepalived服务停止了,让VIP漂移到BACKUP从服务器上。

 

我们在keepalived安装目录建立Nginx检测shell脚本

 

#进入keepalived目录
cd /etc/keepalived

#创建脚本文件
sudo vim nginx_health_check.sh

按i进入编辑模式,增加下来内容


#!/bin/bash

#日志输出,默认到/var/log/messages,这里需要更改为/var/log/keepalived.log
#vim /etc/rsyslog.conf
#添加下面内容
#local0.* /var/log/keepalived.log
#表示local0设备的日志信息记录于/var/log/keepalived.log里
#重启rsyslog服务
#service rsyslog restart
function log(){
    logger -i -t "nginx_check" -p local0.info "$1"
}


counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/sbin/nginx
    log "Find nginx stopped and then starting."
    sleep 3
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        log "Nginx start failed."
        log "keepalived stopping."
        service keepalived stop
        log "keepalived stop success."
    else
        log "Nginx start success."
    fi
fi



#按Esc退出编辑,然后:wq退出保存

 

在上面我们已经创建了心跳检测的脚本,大概的流程是这样的:

①、检测nginx服务是否存在

②、如果存在就直接等待下一次检测

③、如果不存在那么我们就尝试启动nginx服务,同时启动也需要时间,所以在这里我们等待3秒,3秒后我们再次检测nginx服务是否已经启动成功

④、如果成功,则等待下一次检测

⑤、如果不成功,则把keepalived的服务停止了,这样就可以VIP漂移,通知从服务器跑起来

 

这里的话也有可能keepalived停止失败的,这个一般都是防火墙等的问题,下面我们会讲到,同时在检测的过程中,我们也会把日志,记录到/var/log/keepalived.log,因为我们记录日志的时候使用的是自定义0-7里面的local0,在前面已经定义了local0的日志都会记录到keepalived.log里面。记录日志的话,这样检测到有问题,我们也可以看到相关的内容。

 

接下来我们可以执行下,检测下脚本是不是有问题?

 

#查看nginx进程
ps aux |grep nginx

#停止nginx
sudo nginx -s stop

#查看nginx进程
ps aux |grep nginx

#单独执行脚本
sudo bash /etc/keepalived/nginx_health_check.sh

#查看nginx进程
ps aux |grep nginx

 

 

我们可以看到上图,当我们把nginx停止后,单独运行心跳脚本,脚本会自动把nginx启动回来,说明这个脚本是没有问题的!

 

心跳检测脚本写好之后,我们就要修改keepalived.conf配置文件,把刚刚创建的脚本配置到keepalived里面,让keepalived去运行这个心跳检测脚本

 

#编辑keepalived.con文件
sudo vim /etc/keepalived/keepalived.conf

#按i进入编辑模式,增加红色区的内容

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_01
}
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_health_check.sh"
    interval 5
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       chk_nginx
    }
    virtual_ipaddress {
        192.168.157.100
    }
}

#编辑好后,按Esc,然后:wq退出保存

 

这里vrrp_script chk_nginx一定要放在vrrp_instance VI_1前面,不然后面启动会没有反应的哦,chk_nginx这个是自定义名字哈,喜欢叫啥就叫啥,script就是我们刚刚创建的心跳脚本的路径,interval就是心跳间隔的时间,5的话就是5秒,还记得前面在脚本里因为要等待nginx启动,所以sleep了3秒,这里interval一定要比sleep的时间大,不然会报错的哦!weight就是权重,如果成立的话,就会降低对应服务器的keepalived权重,有可能就会从主服务器变为从服务器的。

 

OK啦,这两个都准备好,我们就准备开始运行啦,不过在运行之前,我们还要做两个准备,不然会出现两种情况哦,一是启动了脚本压根没有执行,而是脚本执行了,但是里面的命令执行失败,例如启动nginx,停止keepalived服务等。

 

①、心跳检测脚本权限问题

 

#把nginx心跳检测脚本更改权限
sudo chmod 755 /etc/keepalived/nginx_health_check.sh

 

这里的话把心跳检测脚本更改为可执行的权限,同时你可以在/etc/keepalived文件夹下面,用ls命令,可以看到显示的是绿色,绿色代表为可执行文件,可执行的程序。如果不更改,会发现这个脚本压根不会执行。

 

②、SELinux安全模块的问题

 

SELinux这个我目前也还没搞懂到底是做什么的哈,关于这方面的问题,有种最简单粗暴的方法,如下

 

#临时关闭selinux,这个终端关闭了就失效咯
sudo setenforce 0

#查看selinux
getenforce

#查看selinux状态
sestatus
#永久关闭,编辑
/etc/sysconfig/selinux sudo vim /etc/sysconfig/selinux #按i进入编辑模式,修改下面的内 SELINUX=disabled #按Esc,然后:wq保存退出编辑

 

直接把SELinux关闭了,一了百了,省事,很多时候有不少问题就是它导致的,说真的,我就是到了这一步,研究了好久,为什么人家的都没有问题,我的脚本虽然执行了,但是里面的命令就一直执行失败,刚开始以为是脚本执行权限的问题,一直找原因都没有找到,可能它就是看我找到太久了,突然灵光一闪,觉得是它的问题,尝试关闭它,竟然成功了,足足折腾了我好久。看看不关的情况是怎么样,如下图

 

 

这里就是没有更改selinux,心跳脚本虽然执行了,但是里面的命令一直执行不了,导致一直检测到有问题。

 

还有一种方式就是把keepalived和nginx增加至selinux白名单

 

在这里我们可以先看看怎么判断增加什么策略可以通过selinux,也可以直接看结果,运行后面的命令

 

#安装setroubleshoot
sudo yum -y install setroubleshoot

#xshell开启新终端,监控messages日志
sudo tail -f /var/log/messages

#停止nginx服务
sudo nginx -s stop

#重启keepalived
service keepalived restart

 

当SELinux发生错误时,会将有用的信息记录下来到/var/log/messages,如下图

 

 

或者我们可以执行下面的命令

 

#查看错误信息
sudo cat /var/log/messages |grep setroubleshoot

 

 

因为在脚本里面,我们要执行nginx和keepliaved相关的命令,所以在/var/log/messages里找到SELinux  keepalived和nginx相关的错误信息,然后我们执行For complete SELinux messages run:后面的命令。例如

 

#执行sealert命令,这里只是个例子哈,具体看上面你们执行出来的结果
sudo sealert -l 03ad7984-32b7-4d51-82bf-e86bc462d38f

 

 

看上面执行完命令之后,在红色框框里会建议你执行什么操作能允许访问权限执行,经过分析后,就有下面的结果啦,执行完脚本就可以启动nginx命令和停止keepalived命令。

 

#安装依赖软件
sudo yum -y install policycoreutils-python

#返回主目录
cd

#增加nginx至selinux白名单,mynginx是自定义名字哈,记住一定要在开启nginx的时候执行,不然运行了没有效果  
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M my-nginx  

#这个是执行了上面命令后,提示你要执行的命令
sudo semodule -i my-nginx.pp

#增加keepalived至selinux白名单,记住一定要在开启keeaplived的时候执行,不然运行了没有效果  
sudo cat /var/log/audit/audit.log | grep keepalived | grep denied | audit2allow -M my-keepalived #这个是执行了上面命令后,提示你要执行的命令 sudo semodule -i mykeepalived.pp #删除刚刚创建的keepalived相关文件 sudo rm -rf my-keepalived* #删除刚刚创建的nginx相关文件 sudo rm -rf my-nginx*

 

好啦好啦,准备工作都做好了,注意:主从服务器都要做一样的操作哦,包含日志的分离等等!!

 

接下来,来验证下心跳脚本,首先验证nginx停了之后,心跳脚本会不会自动启动nginx

 

#用xshell开启两个终端,第一个用来监控主服务器日志文件的变化
sudo tail -f /var/log/keepalived.log

#第二个在主服务器做如下的操作

#重启keepalived
sudo service keepalived restart

#停止nginx
sudo nginx -s stop

#查看nginx 进程
ps aux |grep nginx

#隔几秒后再次查看nginx 进程
ps aux |grep nginx

#查看IP信息
ip add

 

 

 

 

可以看到上图,当我们停止nginx后,就等待keepalived的心跳检测,等待重启的过程中nginx进程查不到,当keepalived心跳检测开始后,我们可以看到日志里显示之前在脚本里打印的日志Find nginx stopped and then starting,然后开始启动nginx服务,启动成功后可以查到nginx的相关进程。同时我们会打印日志提示Nginx start success。

 

接着我们也要验证下,当nginx实在重启不了的时候,心跳脚本会不会停止keepalived,停止之后从服务器会不会接管过来?

 

#用xshell开启两个终端,第一个用来监控主服务器日志文件的变化
sudo tail -f /var/log/keepalived.log

#第二个在主服务器做如下的操作

#编辑nginx心跳检测脚本
sudo vim /etc/keepalived/nginx_health_check.sh

#按i 编辑

#注释启动nginx的命令
#/usr/sbin/nginx

#按Esc,然后:wq退出保存

#重启keepalived
sudo service keepalived restart

#停止nginx
sudo nginx -s stop

#查看nginx 进程
ps aux |grep nginx

#查看IP信息
ip add

 

 

 

 我们可以从上图看出来,当我们把启动nginx的命令注释后,keepalived的nginx心跳检测脚本会检测到nginx服务未开启,然后尝试开启,启动失败会直接停止keepalived服务,移除VIP,同时我们来看看从服务器的IP信息

 

 

VIP已经漂移到了从服务器上了,说明整个过程是流畅的,等主服务器启动之后,VIP又会漂移回来。来看看访问站点是不是成功的。

 

 

哦啦,至此大功告成,这就是Nginx+Keepalived高可用主从模式,解决了单个Nginx作为负载均衡发生的单点故障问题。从服务器的测试这里就不重复了,你们可以自己去验证下是不是心跳脚本也正常的。

 

10.Keepalived非抢占模式

 

在上面我们实现的主从模式,keepalived默认是抢占模式,就是当MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。其实很多时候主从服务器配置都是一样的,当主服务器恢复后抢占回来没有多大的必要,反而多了一次VIP的漂移。所以keepalived支持适用非抢占模式,即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。

 

接下来我们看看如何配置双机主从非抢占模式。

 

主服务器配置如下:

 

#编辑keepalived配置
sudo vim /etc/keepalived/keepalived.conf

#按i进入编辑模式

#增加nopreempt以及修改state为BACKUP,标注红色的内容,如下

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_01
}
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_health_check.sh"
    interval 5
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.157.100
    }
}

#按Esc,然后:wq退出保存

 

从服务器配置如下:

 

#编辑keepalived配置
sudo vim /etc/keepalived/keepalived.conf

#按i进入编辑模式

#增加nopreempt,标注红色的内容,如下

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_02
}
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_health_check.sh"
    interval 5
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.157.100
    }
}


#按Esc,然后:wq退出保存

 

我们已经把主从服务器的keepalived已经配置好了,接下来我们测试下效果

 

①、检测keepalived、nginx都启动,验证正常情况下,VIP在哪台服务器

 

#重启主从服务器的keepalived
sudo service keepalived restart

#确保nginx都开启了
ps aux |grep nginx

#没有开启的话,开启nginx
sudo nginx

#查看两台服务器的ip信息,看看正常情况下,VIP在哪里
ip add

 

 

因为在之前的配置里,主服务器的priority优先级为100,所以在一开始正常的情况下,VIP出分配到优先级高的服务器上。

 

②、停止有VIP的服务器,在看看VIP是不会漂移到另外一台备用服务器上了

 

#停止有VIP服务器的keepalived
sudo service keepalived stop

#查看两台服务器的IP信息,看看VIP漂移到哪里了
ip add

 

 

当我们停止了正在运行的keepalived服务器之后,VIP正常的切换到了另外一台备用服务器上

 

③、把之前停的keepalived服务器重新启动回来,我们看看会不会这台重启的服务器抢占回来??

 

#启动主服务器的keepalived
sudo service keepalived start

#查看两台服务器的IP信息,看看VIP漂移到哪里了
ip add

 

 

在一轮验证之后,发现如果主从服务器都设置为非抢占模式,那么当主服务器重新启动之后,并不会抢回VIP,其实主从服务器的配置是一样的,并没有必要说主服务器重新运行就马上抢回来。

 

11.Keepalived常用命令

 

#启动keepalived
service keepalived start

#停止keepalived
service keepalived stop

#重启keepalived
service keepalived restart

 

posted @ 2020-04-27 10:51  江远良  阅读(1281)  评论(5编辑  收藏  举报