keepalived 解决入口机器(Nginx)挂掉的问题

  • 问题来源
  • DNS 轮询解决
  • LVS 解决思路
  • keepalived 配置 LVS 过程
    • 主机配置
    • 从机配置
  • 检验 keepalived 的 LVS 效果
  • keepalived 监控 Nginx
    • 主机配置
    • 从机配置
  • 双主模式 充分利用从机
  • 在 MVVM 模式中的应用

问题来源

我们有很多 Tomcat 服务器交由 Nginx 管理,可 Nginx 所在的这台机器挂了怎么办?

你可能会想到再来 2 台 Nginx 机器,一台与之前的 Nginx 并行,一台来作为最前端的网关管理这两台机器。如下图,这样中间两台机器宕机任意一个也没事。可最前端的 Nginx 也有可能挂掉,这怎么办?还是没解决问题。

DNS 轮询解决

有人可能会想到 DNS 轮询的方式:相同的服务,不同的机器配置同一个域名,让 DNS 轮询。这样不仅挂掉一台机器不会导致整个系统宕机,还做了一个简单的负载均衡。

但这样也有缺点:

1、可靠性低
如果其中的一台服务器发生故障,DNS服务器是无法知晓的,仍旧会将访问分配到此服务器。那么所有恰好访问该服务器的请求将不会有所回应。即使从 DNS 中去掉该服务器的IP,但在 Internet 上,各地区电信、网通等宽带接入商将众多的DNS存放在缓存中,以节省访问时间,DNS 更新生效需要几个小时,甚至更久。

2、负载分配不均匀
DNS负载均衡采用的是简单的轮询算法,不能区分服务器的差异,不能反映服务器的当前运行状态,不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。
用户本地计算机会缓存已解析的域名到 IP 地址的映射。当多个用户计算机都缓存了域名到某个 IP 地址的映射时,而这些用户又继续访问该域名下的网页,这时就会导致不同Web服务器间的负载分配不均匀。
负载不均匀可能导致的后果有:某几台服务器负荷很低,而另几台服务器负载很高、处理缓慢。负荷高的服务器一旦宕机,那么由于第 1 点,整个系统可能会出大量用户访问不到的情况。

LVS 解决思路

上面的问题所在的根本,其实就是最前端的机器是物理机器,物理机器是可能用着用着就挂掉的。但如果最前端的机器是一个虚拟机器呢?

从上图可以看到,我们用一个虚拟 IP 作为用户访问的入口,所以它自身就不存在挂掉的问题了。除非它后面的两台 Nginx 同时挂掉。这样就解决了之前的问题。这就是 LVS 的思路。

LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。
它和 Nginx 没有直接的关系,它针对的是 Linux。

keepalived 配置 LVS 过程

主机配置

  1. 关闭 SELINUX
    vim /etc/sysconfig/selinux
  2. 安装依赖
    yum -y install libnl libnl-devel libnfnetlink-devel
    你可能还需要的依赖,这些都是 Nginx 的依赖:
yum -y install autoconf automake make
yum -y install gcc gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum install -y openssl openssl-devel
  1. keepalived 安装
    下载源码包:wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
    解压:tar -zxvf keepalived-1.3.4.tar.gz
    进入文件夹:cd keepalived-1.3.4
    配置(指定安装目录和配置目录):./configure --prefix=/usr/local/keepalived --sysconf=/etc

    编译并安装:make && make install
  2. keepalived 主机配置
    打开配置:vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {#标识当前 keepalived 机器router_id LVS_DEVEL
}  vrrp_instance VI_1 {#状态,只能有一个是MASTER,余下的都应该为BACKUP。#这里只是一个标识,起不到真正的作用,主机写 BACKUP 也可以,决定主从的是下面的优先级state MASTER#网卡名字,可以用ip addr查看interface ens33#当前机器组的 id,范围是0-255virtual_router_id 51#优先级,范围1-254priority 100#心跳频率,vrrp协议通告间隔advert_int 1#授权,无需改动authentication {auth_type PASSauth_pass 1111}   #虚拟IP,一个就可以,要多个就换行写virtual_ipaddress {192.168.100.100}
}
  1. 启动 keepalived
    /usr/local/keepalived/sbin/keepalived
  2. 检查
    ip addr

    nginx


虚拟 IP 也可以访问

从机配置

相同的步骤不重复,只有第 4 步不同:

! Configuration File for keepalivedglobal_defs {#标识当前 keepalived 机器router_id LVS_2
}vrrp_instance VI_1 {state BACKUP#网卡名字,可以用ip addr查看interface ens33#当前机器组的 id,和主机一样virtual_router_id 51#优先级,比主机小priority 80#心跳频率,vrrp协议通告间隔advert_int 1#授权,无需改动authentication {auth_type PASSauth_pass 1111}#虚拟IP,和主机一样virtual_ipaddress {192.168.100.100}
}


从机的 ip addr 并无变化

检验 keepalived 的 LVS 效果

  1. 杀掉主机上的 keepalived,来模拟服务器宕机,观察 ip addr
    主机:
    ps -ef|grep keepalived

    kill -9 40008
    ip addr

    发现 ip addr 里设置的 192.168.100.100 没有了
    从机:
    ip addr

    舒服了,这就证明了主机挂掉,192.168.100.100 还是可以用的。这个时候我们使用的就是从机。
  2. 再次启动主机的 keepalived:
    /usr/local/keepalived/sbin/keepalived
    查看主机 ip addr

    从机 ip addr

    可以看到,主机启动后,因为优先级高,夺走了虚拟 IP。至此,验证结束。
    如果不成功,很可能是配置里空格的问题,可以尝试重新打空格。

keepalived 监控 Nginx

不知道你有没有发现,上面的验证其实存在一个问题:假如主机没有宕机,仅仅是 Nginx 坏掉了呢?
结果是主机的 keepalived 没有结束,192.168.100.100 也访问不到了,虚拟 IP 失去了作用。这个很容易理解,不再演示。

因此,我们需要让 keepalived 监控 Nginx:

主机配置

  1. vim /etc/nginx/chk_nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`  #统计 nginx 进程数
if [ $A -eq 0 ];then                #若为0,表明 nginx 被杀,然后/usr/local/openresty/nginx/sbin/nginx                #重启 nginx,我这里装的是 openrestyif [ $A -eq 0 ];then   #如果 nginx 重启失败killall keepalived    #杀掉 keepalivedfi
fi
  1. vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL
}
vrrp_script chk_http_port {script "/etc/nginx/chk_nginx.sh"interval 2weight 2
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 200advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_http_port}virtual_ipaddress {192.168.100.100}
}

仔细看,增加了两处。

  1. /usr/local/keepalived/sbin/keepalived

检查
停止 Nginx:nginx -s stop
查看进程:ps -ef|grep nginx

从机配置

改的地方和主机一样

双主模式 充分利用从机

经过上面的所有配置之后,最前端 Nginx 挂掉的问题就已经解决了。可还有一个小问题:如果主机不宕机,从机会一直处于一个开机但无事可做的状态。我们可以充分利用从机吗?

当然可以。我们可以以从机作为主机,以从机作为主机,再配置一套 vrrp_instance。

当然这样就会出现新的 IP 地址,就要出现新的域名,你可以拿这台机器做其他的事。

你也可以让 DNS 轮询这两个 VIP,这样两台机器任意挂掉一台,两个 VIP 都是有效的,用户端不会因为访问挂掉的机器而获取不到资源。

在 MVVM 模式中的应用

keepalived 解决入口机器(Nginx)挂掉的问题相关推荐

  1. 解决thinkphp在nginx环境中由于PATH_INFO变量引起的路径问题

    最近一个项目使用了thinkphp3.2作为开发框架,路由方面开启了PATHINFO模式,但是nginx默认是不支持PATHINFO的,表现为$_SERVER['PATH_INFO']没有值 在apa ...

  2. 【记录】解决uni-app 用nginx反向代理出现Invalid Host header问题

    [记录]解决uni-app 用nginx反向代理出现Invalid Host header问题 参考文章: (1)[记录]解决uni-app 用nginx反向代理出现Invalid Host head ...

  3. 解决django配合nginx部署后admin样式丢失

    解决django配合nginx部署后admin样式丢失 1.  在项目的settings.py文件里添加以下内容: STATIC_URL = '/static/' STATICFILES_DIRS = ...

  4. win10安装宝塔面板nginx开启pathinfo模式无效的解决办法(解决tp5在nginx上除首页以外全部404的问题)

    win10安装宝塔Windows面板7.5.0版本+php7+NGINX,安装 thinkphp 框架时pathinfo模式无效,这导致所有依赖 PATH_INFO的PHP框架,路由都是404(宝塔官 ...

  5. nginx做负载均衡,解决多机器多gpu卡服务对外暴露一个接口问题

    思路:多个gpu 服务接口-->ngxin做负载均衡-->对外暴露一个. 以一机两卡为例,其中gunicorn部署一卡多进程服务参考这篇文章 一.制作nginx负载均衡镜像 1.制作Doc ...

  6. keepalived实现高可用nginx反向代理(Web集群)

    一.代理服务器概述 代理服务可简单的分为正向代理和反向代理: 1)正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务 ...

  7. 解决 phpStudyv8.0 Nginx 404 Not Found

    1.第一次使用phpStudy v8.0,感觉还是蛮好用的,首先看看这个报错! 这个报错,如果访问路径没毛病,确认项目的入口文件配置的问题,然后修改vhost.conf文件,当然这是是phpStudy ...

  8. keepalived主从模式监测nginx

    一.环境说明 VirtualBox6.1 CenOS7 Nginx keepalived-1.1.20.tar.gz 二.IP配置 主Keepalived服务器IP地址:10.0.2.4 备Keepa ...

  9. keepalived实现高可用nginx反向代理的简单案例

    写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 案例拓扑图 安装keepalived和nginx 安装keepalived # yum -y in ...

最新文章

  1. linux18.04安装显卡驱动,详细介绍ubuntu18.04安装NVIDIA显卡驱动(亲测有效!)
  2. sap abap好用的函数
  3. CF888G XOR-MST 最小异或生成树
  4. 好的程序员就应该有强迫症
  5. 计算(a+b)*c的值(信息学奥赛一本通-T1007)
  6. advisor matlab,advisor在matlab
  7. 高效实用Kafka-Kafka是什么
  8. python修复不了_python-如何修复cm.spectral(模块“ matplotlib.cm”...
  9. chrome浏览器再次打开黑屏一段时间
  10. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_12-删除页面-服务端-接口开发...
  11. Python实现股票数据接口
  12. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java新华书店o2o服务系统89nml
  13. win7自带截屏便签 打开命令
  14. vue3+TDesign实现表格序号递增(t-table)
  15. java 传参数报文给and_技术岛-技术改变生活
  16. 多卡聚合路由器和普通路由器的区别
  17. 非线性方程的数值解法:正割法 python
  18. yarn : 无法加载文件 D:\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本。
  19. 使用dd命令测试CPU性能--用Enki学Linux系列(16)
  20. Windows 使用 Alias,高效办公指南

热门文章

  1. Android判断是否安装某个应用
  2. 医院集成平台超融合基础架构转型方案
  3. Java程序设计复习笔记 | 超详细
  4. 利用背景图片生成词云
  5. 微信小程序-画板工具实现
  6. Inno Setup 打包脚本笔记
  7. 污水处理程序 工厂污水处理控制系统。 西门子PLC200smart和上位机wincc(版本号V7.4)污水处理控制系统
  8. ZYNQ7000平台介绍
  9. C#读写西门子PLC中英文字符串数据的学习笔记
  10. 蓝牙学习七(MAC地址)