Keepalived+Nginx实现高可用(上)

一、背景与简介

        为了服务的高可用性,避免单点故障问题,通常我们使用"冗余设计思想"进行架构设计。冗余设计思想,本质就是将同一个应用或者服务放置在多台不同的服务器上[鸡蛋不放在同一个篮子里],这样减少整体服务宕机的可能性。我们通过概率学就能简单知道,例如一台服务器宕机的概率为1%,那么2台一样的机器同时宕机的概率就是0.01x0.01=0.01%, 依次类推,冗余的服务器越多,那么整体服务宕机的可能性就越小。  但是高可用和成本成正比关系,一个服务的可用性越高,付出的成本越高。

        通常在应用的业务部署中间件中,Nginx扮演着反向代理与流量分发的角色。 例如之前我所在的公司将服务部署在本地IDC机房,整体对外、对内的流量都是经过Nginx作为网关入口。 如果Nginx存在单点问题,所在的服务器一旦发生宕机或者整个Nginx服务不可用,那么对业务的影响是致命的。

        所以我们需要保证Nginx入口网关的高可用性。  我们学过一种编程思想:  面向抽象编程。 在这里,我们可以将要暴露Nginx网关服务的IP给到客户端的是VIP(Virtual IP)而非实际代理的物理IP。 我们将多个提供服务的物理IP形成一个逻辑IP组。VIP是一个虚拟IP(抽象层), VIP会时刻只对应一个物理IP, 一旦对应的物理IP发生故障,则可以漂移到这个逻辑IP组内健康的物理IP, 从而实现客户端无感故障迁移(客户端无效更改VIP地址,同时这个过程对于客户端而言是无感知的、透明的),实现服务的高可用。

        架构图如下:

        DNS服务器直接将域名绑定A记录指向VIP地址: 172.20.0.110, 客户端通过域名进行访问Nginx网关服务即可,后面Nginx网关服务无论是升级、故障转移等等,客户端无须修改域名或者代码,实现Nginx网关服务高可用以及无感故障转移。

二、开源组件Keepalived

1、基本介绍

        很幸运的是要实现上述的Nginx网关服务高可用问题,开源界有一个成熟的、可靠的中间件就是keepalived。

        网上资料是这么介绍keepalived: 

        Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

        Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

        所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

2、总结概括

        Keepalived是一个通过VRRP网络协议、提供VIP漂移技术来实现冗余高可用设计的一个开源中间件。 

        通过合理的配置Keepalived我们就可以实现服务的高可用。

三、案例实验

1、实验的目标以及实验环境

      本次实验都是基于docker-compose实现.

       设计有2个容器(2台服务器),分别是172.20.0.2作为主服务器、172.20.0.3作为备用服务器,  服务器上都部署了Nginx服务, 我们需要要暴露这个服务给到其他客户端提供一个VIP。  后面测试主服务器宕机的时候,访问VIP是否访问到了172.20.0.3的页面。等主服务器又恢复正常的时候,访问VIP是否访问到的是172.20.0.2的页面。

        Dockerfile内容如下:

FROM centos:7
RUN yum update -y
USER root
RUN yum install epel-release -y
RUN yum update -y
RUN yum install nginx keepalived -y
RUN yum install vim net-tools iproute -y

         运行的目录结构如下:

        docker-compose.yaml内容如下:

version: "3"
services:nginx-master:  # 172.20.0.2build:context: ./docker/working_dir: "/root/"privileged: truehostname: "nginx-master"expose:- 80entrypoint: ["tail", "-f", "/dev/null"]nginx-backup:  # 172.20.0.3build:context: ./docker/working_dir: "/root/"privileged: truehostname: "nginx-backup"expose:- 80entrypoint: [ "tail", "-f", "/dev/null" ]

        运行着2个容器, 执行docker-compose up -d --build

2、测试两个容器显示的页面内容

        在宿主机上执行curl命令,分别curl 2个IP查看返回Nginx提供的页面内容:

3、配置nginx-master容器(172.20.0.2)的keepalived.conf

  文件位于/etc/keepalived/keepalived.conf

global_defs {#keepalived节点唯一ID标识名称router_id keep_02       
}vrrp_instance VI_1 {#节点角色: MASTER、BACKUPstate MASTER            #绑定VIP的网卡名称interface eth0          #虚拟路由ID组, 备用节点和主节点必须属于同一个组virtual_router_id  172  #节点优先级, 取值范围 0-255, 主节点的优先级要大于备用节点priority  100           #主备同步检查时间间隔advert_int  1           #认证信息,主备一致authentication {        auth_type PASSauth_pass 1234}#VIP地址virtual_ipaddress {172.20.0.110     }
}

 启动keepalived:  

keepalived -n -l  # -n 前台运行  -l 显示运行日志

 此时查看ip addr:   可以看到VIP  172.20.0.110 已经绑定在eth0网卡上了

  宿主机此时curl 172.20.0.110得到结果是绑定在了master主节点的内容:

 

4、配置nginx-backup容器(172.20.0.3)的keepalived.conf

global_defs {#keepalived节点唯一ID标识名称router_id keep_03       
}vrrp_instance VI_1 {#节点角色: MASTER、BACKUPstate BACKUP           #绑定VIP的网卡名称interface eth0          #虚拟路由ID组, 备用节点和主节点必须属于同一个组virtual_router_id  172  #节点优先级, 取值范围 0-255, 主节点的优先级要大于备用节点priority  90          #主备同步检查时间间隔advert_int  1           #认证信息,主备一致authentication {        auth_type PASSauth_pass 1234}#VIP地址virtual_ipaddress {172.20.0.110     }
}

  启动keepalived:

keepalived -n -l  # -n 前台运行  -l 显示运行日志

  ​

此时查看: ip addr     主节点keepalived还正常运行,自然备用节点拿不到VIP

5、模拟主节点故障,手动关闭keepalived

此时在宿主机访问VIP  curl  172.20.0.110:

        此时我们看到,同样是访问VIP地址, 第4步骤访问的时候返回的是master: 172.20.0.2, 但是我们手动关闭主节点的keepalived进程模拟故障的时候, 再次curl VIP地址, 访问得到的内容就是backup: 172.20.0.3 。 

        此时已经发生故障转移了,但是客户端访问的VIP没发生变化,我们在宿主机上执行的curl命令一模一样,但是返回的内容不一样了(实际情况来说,没出故障前以及出故障之后,得到的AIP的内容应该是一致的。 只是在这里做演示,让大家看情况故障转移过程,所以故意让返回的页面内容存在差异,容易对比)

6、模拟恢复主节点故障,启动keepalived进程

        此时我们再次访问curl VIP :  curl 172.20.0.110, 得到的内容又是master: 172.20.0.110, VIP已经实现了故障转移(IP漂移)

四、 总结

        整个测试流程还算简单、清晰的。  我们使用keepalived要注意几点:

                1、主节点、备用节点要属于同一个广播域,也就是同一个交换机下

                2、启动keepalived默认是后台运行,启动后进入后台。但是为了更好调试错误加入了-n参数进行前台运行, 为了显示日志便于排错又增加了-l参数。  所以整体参数是

keepalived -n -l

                3、通过ip addr查看VIP代替ifconfig, ifconfig有时候是看不到VIP的存在,只看到了物理IP的存在

        那使用Keepalived上述过程,就能确保服务高正无忧、毫无缺点了么?  其实不尽然。

        1、大家会发现VIP时刻只会漂移到一个物理IP上,那么BACKUP备用节点都处于闲置状态,是不是太浪费资源了呢?

        2、IP漂移或者不漂移是通过Keepalived进程是否存活来决定的。 那么如果存在一种情况就是Keepalived进程存活,此时拿到了VIP,但是Nginx挂了, 那本质上就是VIP拿到了占着茅坑不拉屎,整个服务都挂了。这种情况又该如何处理IP及时漂移到可用Nginx节点来达到高可用的目的呢?  

        预知后事如何,请听下回分解~

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

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

相关文章

基于大语言模型的复杂任务认知推理算法CogTree

近日,阿里云人工智能平台PAI与华东师范大学张伟教授团队合作在自然语言处理顶级会议EMNLP2023上发表了基于认知理论所衍生的CogTree认知树生成式语言模型。通过两个系统:直觉系统和反思系统来模仿人类产生认知的过程。直觉系统负责产生原始问题的多个分解…

低功耗模式的通用 MCU ACM32F0X0 系列,具有高整合度、高抗干扰、 高可靠性的特点

ACM32F0X0 系列是一款支持多种低功耗模式的通用 MCU。集成 12 位 1.6 Msps 高精度 ADC 以及比 较器、运放、触控按键控制器、段式 LCD 控制器,内置高性能定时器、多路 UART、LPUART、SPI、I2C 等丰富的通讯外设,内建 AES、TRNG 等信息安全模块&#xff0…

kubeadm搭建单master多node的k8s集群--小白文,图文教程

参考文献 K8S基础知识与集群搭建 kubeadm搭建单master多node的k8s集群—主要参考这个博客,但是有坑,故贴出我自己的过程,坑会少很多 注意: 集群配置是:一台master:zabbixagent-k8smaster,两台…

C++类和对象——(10)综合示例

一、示例对象数组&#xff1a; #include<iostream> using namespace std;class Point{private:int x,y;public:Point(int px0,int py0){xpx;ypy;}void init(int px0,int py0){xpx;ypy;}void print(){cout<<"("<<x<<","<<y…

JVM-GC调优-字节码篇-01

笔记来源&#xff1a;JVM 注意&#xff1a;实在想学习可以看一下&#xff0c;让自己更加了解JVM&#xff0c;看起来可能会枯燥。 JVM-概述 1、你的问题 1.1你被JVM伤害过吗&#xff1f; 你是否也遇到过这些问题&#xff1f; 运行着的线上系统突然卡死&#xff0c;系统无法访…

Centos7云服务器上安装cobalt_strike_4.7。附cobalt_strike_4.7安装包

环境这里是阿里的一台Centos7系统。 开始安装之前首先要确保自己安装了java11及以上环境。 安装java11步骤&#xff1a; sudo yum update sudo yum install java-11-openjdk-devel把服务器端&#xff08;CS工具分服务器端和客户端&#xff09;的CS安装到服务器上后给目录下的…

某省资源交易中心 (js逆向)

该文章只是用于逆向学习&#xff0c;不得以商用或者是破坏他人利益的目的进行使用。如有侵权请联系作者。 网站链接&#xff1a; bse64 aHR0cHM6Ly9nZ3p5ZncuZnVqaWFuLmdvdi5jbi9idXNpbmVzcy9saXN0Lw 分析环节 进入网站 进行翻页请求时我们会发现改请求时ajax请求。 这里&…

hive-窗口函数

1 窗口函数语法 分析函数/专用窗口函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用的分析函数 常用的分析函数&#xff1a;sum()、max()、min()、avg()、count() 常用的专用窗口函数 专用窗口函数&#xff1a;row_number()、rank()、dens…

【简易版】Linux下Protobuf 实现网络版通讯录--C++

一、介绍 该项目的主要目的是用于熟悉protobuf的使用&#xff0c;体验数据在网络中序列化反序列化的形式&#xff0c;并非一个完整的项目。 该通讯录只实现了增加联系人的功能。服务器端接收到请求后会将联系人的信息打印。 二、环境搭建 使用Httplib库&#xff0c;可以快速…

jsp文件引用的css修改后刷新不生效问题

问题 在对 JavaWeb 项目修改的过程中&#xff0c;发现修改了 jsp 文件引入的 css 文件的代码后页面的样式没有更新的问题。 原因 导致这个问题的原因可能是因为浏览器缓存的问题。 解决方法 下面介绍两种解决方法&#xff0c;供大家参考&#xff1a; 1、给 link 标签的 c…

TrustZone之安全虚拟化

在Armv7-A首次引入虚拟化时,它仅在非安全状态中添加。在Armv8.3之前,Armv8也是如此,如下图所示: 如前所述在切换安全状态时,EL3用于托管固件和安全监视器。安全EL0/1托管受信任的执行环境(TEE),由受信任的服务和内核组成。 在安全状态下,没有对多个虚拟机的需…

Kafka生产问题总结及性能优化实践

1、消息丢失情况 消息发送端&#xff1a; &#xff08;1&#xff09;acks0&#xff1a; 表示producer不需要等待任何broker确认收到消息的回复&#xff0c;就可以继续发送下一条消息。性能最高&#xff0c;但是最容易丢消息。大数据统计报表场景&#xff0c;对性能要求很高&am…

JavaCV之rtmp推流(FLV和M3U8)

JavaCV与FFmpeg FFmpeg是一款开源的多媒体处理工具集&#xff0c;它包含了一系列用于处理音频、视频、字幕等多媒体数据的库和工具。 JavaCV集成了FFmpeg库&#xff0c;使得Java开发者可以使用FFmpeg的功能&#xff0c;比如视频解码、编码、格式转换等。 除了FFmpeg&#xff0…

LeetCode力扣每日一题(Java):35、搜索插入位置

一、题目 二、解题思路 1、我的思路&#xff08;又称&#xff1a;论API的重要性&#xff09; 读完题目之后&#xff0c;我心想这题目怎么看着这么眼熟&#xff1f;好像我之前学过的一个API呀&#xff01; 于是我回去翻了翻我之前写的博客&#xff1a;小白备战蓝桥杯&#xf…

通用的AGI 安全风险

传统安全风险 平台基础设施安全风险 模型与数据层安全风险 应用层安全风险 平台基础设施安全风险 &#xff08;1&#xff09;物理攻击&#xff1a;机房管控不到位 &#xff08;2&#xff09;网络攻击 &#xff08;3&#xff09;计算环境&#xff1a;自身安全漏洞&#xf…

编辑器Sublime text 常用快捷命令 列模式 替换空行

平替notepad 下载可取官网 www.sublimetext.com 据说可以无限试用&#xff0c;没有功能限制 1、快速删除空行 ctrl h选择正则表达式 .*Find输入&#xff1a; ^(\t)*$\nReplace输入&#xff1a;点击Replace All 2、快速选择指定字符 用鼠标选中alt f3修改 3、列编辑模式 ct…

宇视科技视频监控 main-cgi 文件信息泄露漏洞复现

0x01 产品简介 宇视(Uniview)高清网络摄像机是一种高性能的网络摄像机,它可以通过网络进行视频传输和监控。该摄像机采用先进的视频技术,具有高清晰度、低照度、宽动态等特点,能够提供高质量的视频图像。 0x02 漏洞概述 宇视(Uniview)高清网络摄像机存在信息泄露漏洞…

ppt编辑密码如何设置?

大家在PPT中设置了限制编辑&#xff0c;发现后面任然可以编辑文件。那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&#xff0c;在保存时&#xff0c;将文件格式选择为PowerPoint图片演示文稿 方法…

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(测试篇)

WebAppDbTest 项目测试 测试工具 ltt介绍安装使用方式1、Drill2、Hammer3、Nailgun 测试主机规格配置CRUD 性能测试对比1、ltt 工具测试1.1、AddSingle 单条数据添加1.2、AddBulk 批量数据&#xff08;1000&#xff09;条添加1.3、GetSingle 单条数据查询1.4、GetAll 多条&…

多合一iPhone 解锁工具:iMyFone LockWiper iOS

多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备&#xff0c;包括最新的 iOS 17 和 iPhone 1…