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.hqwc.cn/news/266895.html

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

相关文章

Proxmark3 Easy救砖-20231209

事情是这样的,在淘宝买了个PM3,拿到手后刷固件的,一不小心刷成砖头了,现象就是四个灯全亮,插上电脑USB不识别。问商家他也不太懂,也是个半吊子技术,远程给我刷机搞了半天也没有搞定,…

Spark与PySpark(1.概述、框架、模块)

目录 1.Spark 概念 2. Hadoop和Spark的对比 3. Spark特点 3.1 运行速度快 3.2 简单易用 3.3 通用性强 3.4 可以允许运行在很多地方 4. Spark框架模块 4.1 Spark Core 4.2 SparkSQL 4.3 SparkStreaming 4.4 MLlib 4.5 GraphX 5. Spark的运行模式 5.1 本地模式(单机) Local运行模…

scripty妙用

在monorepo项目中,随着子模块增多, 每个子项目都需要配置各自的package.json,并且大同小异,为了进一步提高配置效率,引入了scripty,自己写脚本,直接就可以用哦 1、安装 npm install scripty --save-dev 2…

051:vue项目webpack打包后查看各个文件大小

第050个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Firmware Analysis Plus (Fap)固件模拟安装教程(最新)

最近在搞IoT的研究,但是难在设备比较难弄,只有固件,而没有设备,买吧,又太费钱,不划算。好在有很多项目可以在模拟环境中运行固件。但是几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同。 …

C# WPF上位机开发(文本编辑器的界面开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 通常我们学习一个新软件的时候,一般都要看下这个软件有哪些菜单、工具栏有什么、状态栏有什么。每一个菜单或者工具代表着什么意义&…

无线且列窄图片如何转excel?

写此文原因:图片要转excel,这放以前,是不能实现的功能,但随着人工智能的蓬勃发展,人们已克服了这一难题,但是,我们知道,要将图片识别成excel,识别程序首先要先识别图片中…

nodejs+vue+微信小程序+python+PHP基于spark的酒店管理系统-计算机毕业设计推荐

通过管理系统进行全面的线上管理。管理者可以通过基于spark的酒店管理系统,全面掌握酒店客房的各项状态,会员通过系统查询酒店客房信息,在线预定。 酒店作为旅游过程必须的设施,也逐渐需需要进行信息化管理,把酒店类型…

PDF控件Spire.PDF for .NET【转换】演示:将 PDF 转换为 Excel

PDF是一种通用的文件格式,但它很难编辑。如果您想修改和计算PDF数据,将PDF转换为Excel将是一个理想的解决方案。在本文中,您将了解如何使用Spire.PDF for .NET在 C# 和 VB.NET 中将 PDF 转换为 Excel。 Spire.Doc 是一款专门对 Word 文档进行…

【LeetCode刷题-树】-- 103.二叉树的锯齿形层序遍历

103.二叉树的锯齿形层序遍历 方法:广度优先搜索 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int …

【JavaWeb学习笔记】8 - HTTP

一、常用文档 请求头 响应头 中间件获取的网页协议和返回的内容 这些称为HTTP协议 请求和响应 常见的请求头 响应头 状态码 HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务…

.net 安装Postgresql驱动程序ngpsql

.net 安装Postgresql驱动程序ngpsql 最近搞一个物联网项目,需要采集fanuc数控机床的数据,厂家提供的API只支持windows,所以就决定C#开发,数据库用postgresql, 安装数据库驱动一波三折。 作为一个讨厌微软的老程序猿&…