keepalived 解决入口机器(Nginx)挂掉的问题
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 过程
主机配置
- 关闭 SELINUX
vim /etc/sysconfig/selinux
- 安装依赖
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
- 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
- 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}
}
- 启动 keepalived
/usr/local/keepalived/sbin/keepalived
- 检查
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 效果
- 杀掉主机上的 keepalived,来模拟服务器宕机,观察 ip addr
主机:
ps -ef|grep keepalived
kill -9 40008
ip addr
发现 ip addr 里设置的 192.168.100.100 没有了
从机:
ip addr
舒服了,这就证明了主机挂掉,192.168.100.100 还是可以用的。这个时候我们使用的就是从机。 - 再次启动主机的 keepalived:
/usr/local/keepalived/sbin/keepalived
查看主机ip addr
:
从机ip addr
:
可以看到,主机启动后,因为优先级高,夺走了虚拟 IP。至此,验证结束。
如果不成功,很可能是配置里空格的问题,可以尝试重新打空格。
keepalived 监控 Nginx
不知道你有没有发现,上面的验证其实存在一个问题:假如主机没有宕机,仅仅是 Nginx 坏掉了呢?
结果是主机的 keepalived 没有结束,192.168.100.100 也访问不到了,虚拟 IP 失去了作用。这个很容易理解,不再演示。
因此,我们需要让 keepalived 监控 Nginx:
主机配置
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
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}
}
仔细看,增加了两处。
/usr/local/keepalived/sbin/keepalived
检查:
停止 Nginx:nginx -s stop
查看进程:ps -ef|grep nginx
从机配置
改的地方和主机一样
双主模式 充分利用从机
经过上面的所有配置之后,最前端 Nginx 挂掉的问题就已经解决了。可还有一个小问题:如果主机不宕机,从机会一直处于一个开机但无事可做的状态。我们可以充分利用从机吗?
当然可以。我们可以以从机作为主机,以从机作为主机,再配置一套 vrrp_instance。
当然这样就会出现新的 IP 地址,就要出现新的域名,你可以拿这台机器做其他的事。
你也可以让 DNS 轮询这两个 VIP,这样两台机器任意挂掉一台,两个 VIP 都是有效的,用户端不会因为访问挂掉的机器而获取不到资源。
在 MVVM 模式中的应用
keepalived 解决入口机器(Nginx)挂掉的问题相关推荐
- 解决thinkphp在nginx环境中由于PATH_INFO变量引起的路径问题
最近一个项目使用了thinkphp3.2作为开发框架,路由方面开启了PATHINFO模式,但是nginx默认是不支持PATHINFO的,表现为$_SERVER['PATH_INFO']没有值 在apa ...
- 【记录】解决uni-app 用nginx反向代理出现Invalid Host header问题
[记录]解决uni-app 用nginx反向代理出现Invalid Host header问题 参考文章: (1)[记录]解决uni-app 用nginx反向代理出现Invalid Host head ...
- 解决django配合nginx部署后admin样式丢失
解决django配合nginx部署后admin样式丢失 1. 在项目的settings.py文件里添加以下内容: STATIC_URL = '/static/' STATICFILES_DIRS = ...
- win10安装宝塔面板nginx开启pathinfo模式无效的解决办法(解决tp5在nginx上除首页以外全部404的问题)
win10安装宝塔Windows面板7.5.0版本+php7+NGINX,安装 thinkphp 框架时pathinfo模式无效,这导致所有依赖 PATH_INFO的PHP框架,路由都是404(宝塔官 ...
- nginx做负载均衡,解决多机器多gpu卡服务对外暴露一个接口问题
思路:多个gpu 服务接口-->ngxin做负载均衡-->对外暴露一个. 以一机两卡为例,其中gunicorn部署一卡多进程服务参考这篇文章 一.制作nginx负载均衡镜像 1.制作Doc ...
- keepalived实现高可用nginx反向代理(Web集群)
一.代理服务器概述 代理服务可简单的分为正向代理和反向代理: 1)正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务 ...
- 解决 phpStudyv8.0 Nginx 404 Not Found
1.第一次使用phpStudy v8.0,感觉还是蛮好用的,首先看看这个报错! 这个报错,如果访问路径没毛病,确认项目的入口文件配置的问题,然后修改vhost.conf文件,当然这是是phpStudy ...
- keepalived主从模式监测nginx
一.环境说明 VirtualBox6.1 CenOS7 Nginx keepalived-1.1.20.tar.gz 二.IP配置 主Keepalived服务器IP地址:10.0.2.4 备Keepa ...
- keepalived实现高可用nginx反向代理的简单案例
写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 案例拓扑图 安装keepalived和nginx 安装keepalived # yum -y in ...
最新文章
- linux18.04安装显卡驱动,详细介绍ubuntu18.04安装NVIDIA显卡驱动(亲测有效!)
- sap abap好用的函数
- CF888G XOR-MST 最小异或生成树
- 好的程序员就应该有强迫症
- 计算(a+b)*c的值(信息学奥赛一本通-T1007)
- advisor matlab,advisor在matlab
- 高效实用Kafka-Kafka是什么
- python修复不了_python-如何修复cm.spectral(模块“ matplotlib.cm”...
- chrome浏览器再次打开黑屏一段时间
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_12-删除页面-服务端-接口开发...
- Python实现股票数据接口
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java新华书店o2o服务系统89nml
- win7自带截屏便签 打开命令
- vue3+TDesign实现表格序号递增(t-table)
- java 传参数报文给and_技术岛-技术改变生活
- 多卡聚合路由器和普通路由器的区别
- 非线性方程的数值解法:正割法 python
- yarn : 无法加载文件 D:\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本。
- 使用dd命令测试CPU性能--用Enki学Linux系列(16)
- Windows 使用 Alias,高效办公指南