Keepalived + Nginx 实现高可用

news2025/1/24 14:38:58

一、简介

浮动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 install

mkdir /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,不能重复,通常为 hostname
   router_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节点升级为MASTER
    weight -20
}

# 定义实例
vrrp_instance VI_1 {
    # 可选值为 MASTER 或者 BACKUP
    state MASTER
    # 网卡名称,与本机 IP 地址所在的网卡名称相同
    interface ens32
    # 虚拟路由的ID,MASTER和BACKUP必须是一致的。
    virtual_router_id 51
    # 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
    priority 100
    # 本机ip
    unicast_src_ip 192.168.111.201
    # 设定 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 keepalived

global_defs {
   # 路由ID,不能重复,通常为 hostname
   router_id 192.168.111.202
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

# 定义实例
vrrp_instance VI_1 {
    # 可选值为 MASTER 或者 BACKUP
    state BACKUP
    interface ens32
    virtual_router_id 51
    # 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
    priority 99
    # 本机ip
    unicast_src_ip 192.168.111.202
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }

    # 设置虚拟IP地址
    virtual_ipaddress {
        192.168.111.250
    }

    track_script {
        chk_nginx
    }
}

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

方式一:

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

vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
    # 这里需要替换成自己的nginx安装路径
    # 尝试重新启动nginx
    /usr/local/nginx/sbin/nginx
    # 睡眠2秒
    sleep 2
    if [ $A -eq 0 ];then
        #启动失败,将keepalived服务杀死。
        killall keepalived
    fi
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}" ];
then
  exit 0
else
  exit 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 发现间隔2秒后 nginx 被脚本启动起来了,这里方便测试,先把启动的命令注释掉

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
    # 这里需要替换成自己的nginx安装路径
    # 尝试重新启动nginx
    # /usr/local/nginx/sbin/nginx
    echo "打印日志111"
    # 睡眠2秒
    sleep 2
    if [ $A -eq 0 ];then
        echo "打印日志222"
        #启动失败,将keepalived服务杀死。
        killall keepalived
    fi
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.coloradmin.cn/o/894691.html

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

相关文章

批量删除文件名前的数字编号?

批量删除文件名前的数字编号&#xff1f;如果你在网上经常下载文件&#xff0c;你会发现下载的文件名称前面一般都会有很的数字编号&#xff0c;这些数字编号有时候会非常的长&#xff0c;导致文件的名称也非常的长&#xff0c;这样对于文件的管理和查找使用是不利的。所以为了…

推荐一个绘图平台(可替代Visio)

不废话&#xff0c;简易记网址&#xff1a; draw.io 网站会重定向到&#xff1a;https://app.diagrams.net/

LeetCode 141.环形链表

文章目录 &#x1f4a1;题目分析&#x1f4a1;解题思路&#x1f514;接口源码&#x1f4a1;深度思考❓思考1❓思考2 题目链接&#x1f449; LeetCode 141.环形链表&#x1f448; &#x1f4a1;题目分析 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中…

XDocReport文书生成总结

最近弄一个业务需要搞很多的word文档导出&#xff0c;供前端下载。之前的实现方式一般是先把word转成XML格式&#xff0c;然后赋值变量&#xff0c;这种方式虽然可行&#xff0c;但是遇到那种长篇且变量又多的文档&#xff0c;就很让人头大&#xff0c;密密麻麻的一堆代码&…

Spring-3-Spring AOP概念全面解析

今日目标 能够理解AOP的作用 能够完成AOP的入门案例 能够理解AOP的工作流程 能够说出AOP的五种通知类型 一、AOP 1 AOP简介 思考&#xff1a;什么是AOP,AOP的作用是什么&#xff1f; 1.1 AOP简介和作用【理解】 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一…

Windows系统修改域名DNS指向两种方式

一、直接打开对应文件进行修改 1、进入hosts文件目录&#xff1a;C:\Windows\System32\drivers\etc 2、右键打开HOSTS文件进行编辑&#xff0c;将需要对应的域名和IP地址进行配置 编写完成后 Ctrl s 进行保存即可。 二、使用DOS命令进行修改 1、按住键盘win键 r 打开命令…

设计师必备的5个PNG免抠素材网站,简直不要太好用~

广大设计师们是不是经常要用免抠素材的时候网上找的质量差&#xff0c;还要各种付费才能使用&#xff0c;最后只能打开PS慢慢的扣&#xff0c;真的很费时间。本期我就给大家推荐5个高质量、免费的免抠素材网站&#xff0c;有需要的朋友们赶紧收藏。 菜鸟图库 https://www.suc…

2021年3月全国计算机等级考试真题(C语言二级)

2021年3月全国计算机等级考试真题&#xff08;C语言二级&#xff09; 第1题 算法空间复杂度的度量方法是&#xff08;&#xff09; A. 算法程序的长度 B. 算法所处理的数据量 C. 执行算法所需要的工作单元 D. 执行算法所需要的存储空间 正确答案&#xff1a;D 第2题 下列叙…

wangEditor修改节点数据

前言 wangEditor简介 wangEditor 是一款基于 JavaScript 和 jQuery 的开源富文本编辑器&#xff0c;具有简单易用、功能丰富的特点。它提供了一整套的富文本编辑功能&#xff0c;包括文字样式设置、插入图片、插入表格、插入链接、代码块等。wangEditor 支持多种浏览器&#x…

大数据时代下的数据中心运维管理

摘要&#xff1a;本文将从数据中心运维管理的角度&#xff0c;联系现实情况&#xff0c;对运维管理进行研究&#xff0c;期望通过本项目的研究&#xff0c;显著提升数据中心运维治理的整体质量。这样&#xff0c;才能充分发挥大数据的价值&#xff0c;并推动企业加速发展。 关…

将nginx内存池代码单独编译运行,了解nginx内存池工作原理,附代码

初识nginx——内存池篇 https://www.cnblogs.com/magicsoar/p/6040238.html 为了自身使用的方便&#xff0c;Nginx封装了很多有用的数据结构&#xff0c;比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等&#xff0c;对于内存池&#xff0c;nginx设计的十分精炼&#xff0c;值得我…

揭秘亚马逊广告运作:了解逻辑,事半功倍的广告成功!

亚马逊广告的多重形式亚马逊为卖家提供了多种广告形式&#xff0c;用于在平台上展示并推广产品。以下是亚马逊广告的主要形式&#xff1a; 1.Sponsored Products&#xff1a; 这是常见的广告类型&#xff0c;允许产品在搜索结果和产品页面中显示。广告与自然搜索结果相似&…

23款奔驰GLE450豪华型桃木方向盘,提升方向盘握感

桃木是目前国内各级车型中最为主流的木饰&#xff0c;虽然看起来一样&#xff0c;但是多数低端车型中配备的并非实木&#xff0c;而是由聚酯材料制成的仿桃木。其实我们这里所说的“桃木”也并非我们所熟知的那个可以结桃子的果树&#xff0c;而是胡桃木或是核桃木。胡桃木原产…

算法通关村第八关——轻松搞定翻转二叉树

二叉树有很多经典算法题&#xff0c;今天我们就来看一下二叉树里的翻转问题。 力扣226,给了一棵二叉树&#xff0c;要将二叉树整体翻转。 分析&#xff1a;观察图中翻转前后的二叉树&#xff0c;我们不难发现&#xff0c;翻转过程中&#xff0c;只需要把每一个节点的左右子节点…

13. Vuepress2.x 部署站点的基础路径从配置文件中读取

收到需求&#xff0c;站点要部署到 非根路径 下&#xff0c;且将来会根据 版本号 区分不同的基础路径。需要从统一的文件中读取&#xff0c;方便其它 js 文件和 config.js 配置统一读取。 目录 docs\.vuepress\public\cfg\ 下新建文件 version.js&#xff0c;内容如下 const P…

cmake扩展(5)——file命令排除部分文件

在cmake中可以使用file命令获取需要的文件&#xff0c;并且支持正则/通配符&#xff0c;使用起来还是很方便的。 #语法file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])#example file(GLOB_RECURSE SOURCES "src/*.h" "src/*.cp…

如何计算 SDK 占用的 CPU 算力值(DMIPS)

什么是 DMIPS &#xff1f; 网上搜了些 DMIPS 的相关材料&#xff0c;知道它是用来评价 CPU 运算能力的一个指标。其中在知乎上有人介绍这个概念&#xff0c;是自动驾驶芯片性能常用的评价指标&#xff08;自动驾驶芯片性能评价指标:DMIPS,TOPS - 知乎&#xff09;。 如何计算…

CSS如何将浏览器文字设置小于12px

CSS如何将浏览器文字设置小于12px 使用transform: scale进行缩放 transform: scale(0.8);<div><p class"first">第一段文字</p><p class"second">第二段文字</p> </div>.first {font-size: 12px; }.second {font-si…

SeleniumIDE用例录制

1、录制回放方式的稳定性和可靠性有限 2、只支持 Firefox、Chrome 3、对于复杂的页面逻辑其处理能力有限 环境准备 Chrome 插件&#xff1a;https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd Firefox 插件&#xff1a;Selenium IDE …

Java课题笔记~ SpringBoot简介

1. 入门案例 问题导入 SpringMVC的HelloWord程序大家还记得吗&#xff1f; SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程 原生开发SpringMVC程序过程 1.1 入门案例开发步骤 ①&#xff1a;创建新模块&#…