LVS+Keepalived 实现高可用负载均衡

2023-11-01

一、Keepalived介绍

keepalived是在Linux系统下的一个轻量级的高可用解决方案,是使用C语言编写的,在 Keepalived 中实现了一组检查器,可以根据服务集群中服务器的健康状态,自动的进行动态主备切换、管理。

VRRP(Virtual Router Redundancy Protocol)虚拟路由器冗余协议,是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。

Keepalived软件主要是通过VRRP协议实现高可用功能,在安装keepalived的服务器主机上会在配置文件中设置一个虚拟IP,当该keepalived节点为主节点且正常运行时,设置的虚拟Ip就会在该节点生效且绑定在该主机的网卡上,而其他备用主机设置的虚拟IP就不会生效。当测到主keepalived节点出现故障时,备用keepalived节点检会进行抢占提供服务,抢占成功的keepalived节点就会将配置的虚拟IP绑定在自己的网卡上,这样对外部用户来说虚拟IP提供的服务是一直可用的,当故障服务器被修复后可以正常工作时Keepalived会自动的将该服务器加入到服务器群中。在整个过程中,故障检测、故障服务器剔除以及修复后的服务器重新上线这些操作都是由keepalived自动完成,运维人员只需要关注故障服务器的修复。

通过keepalived配置nginx高可用

如图:有两台服务器Server1(192.168.56.101)和Server2(192.168.56.102)。每台服务器上都运行一个nginx实例和一个keepalived实例,其中Server1的keepalived实例是Master节点,Server2的keepalived实例是备用节点,两个keepalived实例配置的虚拟IP为192.168.56.100

1)nginx配置:

nginx保持默认配置即可,通过真实ip访问两台nginx服务如下

2)keepalived配置:

keepalived配置文件一般在/etc/keepalived/keepalived.conf下,    keepalive-master配置如下

! Configuration File for keepalived
global_defs {
   #路由id,全局唯一,表示当前keepalived节点的唯一性
   router_id keep_101
}

vrrp_instance VI_1 {
    #设置当前实例状态为MASTER。MASTER代表是主实例,BACKUP代表是备用实例
    state MASTER
    #当前实例绑定的网卡
    interface enp0s8
    #当前实例的虚拟路由id,一组主备的实例的路由id是相同的
    virtual_router_id 51
    #当前实例的优先级
    priority 100
    #主备之间同步检查时间间隔
    advert_int 1
    #一组主备实例的认证密码,方式非法节点进入路由组
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #设置当前实例的虚拟IP
    virtual_ipaddress {
        192.168.56.100
    }
}

keepalive-slve配置如下

! Configuration File for keepalived
global_defs {
   #由于是全局唯一Id,所有需要与master保持不同
   router_id keep_102
}

vrrp_instance VI_1 {
    #备用实例状态应设置为BACKUP
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    #设置备用实例的优先级低于主实例,这样可保证在主实例故障修复后可以再次将主节点抢占回来
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.56.100
    }
}

启动keepalived,通过虚拟ip访问nginx服务,然后kill掉Server1上的keepalived验证是否保证虚拟ip正常访问,验证图示如下

二、LVS

LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS在Linux内核中实现了基于IP的内容请求分发的负载均衡调度解决方案,属于四层负载均衡

LVS将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。在使用LVS负载均衡时,用户的请求都会被LVS调度器转发到真实服务器,真实服务器在处理完请求后将数据发送给用户时会有多种方式(三种)可以选择,整个服务器集群的结构对客户是透明的。

1、三种工作模式:

1)NAT模式:
NAT(Network Address Translation)网络地址转换,通过修改数据报头,使得内网中的IP可以和外部网络进行通信。LVS负载调度器使用两块不同的网卡配置不同的IP地址,网卡一设置为公网IP负责与外部通信,网卡二设置内网IP负责与内网服务通信。

外部用户通过访问LVS调度器的公网IP发送服务请求,LVS调度器接受请求后,将请求数据进行转换,通过内网IP的网卡设备,根据调度策略将数据转发给内部服务,内部服务处理完成将响应数据再返回给LVS调度器,LVS调度器再将数据转换通过公网IP的网卡设备将响应结果返回给请求用户。

以上描述的就是一个基于NAT工作模式的LVS调度,这种模式的瓶颈在于LVS调度器,因为所有的请求数据和响应数据都需要经过LVS来进行转换处理,当大流量到来时,LVS调度器就成了一个短板,限制整个集群服务性能的上限。

2)TUN模式:
TUN模式与NAT的不同在于,TUN模式下LVS调度器只负责接受请求,而真实服务器进行响应请给用户。LVS调度器与真实服务器建立IP隧道,IP隧道它可以将原始数据包封装并将新的源地址及端口、目标地址及端口添加新的包头中,将封装后的数据通过隧道转发给后端的真实服务器,真实服务器在收到请求数据包后直接给外部用户响应数据,这种模式下要求真实服务器具有直接外部用户通信的能力。

外部用户访问LVS调度器发送服务请求,LVS调度器接收请求后,将请求数据转换,根据调度策略将数据转发给服务集群真实服务器,真实服务器在处理完成后,就直接与外部请求用户通信,直接将响应结果返回给请求用户。

以上描述就是一个基于TUN工作模式的LVS调度,这种模式下LVS调度器就只负责请求的负载均衡转发,而处理数据的响应则全部由真实服务器来直接和用户通信了。在实际环境中,请求的数据量往往是小于响应的数据量,所以仅仅将请求数据让LVS来转发,好处就是LVS调度器的压力减少很多,可以承载更大的流量,同时真实服务器的性能也能得到充分利用,缺点就是真实服务器需要与外部网络用户直接通信,在安全上会存在一定风险。

3)DR模式:
DR模式是在TUN模式的基础上又进行了改造,在DR模式下LVS调度器与真实服务器共享一个虚拟IP,且调度器的虚拟IP对外暴露,而真实服务器的虚拟IP地址将配置在Non-ARP的网络设备上,这种网络设备不会向外广播自己的MAC及对应的IP地址,这样即保证了真实服务器可以接受虚拟IP的网络请求也让真实服务器所绑定的虚拟IP对外部网络部是不可见的。

外部用户通过访问虚拟IP将请求数据包发送到调度器,调度器根据调度策略确定转发的真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器,之后真实服务器在处理完后进行数据响应时,会将虚拟IP封装在数据包中,再经过路由将数据返回给外部用户,在这整个过程中,真实服务器对外部用户不可见,外部用户只能看到虚拟IP的地址

在DR模式下因为真实服务器给外部用户回应的数据包设置的源IP是虚拟IP地址,又因为真实服务器的虚拟IP不对外暴露,这样外部用户在通过虚拟IP访问时,就访问到了调度器的虚拟IP地址,就实现了整个集群对外部用户透明。

2、负载均衡算法:

轮询、加权轮询等。。。

3、使用LVS对集群进行DR模式的负载均衡

我们演示的DR模式的LVS负载均衡,所以真实服务器的虚拟IP将和LVS调度器的虚拟IP一样,且真实服务器的虚拟IP不能对外暴露,所以我们会将虚拟IP绑定在lo回环接口上。

参考:https://zhuanlan.zhihu.com/p/156858630

https://zhuanlan.zhihu.com/p/157303195

三、LVS+Keepalived 实现高可用负载均衡

上面我们了解了lvs和keepalived,将二者结合起来使用可以达到一个完美的高可用负载均衡。

回顾

LVS 是一种预装在 Linux 系统中,基于四层、具有强大性能的反向代理服务器。ipvsadm 是 LVS 的命令行管理工具。

LVS 特点是:

  1. 首先它是基于 4 层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求;
  2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,大大减少了人为出错的几率;
  3. 应用范围比较广,不仅仅对 web 服务做负载均衡,还可以对其他应用(mysql)做负载均衡;
  4. LVS 架构中存在一个虚拟 IP 的概念,需要向 IDC 多申请一个 IP 来做虚拟 IP。

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS 、HAProxy 、Nginx)一起工作来达到集群的高可用。Keepalived 是 LVS 的扩展项目, 因此它们之间具备良好的兼容性,可直接通过 Keepalived 的配置文件来配置 LVS。

相关术语:

  • LB (Load Balancer 负载均衡)
  • HA (High Available 高可用)
  • Failover (失败切换)
  • Cluster (集群)
  • LVS (Linux Virtual Server Linux 虚拟服务器)
  • DS (Director Server),指的是前端负载均衡器节点
  • RS (Real Server),后端真实的工作服务器
  • VIP (Virtual IP),虚拟的 IP 地址,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
  • DIP (Director IP),主要用于和内部主机通讯的 IP 地址
  • RIP (Real Server IP),后端服务器的 IP 地址
  • CIP (Client IP),访问客户端的 IP 地址

环境:

软件环境:CentOS7、Keepalived1.3.5、ipvsadm1.27

  • DS1(MASTER):172.17.13.120
  • DS1(BACKUP):172.17.13.123
  • RS1:172.17.13.142:80 Nginx
  • RS1:172.17.13.173:80 Nginx
  • VIP:172.17.13.252

集群的架构图如上图所示。DS1、DS2 为两个 LB 节点,RS1、RS2 为两个真实的服务节点,通过一个虚拟的 IP 地址对外提供服务。最终我们要达到的目标为:

  1. Client 通过 VIP 访问服务能够将请求根据配置的规则进行分发(LB)
  2. 当 MATSER 的 LB 节点故障时,自动切换到 BACKUP 的 LB 节点上,保证服务正常访问;MASTER 恢复后,再次作为主 LB 负载节点
  3. 当某个 RS 节点故障时,自动剔除该节点;恢复后,再次加入集群

参考:https://www.cnblogs.com/Sinte-Beuve/p/13392747.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVS+Keepalived 实现高可用负载均衡 的相关文章

  • 未找到 ffmpeg 命令,但 pip 列表显示 ffmpeg

    我一直在尝试使用命令安装 ffmpegpip install ffmpeg我正在没有 sudo 权限的服务器上执行此操作 在编写 ffmpeg 时 我得到 ffmpeg command not found 然后我检查了pip list它显示
  • 在 64 位 RHEL 上安装 32 位库 (glibc),而不使用 yum

    我试图让 32 位应用程序在 64 位 RHEL 6 1 上运行 但该计算机无法访问互联网 有没有办法在 64 位 RHEL 上安装 32 位 glibc 而不使用 yum 即仅使用 RPM 安装 我从 RHEL 6 1 ISO 中获取了
  • rshd.c 源代码中缺少 pam_appl.h 和 pam_misc.h

    我正在研究一个CentOS 5 5 操作系统 它显示错误 security pam appl h 和 security misc h 文件丢失 实际上我的 rshd c 没有加载 PAM 模块 可能是通过放置这个库 它可以帮助我很好地工作我
  • 从哪个 Linux 内核/libc 版本开始,Java Runtime.exec() 在内存方面是安全的?

    在工作中 我们的目标平台之一是运行 Linux 的资源受限的迷你服务器 内核 2 6 13 基于旧 Fedora Core 的自定义发行版 该应用程序是用 Java Sun JDK 1 6 04 编写的 Linux OOM Killer 配
  • 简单的awk命令问题(FS、OFS相关)

    我尝试重新组织包含以下内容的文件的格式 gt Humanl chr16 86430087 86430726 element 1 positive gt Humanl chr16 85620095 85621736 element 2 neg
  • 如何使用终端打开“-”虚线文件名?

    我尝试了 gedit nano vi leafpad 和其他文本编辑器 它无法打开 我尝试了 cat 和其他文件查找命令 我向你保证这是一个文件而不是目录 这种方法有很多误解 因为使用 作为参数指的是标准输入 标准输出 i e 开发 标准输
  • 如何判断输入来自哪个键盘

    设想 我有一个 USB RFID 读取器 将其连接到笔记本电脑后 它可以用作新连接的 USB 键盘 例如无需安装任何驱动程序 当接触带有 RFID 标签的阅读器时 它进入我当前的窗口 例如终端 外壳 RFID 号码 例如0009339384
  • WSL gprof 报告零次

    我正在尝试在 Windows 10 上的 WSL 中使用 gprof 我没有预料到会遇到任何困难 因为上次我在 Windows 7 上的 Ubuntu 虚拟盒中使用它时它工作得很好 与以前一样遵循来自https www thegeekstu
  • 如何在shell脚本中扩展相对路径

    我正在编写一个脚本来使用 bash 在 linux 2 6 上设置环境变量 因此该脚本包含如下命令 export SRC DIR export LIBPATH SRC DIR lib 问题是 当我尝试 echo LIBPATH 时 它显示
  • 错误:‘:’标记之前需要初始化程序

    我正在尝试编译一些 C 代码 可以在 Windows 上使用 Visual Studio 2012 进行编译 g 4 4 我有这段代码 const std string cnw restoreSession const std vector
  • 为什么不使用 sshrc 中设置的 $PATH?

    我正在尝试在 OS X 服务器上通过 ssh 设置 svn 为了做到这一点 我读到我需要一个包装器来设置 umask 并 在我的例子中 设置存储库根 一种快速而肮脏的方法是重命名 usr bin svnserve并将包装器脚本放置在该位置
  • C++向量数组运算符计算成本高?

    我一直都知道 C 的丰富抽象会带来一定的计算开销 但我的印象是 一旦应用了正确的编译器优化 这种开销几乎可以忽略不计 我很好奇这种开销到底有多大 所以我编写了一个简单的测试来确定这一点 该测试是一个模板化函数 它接受一个容器变量 为容器中的
  • 如何在每个 xargs 命令之间休眠 1 秒?

    例如 如果我执行 ps aux awk print 1 xargs I echo 我想让 shell 在每次之间休眠 1 秒echo 如何更改我的 shell 命令 您可以使用以下语法 ps aux awk print 1 xargs I
  • 强制 shell 在 SunGrid 引擎中使用 conda 变量中的 python [重复]

    这个问题在这里已经有答案了 我正在尝试在 SunGrid 引擎中执行 python 文件 并且从 anaconda3 环境变量中执行它 我的代码很简单 from future import print function import url
  • top命令的CPU使用率计算

    我正在尝试使用 GNU coreutil top 的公式来计算 CPU 使用率的百分比 但 top 正在使用一些 half total 来计算百分比 即在百分比上添加 0 5 在top的utils c中 以下行 在 3 8 beta1 中
  • 无法声明接口:资源繁忙

    我正在使用 USB4Java 低级版本 并且基本上是根据这段代码工作的here http www mets blog com java usb communication usb4java 我在 Ubuntu 中工作 遇到了有关权限的问题
  • 如何安装 Node 和 NPM 以便不必使用 sudo?

    我正在尝试在 Ubuntu 14 04 计算机上设置 Node js 和 NPM 但遇到了一些问题 在我的第一次尝试中 我不断得到EACCES尝试安装软件包时出错 有时甚至使用sudo 所以我彻底卸载了node和npm 现在我正在尝试找出如
  • 在Linux上如何找到当前目录的所有直接子目录?

    在Linux上如何找到当前目录的所有直接子目录 最简单的方法是通过编写来利用 shell 通配功能echo 如果你喜欢使用ls 例如要应用格式 排序选项 请使其ls d 解释 斜杠确保仅考虑目录 而不考虑文件 Option d 列出目录本身
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上

随机推荐

  • Photoshop出现无法完成,因为内存不够(RAM),如何解决?

    Photoshop出现无法完成 因为内存不够 RAM 时 你所需要如下步骤进行系统的适用 1 在你点击 编辑 首选项 性能 系统提示中如果出现了 要求在96和8之间的整数 已插入最接近的数 这个就需要你在注册表中进行操作 操作如下 1 wi
  • 加拿大安省欢ajax,加拿大安省省考OSSLT介绍

    原标题 加拿大安省省考OSSLT介绍 加拿大省考相当于中国的会考 必须通过才可以取得加拿大高中毕业证 不同省份的省考 BC省除外 目前已取消省考 对申请大学的影响不同 安大略省的省考只有一门课 即由安大略省教育质量和问责办公室 EQAO 举
  • Sqoop简介、原理、安装、简单使用案例、一些常用命令及参数

    问题导读1 Sqoop原理是怎样的 2 如何利用Sqoop导入数据 3 如何利用Sqoop导出数据 4 Sqoop常用的命令及对应参数有哪些 第1章 Sqoop 简介 Sqoop 是一款开源的工具 主要用于在 Hadoop Hive 与传统
  • vector 的作用

    c 中 vector作为容器 它的作用是 一个动态数组模板类 你可以把它当做一个普通数组用 但是他的功能远比一般数组强大 数组最大的不好就是数组长度的限制和删除其中一个时候的后续移位问题 这些在vector中都得到了完美的解决 而且可以存储
  • 教你一步步创建属于自己的Python爬虫代理IP池(含代码示例)

    前言 在进行网络数据采集时 遇到反爬虫限制是常见的问题 使用代理IP可以帮助我们绕过这些限制 保护自己的爬虫程序 本文将教您如何使用Python创建属于自己的代理IP池 以便获取可用的代理IP并应用于 Python爬虫程序 同时 我们将提供
  • 关于Qt调用多/两次setupUi导致信号与槽自动连接失败问题

    代码场景 函数内部调用两次 setupUi okBtn自动连接槽函数失效 问题分析 在 setupUi 函数内部调用了这么一个函数 connectSlotsByName 从函数名来看就是通过名字 部件名 连接信号与槽 官方文档的解释 所以流
  • Spring@Autowired注解与自动装配

    今天在预发布环境配置一个manager的时候 应用启动失败 报错 Caused by org springframework beans factory BeanCreationException Could not autowire fi
  • ELK日志采集平台(四)---轻量级采集工具metricbeat

    目录 一 安装metricbeat 二 与kibana数据可视化联用 logstash是负责采集数据的 是入口 流向为logstash gt ES gt kibana 但是它的资源消耗很大 有时候没那么多内存给他占用 同时有些定制的采集指标
  • 使用freemaker 导出word 包含分页,表格循环java

    在平时项 目开发中 相信或多或少的都遇到过word导出的需求 这里整理一个比较全面的java word导出方法 希望可以跟大家一起交流学习 创建word模板 1 1 新建一个word模板 并修改字段 2 将word文件另存为xml 格式 打
  • 进程 第三天 (线程&线程间通信)

    印象笔记 进程 第三天 线程 线程间通信 一 线程简介 1 线程的基本概念 通过之前的学习我们知道 进程是系统中资源执行和资源分配的最小单位 每个进程都有自己独立的数据区 代码区 堆栈区等 这就造成了当进程切换时 操作系统需要额外的操作来清
  • Git使用教程:超详细、超傻瓜、超浅显、真正手把手教

    作者 涂根华 原文链接 https www cnblogs com tugenhua0707 p 4050072 html https mp weixin qq com s M DoeWWSRI P5Et6hm0BIw
  • PowerToys安装

    PowerToys 是微软开发者开发的免费实用工具集 可以用于高级用户调整和简化 Windows 操作 以提高效率 官网安装方法 https learn microsoft com zh cn windows powertoys insta
  • Oracle数据库startup mount时的报错处理(ORA-01078&LRM-00109)

    安装监听 Disconnected oracle rac1 netca Oracle Net Services Configuration oracle rac1 sqlplus as sysdba SQL Plus Release 11
  • 在win10系统下不能运行VC++6.0的解决方法

    win10系统下出现 VC6 0应用程序无法正常启动 0x0000142 解决方法 将英文版的MSDEV exe文件复制粘贴替换到vc 6 0 Microsoft Visual Studio Common MSDev98 Bin文件目录下运
  • 树莓派4B-串口、多串口配置及详细使用攻略

    相比树莓派零 1 2 以及 3 的双串口 UART0 PL011 和 UART1 mini UART 树莓派4 中新增了 4 个 PL011 串口共计有 6 个 UART 整理此笔记用作记录和配置参考 注意 目前搜到的大多数描述树莓派 4
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • Openresty(二十一)ngx.balance和balance_by_lua灰度发布

    一 openresty实现灰度发布 灰度发布 说明 早期 博客对 灰度 发布的 概念 进行解读 并且对 原生 nginx 灰度实现进行讲解 后续 主要拿 节点引流 的灰度发布 并且关注 gray灰度策略 相关借鉴 回顾HTTP反向代理流程
  • idea创建springboot项目和springcloud项目方法

    一 创建springboot项目 1 选择File gt New gt Project gt Spring Initialer gt 点击Next 2 填写项目相关的信息 gt 点击next 3 选择web gt web gt 点击next
  • 利用PyCharm操作Github(二):分支新建、切换、合并、删除

    在文章利用PyCharm操作Github 仓库新建 更新 代码回滚中 我们已经学习到了如何利用PyCharm来操作Github 其中包括了一些常见的Github操作 仓库的新建 更新以及代码回滚 在本文中 我们将介绍Git的另一部分的常见操
  • LVS+Keepalived 实现高可用负载均衡

    一 Keepalived介绍 keepalived是在Linux系统下的一个轻量级的高可用解决方案 是使用C语言编写的 在 Keepalived 中实现了一组检查器 可以根据服务集群中服务器的健康状态 自动的进行动态主备切换 管理 VRRP