centos8上实现lvs集群负载均衡nat模式

news2025/6/3 23:33:27

1.背景:

个人(菜鸟)学习笔记,学点记下来,给未来的自己看。高手看了也请多指点。

按照课程讲,lvs是我国大神开发的负载均衡程序,被收录进内核,只要安装时内核里有它,它就始终存在,只需要定义规则就能用。性能极高但实用性一般。但这是学习基础。

具体实用性如何我不敢说,只能以学习为目的做实验,我只想以此为开端了解集群实现。这里先不涉及分布式,只实验集群调度。

2.环境:

使用win11物理机和VMware虚拟机。

物理机win11和虚拟机win11充当客户机。

从centos8虚拟机上克隆三个虚拟机,分别命名为director、node1、node2,充当调度器和两个web服务器。

根据课程要求,为ip地址命名简称。cip(client ip)、vip(direct virtual ip)、dip(direct ip)、rip(real server ip)。后面叙述时用到。

关于网络知识不赘述,掩码也不提了,就这么几台机器,只要合法,咋都行。

我所有的centos8都是最小安装,有关yum源和基础软件安装就不赘述了。我装了net-tools、ipvsadm、vim、openssh、nginx。后面会提到。

其中,虚拟机win11和director使用自动桥接网络VMnet0,跟物理机一个网段。node1和2使用专用网络VMnet1,跟物理机网络隔开。

3.目的:

3.1.目标效果:

一个“机房”有两个web服务器node1、node2,通过集群调度器director对外界提供web服务。并尝试端口映射,让node1和2的web服务监听在8080端口, 而director对外提供80端口服务。

外界客户机通过浏览器访问director公网地址,调度器可以把客户端请求,按照规则调度到实际的后台服务器node1、node2。

实际上生产环境中node1、node2的站点内容应该一样,这里不讨论分布式。但为了便于观察效果,我特意让两个服务器上放两个不同的index.html页面,分别显示page in node1和page in node2,这样客户端访问网页时,能直观看到区别。

3.2.nat架构:

director:vip,dip。rs:rip,网关指向dip。支持端口映射。

请求数据包:(cip)>(vip>dip)>(rip)。

响应数据包:(cip)<(vip<dip)<(rip)。

4.客户机准备:

物理机win11我使用的固定ip地址:192.168.0.2。虚拟机win11使用dhcp地址:192.168.116(这个无所谓,只要能和物理机互相通就行)。

客户机的ip地址称为cip(client ip)。

5.调度器director准备:

需要安装ipvsadm,它是个lvs的用户空间管理程序,用来设置ipvs(lvs)规则的。

需要两个ip地址,vip和dip,一个对外一个对内。

5.1.设置vip:

相当于“公网地址”,这里跟客户机一个网络,设置成192.168.0.8。可以改配置文件实现,但亲测使用NetworkManager更方便,也就是nmcli,nmtui。因为centos会自动生成类似“ens160”这种网络名,是能改,但我嫌麻烦。也没必要浪费时间。常见命令如下:

    # nmcli d 查看网络接口列表。
    # nmtui 打开tui编辑界面,配置网络。
    # nmcli networking 查看nmcli是否介入管理
    # nmcli networking on 启用nmcli    
    # nmcli con down/up ens160禁用/启用网卡,亲测比systemctl重启网络顶事,不知为何。

配置好以后,物理机(192.168.0.2)和director(192.168.0.8)互相能ping通。

5.2.设置dip:

相当于“私网地址”,这里跟两个Realserver(node1和node2)一个网络,设置为172.16.100.2。最开始我设置的是172.16.100.1,后来发现不妥,因为vmware会在物理机上生成一个网络连接是这个地址。

5.3.启用转发:

因为启用了两块网卡,负载均衡需要它们之间转发数据包。

    # cat /proc/sys/net/ipv4/ip_forward 查看显示0,默认没启用。
    # vim /etc/sysctl.conf 写net.ipv4.ip_forward = 1。sysctl.d下有软连接文件指向它,一样效果。
    # sysctl -p加载后,再使用cat查看,已经开启。

6.node1和node2准备:

这两个是本次集群实验中的RealServer,所以它们的地址叫rip。

6.1.设置rip:

在VMware中把网卡配置到使用专网。

node1和node2分别设置为172.16.100.3和172.16.100.4,同时网关要指向director的dip,即:172.16.100.2。

设置好以后,director、node1、node2之间互相能ping通。

6.2.配置nginx:

我从nginx.org官网下载的nginx源码,本地编译安装的,目录就用的默认地址。

目录在/usr/local/nginx,

配置文件在/usr/local/nginx/conf/nginx.conf,

nginx应用程序在/usr/local/nginx/sbin/nginx。

编辑配置文件,加一段:

server {

        listen 8080;

        location / {

                root /www;

                index index.html;

                keepalive_timeout 0s;

        }

}

让nginx监听在8080端口,并指向一个本地站点目录,以及首页文件。

两个node中的index.html有意让它们不一样,分别显示“page in node1”和“page in node2”。便于看效果。实际生产环境不能这么干。

另外我设置了长连接超时为0s,就是让本次的http为短连接,更容易观察效果。

目录和文件操作就省略了。

    # /usr/local/nginx/sbin/nginx运行nginx程序

    # ss -tnl查看当前监听的端口

可以看到8080正常监听了,80也有是因为nginx.conf中有默认的server段。如果注释了默认的server段,reload一下,这里立刻就看不到80了。

设置好以后,尝试从director看看网页:

    # curl http://172.16.100.3:8080

    # curl http://172.16.100.4:8080

应该是没问题的。能看到“page in node1”和“page in node2”。

7.设置director集群规则:

之前装好ipvsadm程序,具体不明白看man手册即可。默认里面是没规则的,稳妥起见可以先清空。

    # ipvsadm -C

    # ipvsadm -Ln

 添加外部出口,特别记录一下,我总忘了“-t”,centos8的man手册中-t ip:port一起算virtual_service。

  # ipvsadm -A -t 192.168.0.8:80 -s rr

其中-s rr表示调度策略是轮巡。

添加两个rs(real server,即node1和node2)。

    # ipvsadm -a -t 192.168.0.8:80 -r 172.16.100.3:8080 -m

    # ipvsadm -a -t 192.168.0.8:80 -r 172.16.100.4:8080 -m

其中-m表示使用lvs的nat模式,MASQUERADE(伪装)。

显示还是很清晰的。最后记得先关闭防火墙firewalld,做实验方便。

8.效果:

在物理机和虚拟机的win11上打开浏览器,输入网址192.168.0.8看结果。

如果当初node1和2当中的nginx不设置禁用长连接,具体显示哪个不一定的,我以为rr规则轮巡调用,但好像lvs内部算法不一定,要么是我没理解。以后有时间再考虑,先实现。

但是我设置nginx短连接,所以其实不用虚拟机里的win11也行,就用物理机的win11浏览器,每刷新一次,就会切换一次,这就是负载均衡效果。

如果前面添加外部出口时-s调度策略选择sh,就很难看到轮巡效果了,有cache的情况下,命中率高。

在director中可以看连接状态。

若要把设置的规则持久化,使用-S参数保存。

使用rpm -qa ipvsadm可以看这个程序具体装了哪些文件,其中有一个:

/usr/lib/systemd/system/ipvsadm.service能看到-S是保存哪去了。

9.总结:

个人感觉真正不容易的是理解并掌握集群的概念和各种类型的实现原理,以及诞生原因。只是操作很简单,man手册非常清晰。

上述添加外部出口时的-s策略,和添加rs时的-m(g|i)lvs模式,可以尝试更换看效果。

当然本次只是做实验,真正在生产环境中,又是另外概念。咱们计算机领域面太大了,工作越久越觉得自己渺小。

本文完。

 

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

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

相关文章

影响HTTP网络请求的因素

影响 HTTP 网络请求的因素 1. 带宽 2. 延迟 浏览器阻塞&#xff1a;浏览器会因为一些原因阻塞请求&#xff0c;浏览器对于同一个域名&#xff0c;同时只能有4个连接&#xff08;这个根据浏览器内核不同可能会有所差异&#xff09;&#xff0c;超过浏览器最大连接数限制&…

(UI自动化测试web端)第二篇:元素定位的方法_css定位之css选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第三种写法css选择器&#xff0c;你要根据网页中的实际情况来判断自己到底要用哪一种方法来进行元素定位。每种方法都要多练习&#xff0c;全都熟了之后你在工作当中使用起来元素定位…

MPU6050模块详解:从原理到STM32驱动指南(上) | 零基础入门STM32第八十九步

主题内容教学目的/扩展视频加速度传感器电路连接。手册分析。驱动程序&#xff0c;读出数据。能读出3轴数据。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、MPU6050模块介绍1.1 核心特性1.2 模块化优势 二、MPU6050模块连接方法2.1 硬件连接2.2 电源注意事项 …

STM32 MODBUS-RTU主从站库移植

代码地址 STM32MODBUSRTU: stm32上的modbus工程 从站 FreeModbus是一个开源的Modbus通信协议栈实现。它允许开发者在各种平台上轻松地实现Modbus通信功能&#xff0c;包括串口和以太网。FreeMODBUS提供了用于从设备和主站通信的功能&#xff0c;支持Modbus RTU和Modbus TCP协…

架构师面试(二十二):TCP 协议

问题 今天我们聊一个非常常见的面试题目&#xff0c;不管前端还是后端&#xff0c;也不管做的是上层业务还是底层框架&#xff0c;更不管技术方向是运维还是架构&#xff0c;都可以思考和参与一下哈&#xff01; TCP协议无处不在&#xff0c;我们知道 TCP 是基于连接的端到端…

程序自动化填写网页表单数据

1 背景介绍 如何让程序自动化填写网页表单数据&#xff0c;特别是涉及到批量数据情况时&#xff0c;可以减少人力。下面是涉及到的一些场景&#xff0c;都可以通过相关自动化程序实现。 场景1 场景1&#xff0c;领导安排&#xff0c;通过相关省、市、县、乡镇数据&#xff0…

Razer macOS v0.4.10快速安装

链接点这里下载最新的 .dmg 文件。将下载的 .dmg 映像文件拖入 应用程序 文件夹中。若首次打开时出现安全警告【什么扔到废纸篓】&#xff0c;这时候点击 Mac 的“系统偏好设置”-> “安全性与隐私”-> “通用”&#xff0c;然后点击底部的 “打开”。【或者仍然打开】 对…

如何自动化同义词并使用我们的 Synonyms API 进行上传

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词&#xff0c; 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…

一. 相机模组摆放原理

1. 背景&#xff1a; 相机开发时经常出现因模组摆放问题&#xff0c;导致相机成像方向异常。轻则修改软件、模组返工&#xff0c; 重则重新修改堆叠&#xff0c;影响相机调试进度。因此&#xff0c;设计一个模型实现模组摆放纠错很有必要。 2. 原理&#xff1a; 2.1 口诀&am…

【C++游戏引擎开发】《线性代数》(1):环境配置与基础矩阵类设计

一、开发环境配置 1.1 启用C 20 在VS2022中新建项目后右键项目 1.2 启用增强指令集 1.3 安装Google Test vcpkg安装使用指南 vcpkg install gtest:x64-windows# 集成到系统目录&#xff0c;只需要执行一次&#xff0c;后续安装包之后不需要再次执行 vcpkg integrate inst…

sqli-labs靶场 less 8

文章目录 sqli-labs靶场less 8 布尔盲注 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…

基于大模型的知识图谱搜索的五大核心优势

在传统知识图谱与生成式AI融合的浪潮中&#xff0c;基于大模型的知识图谱搜索正成为新一代智能检索的标杆技术&#xff0c;飞速灵燕智能体平台就使用了该技术&#xff0c;其核心优势体现在&#xff1a; 1. 语义穿透力升级 突破关键词匹配局限&#xff0c;通过大模型的深层语义…

【MySQL】从零开始:掌握MySQL数据库的核心概念(五)

由于我的无知&#xff0c;我对生存方式只有一个非常普通的信条&#xff1a;不许后悔。 前言 这是我自己学习mysql数据库的第五篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的增删查改&#xff0c;没看的同学可以过去看看&#xf…

Java版Manus实现来了,Spring AI Alibaba发布开源OpenManus实现

此次官方发布的 Spring AI Alibaba OpenManus 实现&#xff0c;包含完整的多智能体任务规划、思考与执行流程&#xff0c;可以让开发者体验 Java 版本的多智能体效果。它能够根据用户的问题进行分析&#xff0c;操作浏览器&#xff0c;执行代码等来完成复杂任务等。 项目源码及…

鸿蒙UI开发

鸿蒙UI开发 本文旨在分享一些鸿蒙UI布局开发上的一些建议&#xff0c;特别是对屏幕宽高比发生变化时的应对思路和好的实践。 折叠屏适配 一般情况&#xff08;自适应布局/响应式布局&#xff09; 1.自适应布局 1.1自适应拉伸 左右组件定宽 TypeScript //左右定宽 Row() { …

Elasticsearch-实战案例

一、没有使用Elasticsearch的查询速度698ms 1.数据库模糊查询不走索引&#xff0c;在数据量较大的时候&#xff0c;查询性能很差。需要注意的是&#xff0c;数据库模糊查询随着表数据量的增多&#xff0c;查询性能的下降会非常明显&#xff0c;而搜索引擎的性能则不会随着数据增…

IP数据报报文格式

一 概述 IP数据报由两部分组成&#xff1a;首部数据部分。首部的前一部分是固定长度&#xff0c;一共20字节大小&#xff0c;是所有IP数据报文必须具有的&#xff1b;固定部分后面是一些可选字段&#xff0c;其长度是可变的。 二 首部固定部分各字段意义 &#xff08;1&…

openEuler24.03 LTS下安装Kafka集群

目录 前提条件 Kafka集群规划 下载Kafka 解压 设置环境变量 配置Kafka 分发到其他机器 分发安装文件 分发环境变量 启动Kafka 测试Kafka 关闭Kafka 集群启停脚本 问题及解决 前提条件 安装好ZooKeeper集群&#xff0c;可参考&#xff1a;openEuler24.03 LTS下安…

qt QQuaternion详解

1. 概述 QQuaternion 是 Qt 中用于表示三维空间中旋转的四元数类。它包含一个标量部分和一个三维向量部分&#xff0c;可以用来表示旋转操作。四元数在计算机图形学中广泛用于平滑的旋转和插值。 2. 重要方法 默认构造函数 QQuaternion::QQuaternion(); // 构造单位四元数 (1…

epoch、batch、batch size、step、iteration深度学习名词含义详细介绍

卷积神经网络训练中的三个核心概念&#xff1a;Epoch、Batch Size 和迭代次数 在深度学习中&#xff0c;理解一些基本的术语非常重要&#xff0c;这些术语对模型的训练过程、效率以及最终性能都有很大影响。以下是一些常见术语的含义介绍&#xff1a; 1. Epoch&#xff08;周…