Linux LVS 负载均衡群集
在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的。此时最常见的方式就是通过负载均衡来进行横向扩展。其中我们最常用的软件就是 Nginx。通过其反向代理的能力能够轻松实现负载均衡,当有服务出现异常,也能够自动剔除。但是负载均衡服务自身也可能出现故障,因此需要引入其他的软件来实现负载均衡服务的高可用。本文就介绍了一种基于 LVS+Keepalived 的方式,来实现高可用 Web 集群。
LVS 与 Keepalived
LVS 是一种预装在 Linux 系统中,基于四层、具有强大性能的反向代理服务器。ipvsadm 是 LVS 的命令行管理工具。
LVS 特点是:
- 首先它是基于 4 层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求;
- 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,大大减少了人为出错的几率;
- 应用范围比较广,不仅仅对 web 服务做负载均衡,还可以对其他应用(mysql)做负载均衡;
- LVS 架构中存在一个虚拟 IP 的概念,需要向 IDC 多申请一个 IP 来做虚拟 IP。
Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS 、HAProxy 、Nginx)一起工作来达到集群的高可用。Keepalived 是 LVS 的扩展项目, 因此它们之间具备良好的兼容性,可直接通过 Keepalived 的配置文件来配置 LVS。
LVS 的工作原理可见参考文献
关于 LVS 和 Keepalived 详细的结构和原理,以及 LVS 和我们常用的 LB 软件 Nginx 的异同,可以阅读末尾提供的参考文献。接下来将介绍如何部署一个高可用的负载均衡集群。
相关术语
- 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
解释
| +----------------+-----------------+ | | 172.17.13.120|---- VIP:172.17.13.252 ----|172.17.13.123 +-------+--------+ +--------+-------+ | DS1 | | DS2 | | LVS+Keepalived | | LVS+Keepalived | +-------+--------+ +--------+-------+ | | +----------------+-----------------+ | +------------+ | +------------+ | RS1 |172.17.13.142 | 172.17.13.173| RS2 | | Web Server +--------------+---------------+ Web Server | +------------+ +------------+
集群的架构图如上图所示。DS1、DS2 为两个 LB 节点,RS1、RS2 为两个真实的服务节点,通过一个虚拟的 IP 地址对外提供服务。
最终我们要达到的目标为:
- Client 通过 VIP 访问服务能够将请求根据配置的规则进行分发(LB)
- 当 MATSER 的 LB 节点故障时,自动切换到 BACKUP 的 LB 节点上,保证服务正常访问;MASTER 恢复后,再次作为主 LB 负载节点
- 当某个 RS 节点故障时,自动剔除该节点;恢复后,再次加入集群
详细配置流程
安装相关软件
[root@localhost ~]# yum install ipvsadm keepalived -y
配置 Keepalived
- DS1(MASTER) 节点
解释
[root@localhost ~]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER # 两个 DS,一个为 MASTER 一个为 BACKUP interface enp1s0 # 当前 IP 对应的网络接口,通过 ifconfig 查询 virtual_router_id 62 # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样 priority 200 # 优先级值设定:MASTER 要比 BACKUP 的值大 advert_int 1 # 通告时间间隔:单位秒,主备要一致 authentication { # 认证机制,主从节点保持一致即可 auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.17.13.252 # VIP,可配置多个 } } # LB 配置 virtual_server 172.17.13.252 80 { delay_loop 3 # 设置健康状态检查时间 lb_algo rr # 调度算法,这里用了 rr 轮询算法 lb_kind DR # 这里测试用了 Direct Route 模式 persistence_timeout 50 # 持久连接超时时间 protocol TCP real_server 172.17.13.173 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 # 旧版本为 nb_get_retry delay_before_retry 3 connect_port 80 } } real_server 172.17.13.142 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } }
- DS2(BACKUP) 节点
复制之前的配置文件,修改 vrrp_instance VI_1
中的 state
为 BACKUP
。
配置完成后,分别重启 Keepalived 服务。
[root@localhost ~]# systemctl restart keepalived
配置 RS
RS 配置主要分两部分,一部分是 web 服务,另一部分是网络转发配置。
web 服务部署不多展开了,根据实际情况来,可以是 Tomcat 也可以是 Nginx,只要能通过 ip:port 能访问到即可。
在网络转发配置上,LVS 支持多种通信模型(NAT、DR、TUN),本文采用 DR 模型来进行通信,大致的流程如下图所示。请求数据包从到达 LB 后,LVS 会将这个数据包的 MAC 地址改成轮询到的 RS 的 MAC 地址,并丢给交换机;RS 收到后进行处理并从网卡的 lo 端口发送出去,响应报文到达交换机后直接转发给 Client。
因此,我们需要在 RS 的网卡上配置 lo 为 VIP。配置脚本如下
解释
#!/bin/bash SNS_VIP=172.17.13.252 case "$1" in start) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP /sbin/route add -host $SNS_VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $SNS_VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
本地创建完后,并执行。
[root@localhost ~]# chmod a+x lvs-web.sh
[root@localhost ~]# ./lvs-web.sh start
配置完成后,通过 VIP 就可以访问到 RS 上的服务了。
HA 测试
配置完双机热备后,我们就可以测试下,节点发生故障后以及 LB 切换失败后,能否保证服务的 HA。
在 LB 的主节点上输入 ip a
,可以看到 VIP 目前已经正确配置在网卡上。
输入 watch ipvsadm -Ln --stats
可实时看到负载均衡的结果,正常。
接下面我们试着访问一下 VIP。
[root@localhost ~]# while true ; do curl 172.17.13.252; sleep 1;done
看到服务可正常轮询。
此时手动停止一个 RS,再次访问 VIP,LVS 会自动剔除无法访问的服务,重启后,服务会被自动添加。
如果此时,手动停止 MASTER 上的 Keepalived,模拟 LB MASTER 节点挂了,VIP 会自动飘到 BACKUP LB 上。
此时,如果重启 MASTER 后,VIP 又会飘回去。MASTER 的优先级高于 BACKUP,从而实现 HA。
总结
本文介绍了使用 LVS+Keepalived 来实现高可用负载均衡,这能使得我们的服务能够更加的稳定。Keepalived 默认是运行在 LVS 之上的,有较好的兼容性,当然我们也可以使用户 Nginx 作为 LB 的软件,可根据业务和两者的异同进行选择。
相关文章:

Linux LVS 负载均衡群集
在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的。此时最常见的方式就是通过负载均衡来进行横向扩展。其中我们最常用的软件就是 Nginx。通过其反向代理的能力能够轻松实现负载均衡,当有服务出现异常,也能够自动剔除。但是负载均衡服…...
onTouch()与onTouchEvent()的区别
onTouch()和onTouchEvent()是Android中处理触摸事件的两个重要方法。它们用于不同的场景,并在事件分发机制中扮演不同的角色。以下是它们的详细区别和使用方法: onTouch() 方法 定义:onTouch(View v, MotionEvent event)是View.OnTouchList…...

计算机网络网络层复习题2
一. 单选题(共22题,100分) 1. (单选题)如果 IPv4 数据报太大,会在传输中被分片,对分片后的数据报进行重组的是( )。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…...
[JS]面向对象ES6
class类 ES6是基于 class关键字 创建类 <script>// 1.定义类class Person {// 公有属性name// 公有属性 (设置默认值)age 18// 构造函数constructor(name) {// 构造函数的this指向实例化对象// 构造函数的作用就是给实例对象设置属性this.name name// 动态添加属性(不…...

ctfshow web sql注入 web242--web249
web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…...

发送微信消息和文件
参考:https://www.bilibili.com/video/BV1S84y1m7xd 安装: pip install PyOfficeRobotimport PyOfficeRobotPyOfficeRobot.chat.send_message(who"文件传输助手", message"你好,我是PyOfficeRobot,有什么可以帮助…...

数组-螺旋矩阵
M螺旋矩阵 ||(leetcode59) /*** param {number} n* return {number[][]}*/ var generateMatrix function(n) {const maxNum n * n;let curNum 1;const matrix new Array(n).fill(0).map(() > new Array(n).fill(0));let row 0,column 0;const d…...
GitStack详细配置与使用指南
1.引言 GitStack是一个功能强大的Git服务器管理工具,专为Windows环境设计。它提供了一个用户友好的Web界面,使得在Windows服务器上管理Git仓库变得简单高效。本文将详细介绍GitStack的安装、配置和使用方法,帮助您快速搭建自己的Git服务器。 2.GitStack安装 2.1 系统要求 Wi…...

LoadRunner-Virtual User Generator组件学习
重点知识 LR工具是拿C写的,所以它的脚本默认也是C,但是最终生成的脚本不止是C,它是支持C和Java语言的,这个大家要清楚,对本身懂代码的就很友好,你了解java,那就可以把脚本改成java,…...

NAT地址转换实验,实验超简单
实验拓扑 实验目的 将内网区域(灰色区域)的地址转换为172.16.1.0 实验过程 配置静态NAT(基于接口的静态NAT) R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…...
pip常用命令详解
pip 是 Python 的官方第三方包管理工具之一,其为 Python 包的安装与管理提供了极大的便利。本文将详细介绍 pip 的常见命令及其用法,帮助读者更好地利用这一强大的工具。 1. 安装 pip 在开始使用 pip 之前,确保您的系统中已经安装了 pip。p…...

vue3从入门到精通
CDN方式使用vue: 获取复杂数据类型: 使用结构复制语法去除vue前缀: 使用模块化开发: 需要安装插件live server: 需要访问网络地址: 简单数据类型ref的使用: 如何修改number reactive修改值不需要.value&…...

kubuadm 方式部署 k8s 集群
准备三台机器 主机名IP地址CPU/内存操作系统版本角色K8S版本Docker版本k8s231192.168.99.2312C4GCentos 7master1.23.1720.10.24k8s232192.168.99.2322C4GCentos 7woker1.23.1720.10.24k8s233192.168.99.2332C4GCentos 7woker1.23.1720.10.24 需要在K8S集群各节点上面安装dock…...

Android studio 打包低版本的Android项目报错
一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…...

【教程】lighttpd配置端口反向代理
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、修改配置文件: sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy: 3、然后添加端口映射: 4、保存&…...

微服务之服务保护策略【持续更新】
文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离(Hystix隔离),每个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU…...

微信小程序的开发
前端:微信小程序开发的技术 后端:springboot的框架 一:微信小程序环境的搭建 1. 访问微信开发者官⽅⽹站的⼩程序开发⼯具下载⻚⾯。 2. 根据你的操作系统(Windows、macOS或Linux)选择合适的版本进⾏下载。 3. 下…...
Oracle中CREATE FORCE VIEW的说明和例子
Oracle数据库中的CREATE FORCE VIEW语句用于创建视图,即使在视图所依赖的基表或对象不存在,或者创建视图的用户对这些对象没有足够的权限时,也能强制创建视图。不过,需要明确的是,尽管视图能被强制创建,但在…...

C#反射基本应用
1、反射 反射是.NET Framework的一个特性,它允许在运行时获取类型的信息以及动态创建对象,调用方法,以及访问字段和属性。 2、代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy…...
1.英语中的从句学习
名词性从句: 1.最常见的连接词是that在宾语从句中的运用,如:I know that you will come. 句中的that 就是连接词,作用就是连接主句和从句,不充当成分也没有含义,只起风向标的作用,告诉你接下来…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...