Keepalived + Nginx 实现高可用

一、简介

浮动IP、漂移IP地址又叫做VIP,也就是虚拟IP。

Keepalived 是一种高性能的服务器高可用或热备解决方案。
Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。 
keepalived 提供健康检查,故障转移,提高系统的可用性!

二、方案规划

VIPIPNginx端口默认主从
192.168.111.250192.168.111.20180MASTER
192.168.111.250192.168.111.20280BACKUP

master正常的情况下

master宕机的情况下

三、安装Nginx 

# 安装四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -zxvf nginx-1.13.7.tar.gz
cd nginx-1.13.7
./configure --prefix=/usr/local/nginx
make && make install

修改 nginx 首页面内容为节点的ip地址,方便测试观察

vi /usr/local/nginx/html/index.html
<body>
<h1>192.168.111.201</h1>
</body>
<body>
<h1>192.168.111.202</h1>
</body>

启动nginx

cd /usr/local/nginx/sbin/
./nginx

防火墙开启80端口

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

浏览器访问Nginx

http://192.168.111.201
http://192.168.111.202

 

 四、安装 Keepalived

方式一:

如果能联网可以使用yum快速安装:

yum install -y keepalived

方式二: 

可以去keepalived官网直接下载:https://www.keepalived.org/download.html

# 安装依赖
yum -y install gcc openssl openssl-devel libnl libnl-devel  libnfnetlink-devel
# 下载
yum -y install wget
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure --prefix=/usr/local/keepalived
make && make installmkdir /etc/keepalived
cp -p /usr/local/keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf

编辑配置文件

vi /etc/keepalived/keepalived.conf

(1)编辑 MASTER(主)节点配置文件(192.168.111.201)

! Configuration File for keepalived# 全局配置
global_defs {# 路由ID,不能重复,通常为 hostnamerouter_id 192.168.111.201
}# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {# 检测 nginx 状态的脚本路径script "/etc/keepalived/nginx_check.sh"# #每2秒运行一次上面的脚本interval 2# 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70# 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTERweight -20
}# 定义实例
vrrp_instance VI_1 {# 可选值为 MASTER 或者 BACKUPstate MASTER# 网卡名称,与本机 IP 地址所在的网卡名称相同interface ens32# 虚拟路由的ID,MASTER和BACKUP必须是一致的。virtual_router_id 51# 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级priority 100# 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒advert_int 1# 设置验证类型和密码,两个节点必须一致authentication {# 认证方式,此处PASS表示为密码auth_type PASS# 生产环境设置6位随机密码auth_pass 123456}# 设置虚拟IP地址virtual_ipaddress {192.168.111.250}# 执行脚本track_script {# 对应vrrp_script配置的脚本chk_nginx}
}

(2)编辑 BACKUP(备)节点配置文件(192.168.111.202)

! Configuration File for keepalivedglobal_defs {# 路由ID,不能重复,通常为 hostnamerouter_id 192.168.111.202
}vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"interval 2weight -20
}# 定义实例
vrrp_instance VI_1 {# 可选值为 MASTER 或者 BACKUPstate BACKUPinterface ens32virtual_router_id 51# 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级priority 99advert_int 1authentication {auth_type PASSauth_pass 123456}# 设置虚拟IP地址virtual_ipaddress {192.168.111.250}track_script {chk_nginx}
}

(3) 编写 Nginx 状态检测脚本

vi /etc/keepalived/nginx_check.sh

方式一:

如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then# 这里需要替换成自己的nginx安装路径# 尝试重新启动nginx/usr/local/nginx/sbin/nginx# 睡眠2秒sleep 2if [ $A -eq 0 ];then#启动失败,将keepalived服务杀死。killall keepalivedfi
fi

 killall命令默认未安装,会报错 killall: 未找到命令。安装方式如下:

yum install -y psmisc

 方式二: 

如下,返回0或者1。我比较喜欢这种方式。
这里换成其他组件,比如mysql 修改为`pidof mysql` 即可。

#!/bin/bash
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi

给脚本添加执行权限

chmod +x /etc/keepalived/nginx_check.sh

 (4) 开启组播防火墙

centos7放行组播地址224.0.0.18,协议vrrp

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens32 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
# 查看规则是否生效
firewall-cmd --permanent --direct --get-all-rules

--direct:指定将要使用直接规则
--permanent:表示永久生效 ,没有此参数重启后失效
--add-rule ipv4 filter:表示添加一个新的策略
设置一条IPV4规则,表为防火墙表 :filter, 处理输入数据包 INPUT ,0 代表在头部添加。后面就是常用的iptables语法
--in-interface ens32:设置网卡名,这里我的网卡名是ens32
--destination 224.0.0.18:设置目标ip地址,也就是设置放行组播地址224.0.0.18
--protocol vrrp:设置拦截的协议
-j ACCEPT:表示放行,-j DROP表示丢弃(不放行)

(5) 启动 Keepalived

# 启动
systemctl start keepalived.service
# 重启
systemctl restart keepalived.service
# 停止
systemctl stop keepalived.service
# 查看运行状态
systemctl status keepalived
# 查看运行进程
ps -ef|grep keepalived

MASTER(主)节点(192.168.111.201)成功标志

可以看到,192.168.111.201拿到了VIP 192.168.111.250。 

BACKUP(备)节点(192.168.111.202)成功标志

BACKUP上只有192.168.111.202这个ip,正常。
注意:MASTER节点正常的情况下,BACKUP节点一定不会有浮动IP,也就是VIP只能同时在一个节点上。

(6) 验证VIP漂移

我们先关闭Master,验证VIP是否会漂移到BACKUP上。

关闭  MASTER(主)节点(192.168.111.201) 的 keepalived:

systemctl stop keepalived.service

 VIP已经成功飘到BACKUP节点上了

五、Keepalived + Nginx 的高可用测试

访问浮动VIP

http://192.168.111.250

 正常情况下,浮动ip飘到 MASTER(主)节点(192.168.111.201)上,所以访问后显示的主节点的nginx首页

如果杀掉 MASTER(主)节点(192.168.111.201)的 nginx 
如果nginx进程不存在脚本返回1,nginx进程存在脚本返回0

脚本返回0,表示nginx进程存在,由于上面配置的weight为负数,priority 不会改变。

脚本返回1,表示nginx进程不存在,由于上面配置的weight为负数,priority 会减少,减少后的值 priority = priority+weight
失败一次,将自己的优先级-20,我这里MASTER的priority=100,BACKUP的priority=99
那么MASTER要失败1次后变为80,低于BACKUP的99,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER

#!/bin/bash
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi

杀掉 MASTER(主)节点(192.168.111.201)的 nginx 后,再次访问浮动VIP

http://192.168.111.250

六、常见错误

1、keepalived 配置了虚拟ip,发现无法ping 通这个虚拟ip。
解决方法,把配置文件中的 vrrp_strict 给注释掉,重启 keepalived 服务后再次ping就可以了。

2、启动失败、卡住
使用命令 journalctl -xe 查看日志,有这样一行:
Failed to parse PID from file /usr/local/keepalived/var/run/keepalived.pid: Invalid argument
这里因为源码安装的方式,pid文件找不到,使用命令 systemctl status keepalived 查看 load文件路径:loaded (/usr/lib/systemd/system/keepalived.service)
修改/usr/lib/systemd/system/keepalived.service该文件内容:PIDFile=/var/run/keepalived.pid

参考:

keepalived应用:漂移IP的实现_keepalived做ip漂移_Joy_B的博客-CSDN博客

keepalive实战_sending/queueing gratuitous arps_程序员柒叔的博客-CSDN博客

linux防火墙下允许keepalived组播_keepalived 防火墙_老帽爬新坡的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】模板template

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ C       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1f6f0;️欢…

Django之定时任务--apscheduler

Django--定时任务apscheduler的使用 apscheduler定时任务的使用1、安装包2、配置settings.py3、在manage.py的文件同级目录下创建文件scheduler.py4、在项目的urls.py中调用这个定时计划5、然后启动项目 python manage.py runserver,在admin中查看就能看到你的定时任务及执行的…

机器学习算法之-逻辑回归(1)

什么是回归 回归树&#xff0c;随机森林的回归&#xff0c;无一例外他们都是区别于分类算法们&#xff0c;用来处理和预测连续型标签的算法。然而逻辑回归&#xff0c;是一种名为“回归”的线性分类器&#xff0c;其本质是由线性回归变化而来的&#xff0c;一种广泛使用于分类问…

Vue 引入 Element-UI 组件库

Element-UI 官网地址&#xff1a;https://element.eleme.cn/#/zh-CN 完整引入&#xff1a;会将全部组件打包到项目中&#xff0c;导致项目过大&#xff0c;首次加载时间过长。 下载 Element-UI 一、打开项目&#xff0c;安装 Element-UI 组件库。 使用命令&#xff1a; npm …

ArcGIS Maps SDK for JavaScript系列之二:认识Map和MapView

目录 Map创建一个 Map 对象的示例代码&#xff1a;Map的常用属性Map的常用方法 MapViewMapView的常用属性MapView的常用方法 在 ArcGIS Maps SDK for JavaScript 中&#xff0c;Map 和 MapView 是两个重要的概念&#xff0c;用于创建和展示地图应用程序。 Map Map 表示一个地图…

【Rust】Rust学习 第十三章Rust 中的函数式语言功能:迭代器与闭包

Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程&#xff08;functional programming&#xff09;。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 更具体的&#xff0c;我们将要涉及&#…

bert,transformer架构图及面试题

Transformer详解 - mathor atten之后经过一个全连接层残差层归一化 class BertSelfOutput(nn.Module):def __init__(self, config):super().__init__()self.dense nn.Linear(config.hidden_size, config.hidden_size)self.LayerNorm nn.LayerNorm(config.hidden_size, epscon…

redis 发布和订阅

目录 一、简介 二、常用命令 三、示例 一、简介 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 &#xff0c;以及订阅这个频道的三个客户…

前端对文件转换处理的一些常用方法

文章目录 0&#xff0c;前言1&#xff0c;将图片的url网络链接(http://) 转为base64格式2&#xff0c;将base64的图片数据转换为file文件3&#xff0c;将以base64的图片数据转换为Blob4&#xff0c;将file文件转化为base645&#xff0c;将file文件转换为Blob6&#xff0c;获取文…

利用Opencv实现人像迁移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用Opencv实现人像迁移&#xff0c;欢迎大家一起参与探讨交流~ 本文目录&#xff1a; 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…

item_password-获得淘口令真实url

一、接口参数说明&#xff1a; item_password-获得淘口令真实url &#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_password 名称类型必须描述keyString是调用key&#xff08…

tomcat源码修改与编译

1、获取源码 从github下载其源码&#xff1a;https://github.com/apache/tomcat 2、选择版本 切换到对应版本&#xff08;直接用相对应的Git tag即可&#xff09;&#xff1a; git checkout 9.0.793、修改源代码&#xff0c;并且生成补丁 这里我们以修改去掉新版本的ws的检…

129.【Spring 注解 IOC】

Spring 注解 (一)、组件注册1. Configuration 与 Bean 容器注册组件(1).无注解注入方式(2).注解注入方式 2. ComponentScan 自动扫描组件和自动扫描规则(1).无注解扫描方式(2).注解扫描注入方式(3).指定扫描或不扫描的包 (过滤) 3. 自定义TypeFilter指定过滤规则 Filter(1).自定…

QT多屏显示程序

多屏显示的原理其实很好理解&#xff0c;就拿横向扩展来说&#xff1a; 计算机把桌面的 宽度扩展成了 w1&#xff08;屏幕1的宽度&#xff09; w2(屏幕2的宽度) 。 当一个窗口的起始横坐标 > w1&#xff0c;则 他就被显示在第二个屏幕上了。 drm设备可以多用户同时打开&am…

Spring MVC 简介

目录 1. 什么是MVC2. 什么是SpringMVC 1. 什么是MVC MVC是一种常用的软件架构模式。可以看作是一种设计模式&#xff0c;也可以看作是一种软件框架。经典MVC模式中&#xff0c;M是指模型&#xff0c;V是视图&#xff0c;C则是控制器&#xff0c;使用MVC的目的是将M和V的实现代…

golang中使用chan控制协程并发简单事例

func main() {processNum : 5ch : make(chan struct{}, processNum)for true {ch <- struct{}{}go func() {defer func() {<-ch}()fmt.Println("我是协程", time.Now().UnixNano())time.Sleep(time.Second * 5)}()} } 可以看到&#xff0c;这里每5s会执行一次带…

Linux15 消息队列 线程

目录 1、进程间通信IPC&#xff1a; 2、多线程 3、向消息队列中写入数据 4、从消息队列中读取数据 5、多线程&#xff1a; 6、将多线程的数据返回给主…

数据库索引优化策略与性能提升实践

文章目录 什么是数据库索引&#xff1f;为什么需要数据库索引优化&#xff1f;数据库索引优化策略实践案例&#xff1a;索引优化带来的性能提升索引优化规则1. 前导模糊查询不适用索引2. 使用IN优于UNION和OR3. 负向条件查询不适用索引4. 联合索引最左前缀原则5. 范围条件查询右…

【Mysql】MVCC版本机制的多并发

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

PostgreSQL空值的判断

PostgreSQL空值的判断 空值判断非空判断总结 空值判断 -- 查询为空的 is null,sql简写isnull select * from employees where manager_id isnull;select * from employees where manager_id is null;非空判断 -- 查询不为空的 is not null;sql简写notnull select * from empl…