目录

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 ;
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
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

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 --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
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}" = "" ]; 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停止后,单独运行心跳脚本,脚本会自动把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关闭了,一了百了,省事,很多时候有不少问题就是它导致的,说真的,我就是到了这一步,研究了好久,为什么人家的都没有问题,我的脚本虽然执行了,但是里面的命令就一直执行失败,刚开始以为是脚本执行权限的问题,一直找原因都没有找到,可能它就是看我找到太久了,突然灵光一闪,觉得是它的问题,尝试关闭它,竟然成功了,足足折腾了我好久。看看不关的情况是怎么样,如下图

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

因为在之前的配置里,主服务器的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

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. Java 注解 So Easy!!!

    Java注解 Annotations, a form of metadata, provide data about a program that is not part of the program ...

  2. 【Pytest01】全网最全最新的Pytest框架快速入门

    一.Pytest简介pytest是一个非常成熟的全功能的Python测试框架,主要有一下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,还可以用来做seleni ...

  3. Nginx打点服务器配置

    Nginx打点服务器配置 什么是打点服务器 他的作用是什么 打点服务器就是记录用户行为的服务器 单独从应用独立出来 目的就是为了减轻应用服务器压力 效果如下: 10.0.1.1 - - [05/Feb ...

  4. Android进阶AIDL使用自定义类型

    原文首发于微信公众号:jzman-blog,欢迎关注交流! 上篇文章中主要介绍从 AIDL 的使用方式以及 Android 开发中不同进程之间的通信,遗留的问题是如何在 AIDL 中使用自定义类型,具 ...

  5. javascript中的符号 == 和 === 的区别

    ==  表示相等 即仅仅比较两边变量的数值是否相等. 相等运算符隐藏的类型转换,会带来一些违反直觉的结果. 这就是为什么建议尽量不要使用相等运算符. 至于使用相等运算符会不会对后续代码造成意外影响,答 ...

  6. B. The Monster and the Squirrel

    B. The Monster and the Squirrel Ari the monster always wakes up very early with the first ray of the ...

  7. (CSS):last-child与:last-of-type区别

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>la ...

  8. Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty messa

    1.git提交的时候遇到: # Please enter the commit message for your changes. Lines starting with '#' will be ig ...

  9. 【redis】redis

    一.redis简介: 1. reids 也是一个 key-value 存储系统,更加确切地说,它已经是一个非关系型数据库. 2. 关系型. SQL语言. 3. 非关系型. key - value. 4 ...

  10. Java第二十五天,多线程之等待唤醒机制

    当线程被创建并且被启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,而是具有以下多种状态: 这六种状态之间的转换关系如下: 1.等待唤醒机制 注意: (1)两个线程之间必须用同步代码块 ...