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

时间:2022-06-06 04:51:24

目录

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 ;
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
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
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
priority 99
advert_int
authentication {
auth_type PASS
auth_pass
}
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 设置VRID标记,多个集群不能重复(..),同一组的或主从的必须保持一致
priority #设置优先级,优先级高的会被竞选为Master,MASTER和BACKUP的优先级要不一样
advert_int #检查的时间间隔,默认1s
authentication { #设置认证
auth_type PASS #认证方式,支持PASS和AH,官方建议使用PASS
auth_pass #认证的密码
}
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 --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高可用(主从模式)

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
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}" = "" ]; then
/usr/sbin/nginx
log "Find nginx stopped and then starting."
sleep
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "" ]; 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
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
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 #查看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
weight -
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id
priority
advert_int
nopreempt

authentication {
auth_type PASS
auth_pass
}
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
weight -
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id
priority
advert_int
nopreempt

authentication {
auth_type PASS
auth_pass
}
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

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

  1. Nginx知多少系列之(六)Linux下.NET Core项目负载均衡

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.负载均衡策略详解 8.Linux下.NET C ...

  2. Linux实战教学笔记31:Keepalived高可用集群应用实践

    1.1 Keepalived高可用软件 1.1.1 Keepalived介绍 Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入 ...

  3. 关于linux下部署JavaWeb项目,nginx负责静态资源访问,tomcat负责处理动态请求的nginx配置

    1.项目的运行环境 linux版本 [root@localhost ~]# cat /proc/version Linux version -.el6.x86_64 (mockbuild@x86-.b ...

  4. Nginx知多少系列之(五)Linux下托管.NET Core项目

    目录 1.前言 2.安装 3.配置文件详解 4.Linux下托管.NET Core项目 5.Linux下.NET Core项目负载均衡 6.Linux下.NET Core项目Nginx+Keepali ...

  5. Nginx知多少系列之(七)负载均衡策略

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.负载均衡策略 8.加权轮询(round rob ...

  6. Nginx知多少系列之(一)前言

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.Linux下.NET Core项目Nginx+ ...

  7. Nginx知多少系列之(二)安装

    目录 1.前言 2.安装 3.配置文件详解 4.Linux下托管.NET Core项目 5.Linux下.NET Core项目负载均衡 6.Linux下.NET Core项目Nginx+Keepali ...

  8. Nginx知多少系列之(三)配置文件详解

    目录 1.前言 2.安装 3.配置文件详解 4.Linux下托管.NET Core项目 5.Linux下.NET Core项目负载均衡 6.Linux下.NET Core项目Nginx+Keepali ...

  9. Nginx+keepalived(高可用双主模式)

    Nginx+keepalived(高可用双主模式) tips:前面已经介绍了nginx+keepalived高可用主从模式,今天补充下高可用的双主模式,均可以作为主机使用 server1:192.16 ...

随机推荐

  1. 第八章 springboot + mybatis + 多数据源(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构 ...

  2. sql server 2000通过机器名可以连,通过ip连不上的问题

    客户那边两台服务器A和B,之前一直都是好好的,今天因为换了网络环境,结果数据库之间不能相互访问了. 目前只能A访问B,B访问不了A,在服务器A上面试了,通过ip连本机,也是连接超时. 开始想着是服务器 ...

  3. css3浏览器前缀 -mos/-webkit/-o/-ms

    1.css3浏览器前缀的意思 -moz为firefox的前缀: -webkit为safari和chrome的前缀: -o为opera浏览器的前缀: -ms为ie浏览器的前缀: 2.常见的需要使用浏览器 ...

  4. lintcode :搜索二维矩阵

    题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...

  5. UVa11235 RMQ

    input 1<=n,q<=100000 升序序列a1 a2 a3 ... an -100000<=ai<=100000 q行i j 1<=i,j<=n 输入结束标 ...

  6. koa-router源码分析

    koa-router源码地址是 koa-router 当前解读版本为7.2.1 关系图 代码结构图 执行流程图 关系对应图 Router方法和属性浅析 methods.forEach 注册注册路由的方 ...

  7. 分布式改造剧集2---DIY分布式锁

    前言: ​ 好了,终于又开始播放分布式改造剧集了.前面一集中(http://www.cnblogs.com/Kidezyq/p/8748961.html)我们DIY了一个Hessian转发实现,最后我 ...

  8. idea本地运行JavaWeb项目

    1.需安装的软件有: JDK,当前版本jdk1.8 maven,当前版本3.2.1 mysql,mysql5.7 tomcat,tomcat9 git客户端,TortoiseGit-2.1.0.0-6 ...

  9. Django之常用命令以及问题汇总

    基本命令 1.新建一个django项目 django-admin.py startproject project-name 2.新建一个app python manage.py startapp ap ...

  10. 下载Centos7 64位镜像

    下载Centos7 64位镜像 1.打开Centos官网 打开Centos官方网站地址:https://www.centos.org/,点击Get CentOS Now 2.点击Minimal ISO ...