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

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知多少系列之(二)安装》
《.NET Core项目部署到Linux(Centos7)(四)VMware Workstation虚拟机Centos 7安装》
《.NET Core项目部署到Linux(Centos7)(三)创建.NET Core API项目》
《.NET Core项目部署到Linux(Centos7)(六)发布.NET Core 项目到Linux》
《.NET Core项目部署到Linux(Centos7)(七)启动和停止.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

作者:江远良
出处:http://www.cnblogs.com/jayjiang/

上一篇:带你读《重构数字战斗力: 中小企业的数字化转型之路》第二章电子电气企业覆盖 “全渠道—研发—经营—制造” 全价值链的上云之路案例6(三)


下一篇:从零开始使用nginx系列(1)部署前端项目