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