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)

 

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

 

 

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)的接见效果。

 

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

 

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

 

3.Keepalived安装

 

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

 

#安装keepalived
sudo yum install -y keepalived

 

如下图,我们已经乐成安装keepalived了,这个时刻还不能启动,由于需要做一些设置 

 

Nginx知多少系列之(十四)Linux下.NET Core项目Nginx+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

 

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

 

5.启动Keepalived

 

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

 

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

 

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

#查看keepalived状态
service keepalived status

 

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

 

我们也可以在/var/log/messages看到启动信息,若是发生错误也可以在内里看到

 

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

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

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

 

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

 

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

 

#查看IP信息
ip add

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

恭喜你,已经用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

 

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

 

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

 

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

 

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

 

如上图,在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

 

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

 

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

 

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

 

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

 

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

 

7.Keepalived主从切换

 

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

 

①、直接服务器宕机

 

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

 

#主服务器直接关机

#在从服务器实验PING 主服务器IP 192.168.157.150
ping 192.168.157.150

#查看IP信息
ip add

 

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

 

哦豁,从上图可以看到主服务器已经彻底关机了,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了

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

当我们把主服务器开机后,发现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

 

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

 

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

 

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

 

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

 

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

 

Python之学会测试,让开发加倍高效(一)

VIP并没有漂移,照样在原来的主服务器上,但我们已经把Nginx服务住手了,以是泛起了接见不了的情形。正常来说这个时刻应该是从服务器接受。但并没有,这是为什么呢??

在上面我们已经把keepalived的服务已经住手了,然则我们来看看keepalived的历程还在不在?

 

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

 

Nginx知多少系列之(十四)Linux下.NET Core项目Nginx+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信息

 

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

 

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

 

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

 

当我们修改了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

 

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

 

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

 

9.Nginx心跳检测

 

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

 

#住手主服务器的Nginx
sudo nginx -s stop

 

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

 

看上图,虽然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知多少系列之(十四)Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

 

我们可以看到上图,当我们把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关闭了,一了百了,省事,许多时刻有不少问题就是它导致的,说真的,我就是到了这一步,研究了很久,为什么人家的都没有问题,我的剧本虽然执行了,然则内里的下令就一直执行失败,刚最先以为是剧本执行权限的问题,一直找缘故原由都没有找到,可能它就是看我找到太久了,突然灵光一闪,以为是它的问题,实验关闭它,竟然乐成了,足足折腾了我很久。看看不关的情形是怎么样,如下图

 

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

 

这里就是没有更改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,如下图

 

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

 

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

 

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

 

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

 

由于在剧本内里,我们要执行nginx和keepliaved相关的下令,以是在/var/log/messages里找到SELinux  keepalived和nginx相关的错误信息,然后我们执行For complete SELinux messages run:后面的下令。例如

 

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

 

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

 

看上面执行完下令之后,在红色框框里会建议你执行什么操作能允许接见权限执行,经由剖析后,就有下面的效果啦,执行完剧本就可以启动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知多少系列之(十四)Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

 

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

 

可以看到上图,当我们住手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知多少系列之(十四)Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

 

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

 

 我们可以从上图看出来,当我们把启动nginx的下令注释后,keepalived的nginx心跳检测剧本会检测到nginx服务未开启,然后实验开启,启动失败会直接住手keepalived服务,移除VIP,同时我们来看看从服务器的IP信息

 

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

 

VIP已经漂移到了从服务器上了,说明整个历程是流通的,等主服务器启动之后,VIP又会漂移回来。来看看接见站点是不是乐成的。

 

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

 

哦啦,至此大功告成,这就是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

 

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

 

由于在之前的设置里,主服务器的priority优先级为100,以是在一最先正常的情形下,VIP出分配到优先级高的服务器上。

 

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

 

#住手有VIP服务器的keepalived
sudo service keepalived stop

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

 

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

 

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

 

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

 

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

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

 

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

 

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

 

11.Keepalived常用下令

 

#启动keepalived
service keepalived start

#住手keepalived
service keepalived stop

#重启keepalived
service keepalived restart

 

原创文章,作者:28x29新闻网,如若转载,请注明出处:https://www.28x29.com/archives/6293.html