LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理

LVS(Linux Virtual Server)的网络地址转换(NAT)模式是一种在网络层(第四层)实现负载均衡的方法。在NAT模式中,Director Server(DS)充当所有服务器节点的网关,既是客户端请求的入口,也是Real Server响应客户端的出口。以下是LVS NAT模式的工作原理:

  • VIP和DIP:DS拥有两个IP地址,一个是外部的VIP(虚拟IP),作为整个集群的对外服务地址;另一个是内部的DIP(Director IP),与后端的Real Server(RS)位于同一个物理网络中。RS通常使用私有IP地址。

  • 请求处理:客户端发送的请求数据包(源IP为CIP,即客户端IP;目标IP为VIP)首先到达DS。DS的内核空间检查到目标IP是VIP,IPVS模块判断请求的服务是否属于集群服务。

  • 负载均衡:如果是集群服务,DS使用预设的负载均衡算法选择一个RS,并修改请求数据包的目标IP地址为选定的RS的IP(RIP),同时修改源MAC地址为DS的MAC地址,目标MAC地址为RS的MAC地址,然后将数据包发送给RS。

  • RS处理:RS接收到请求后,处理它并准备响应。RS将响应数据包的源IP设置为RIP,目标IP设置为CIP。

  • 响应路由:RS将响应数据包发送回DS,DS再次修改数据包,将源IP更改为VIP,然后转发给客户端。

  • NAT转换:在整个过程中,DS作为NAT设备,负责将请求数据包的源IP从客户端IP转换为DS的VIP,并将响应数据包的源IP从RS的私有IP转换回VIP。

1.2 LVS/NAT模式特点

特点描述
地址转换使用NAT技术将请求的目标IP修改为RS的IP。
流量转发请求经LVS处理,响应直接从RS返回给客户端。
网关角色LVS作为RS的默认网关。
IP地址管理RS使用私有IP,VIP作为集群的公共IP。
性能考虑LVS可能成为瓶颈,因为所有流量都经过它。
安全性隐藏RS的真实IP,提高安全性。
易于配置灵活的配置,LVS和RS不需要在同一个物理网络。
适用性适用于多种网络环境,尤其是在RS分布广泛时。
健康检查LVS提供对RS的健康检查功能。
可扩展性通过增加RS数量水平扩展服务能力。
透明性对客户端透明,客户端不知道负载均衡的存在。
协议支持支持TCP、UDP等协议,适用于多种应用。

重点:在LVS中,NAT模式的请求和响应都经过负载调度器,而DR模式的请求经过负载调度器,但响应直接从真实服务器返回给客户端,不经过负载调度器。

1.3 LVS/NAT模式基本配置

机器名称IP地址子网掩码说明
LVS192.168.110.31255.255.255.0负载均衡器
RS1192.168.110.32255.255.255.0真实服务器1
RS2192.168.110.33255.255.255.0真实服务器2
Client10.10.10.24255.255.255.0客户端

VIP的配置:

VIP名称IP地址子网掩码配置位置
VIP10.10.10.10255.255.255.0LVS的ens224

1.3.1 网络配置

1.3.1.1 LVS网络配置

手动添加一块网卡!

[root@LVS ~]# nmcli connection add type ethernet ifname ens224 con-name ens224
Connection 'ens224' (862fd4d0-b355-4837-9c0e-b44f65083edb) successfully added.
[root@LVS ~]# nmcli connection modify ens224 ipv4.addresses 10.10.10.10/24 ipv4.method manual
[root@LVS ~]# nmcli connection up ens224 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@LVS ~]# nmcli connection show 
NAME                UUID                                  TYPE      DEVICE 
ens160              8c508417-bf3f-4c7d-b1f4-671fd135dd99  ethernet  ens160 
ens224              862fd4d0-b355-4837-9c0e-b44f65083edb  ethernet  ens224 
Wired connection 1  d3eafb69-d94d-36f8-b2ba-fa612d252638  ethernet  --   
[root@LVS ~]# ip address show ens224   #作为VIP
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:d1:a9:f5 brd ff:ff:ff:ff:ff:ffaltname enp19s0inet 10.10.10.10/24 brd 10.10.10.255 scope global noprefixroute ens224valid_lft forever preferred_lft foreverinet6 fe80::1c9c:5880:bcb6:4c2e/64 scope link noprefixroute valid_lft forever preferred_lft forever
​
[root@LVS ~]# ip address show ens160   #作为网关
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:d1:a9:eb brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.110.31/24 brd 192.168.110.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fed1:a9eb/64 scope link noprefixroute valid_lft forever preferred_lft forever
1.3.1.2 配置RS网关
1、LVS-RS1
[root@LVS-RS1 ~]# nmcli connection modify ens160 ipv4.gateway 192.168.110.31  #网关为LVS的ens160
[root@LVS-RS1 ~]# nmcli connection up ens160 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@LVS-RS1 ~]# nmcli connection show ens160 | grep IP4.GATEWAY
IP4.GATEWAY:                            192.168.110.31
2、LVS-RS2
[root@LVS-RS2 ~]# nmcli connection modify ens160 ipv4.gateway 192.168.110.31
[root@LVS-RS2 ~]# nmcli connection up ens160 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@LVS-RS2 ~]# nmcli connection show ens160 | grep IP4.GATEWAY
IP4.GATEWAY:                            192.168.110.31
1.3.1.3 配置客户端地址(SSH连接会断)
[root@Client ~]# nmcli connection modify ens160 ipv4.addresses 10.10.10.24/24
[root@Client ~]# nmcli connection up ens160 
[root@LVS ~]# ssh 10.10.10.24   #复制一个LVS的会话,ssh连接
The authenticity of host '10.10.10.24 (10.10.10.24)' can't be established.
ECDSA key fingerprint is SHA256:VZC8CrnTIve72qGMS4toH88Px76O0yQw6TVoFKQtsuY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.24' (ECDSA) to the list of known hosts.
root@10.10.10.24's password: 
Activate the web console with: systemctl enable --now cockpit.socket
​
Last login: Fri Apr 26 14:53:04 2024
[root@Client ~]# ip address show ens160 
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:ed:bb:87 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 10.10.10.24/24 brd 10.10.10.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feed:bb87/64 scope link noprefixroute valid_lft forever preferred_lft forever 

1.3.2 LVS/NAT配置

1.3.2.1 开启路由转发(临时开启)
[root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@LVS ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward
1
1.3.2.2 LVS配置
[root@LVS ~]# ipvsadm -At 10.10.10.10:80 -s rr
[root@LVS ~]# ipvsadm -at 10.10.10.10:80 -r 192.168.110.32 -m   #注意-m为指定为nat模式
[root@LVS ~]# ipvsadm -at 10.10.10.10:80 -r 192.168.110.33 -m
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.10.10:80 rr-> 192.168.110.32:80            Masq    1      0          0         -> 192.168.110.33:80            Masq    1      0          0   
1.3.2.3 客户端访问
[root@Client ~]# for ((i=1;i<=6;i++)); do curl http://10.10.10.10; done
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
1.3.2.4 修改调度算法
[root@LVS ~]# ipvsadm -Et 10.10.10.10:80 -s wrr
[root@LVS ~]# ipvsadm -et 10.10.10.10:80 -r 192.168.110.32 -m -w 1   #-w为指定权重比
[root@LVS ~]# ipvsadm -et 10.10.10.10:80 -r 192.168.110.33 -m -w 2
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.10.10:80 wrr-> 192.168.110.32:80            Masq    1      0          0         -> 192.168.110.33:80            Masq    2      0          0    #客户端访问测试
[root@Client ~]# for ((i=1;i<=6;i++)); do curl http://10.10.10.10; done
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2

1.4 配置LVS/NAT服务脚本

1.4.1 清除环境

[root@LVS ~]# ipvsadm -C    #清楚服务器列表
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

1.4.2 服务脚本

[root@LVS ~]# vim /etc/init.d/LVS_DR 
#!/bin/bash
​
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.LOCK=/var/lock/ipvsadm.lock
VIP=10.10.10.10
RIP1=192.168.110.32
RIP2=192.168.110.33
​
. /etc/rc.d/init.d/functions
​
start() {PID=`ipvsadm -Ln | grep ${VIP} | wc -l`if [ $PID -gt 0 ]; thenecho "The LVS-DR Server is already running !"else/sbin/ipvsadm -C/sbin/ipvsadm -At $VIP:80 -s rr/sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -m/sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -m/bin/touch $LOCKecho "starting LVS-DR Server is ok !"fi
}
​
stop() {/sbin/ipvsadm -Crm -rf $LOCKecho "stopping LVS-DR server is ok !"
}
​
status() {if [ -e $LOCK ]; thenecho "The LVS-DR Server is already running !"elseecho "The LVS-DR Server is not running !"fi
}
​
case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0
​
​
[root@LVS ~]# chmod +x /etc/init.d/LVS_DR 
[root@LVS ~]# chkconfig --add LVS_DR   #添加为系统服务
[root@LVS ~]# systemctl start LVS_DR.service 
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.10.10:80 rr-> 192.168.110.32:80            Masq    1      0          0         -> 192.168.110.33:80            Masq    1      0          0    
​
[root@LVS ~]# systemctl stop LVS_DR.service   #停止
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

1.4.3 客户端访问

[root@Client ~]# for ((i=1;i<=6;i++)); do curl http://10.10.10.10; done
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1

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

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

相关文章

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入&#xff0c;各个组件、微服务的数量、深度在不断增加。由于算网是个人项目&#xff0c;我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻&#xff0c;所以MVP的内容还是在不断变化&…

【高阶数据结构】并查集

并查集 并查集1、概念2、根据人找编号 / 根据编号找人&#xff08;简单介绍一下并查集&#xff09;&#xff08;1&#xff09;代码展示&#xff08;2&#xff09;调试结果 3、并查集操作和演示题目&#xff08;1&#xff09;并查集操作i、思路ii、总体代码 &#xff08;2&#…

Tokitsukaze and Average of Substring

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和。 开一个int类型的前缀和数组pre[30][N]&#xff08;pre[i][j]表示某字符转成的数字 i 在一段区间的前缀个数。因为字母表有‘a’~z…

【Unity 组件思想-预制体】

【Unity 组件思想-预制体】 预制体&#xff08;Prefab&#xff09;是Unity中一种特殊的组件 特点和用途&#xff1a; 重用性&#xff1a; 预制体允许开发者创建可重复使用的自定义游戏对象。这意味着你可以创建一个预制体&#xff0c;然后在场景中多次实例化它&#xff0c;…

猿人学第七题-动态字体-随风漂移

前言&#xff1a;该题主要是考对fontTools.ttLib.TTFont的操作&#xff0c;另外就是对字典互相映射的操作 一、woff文件存储 from fontTools.ttLib import TTFont #pip install fontTools def save_woff(response):woff response[woff]woff_file base64.b64decode(woff.enc…

Java Jackson-jr 库是干什么用的

Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择&#…

uniapp动态设置Tabbar

一套小程序及app可能会有多个用户角色&#xff0c;多者能看到的内容应该是不一样的。 实现原理 舍弃uniapp原生的tabbar&#xff0c;使用uView插件下的u-tabbar导航插件来实现。介绍 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架uView UI&#xff0c;是…

JavaScript百炼成仙自学笔记——2

一、循环遍历&#xff1a; 方式一 for(var i0;i<10;i){console.log(i); }方式二 var i 0; while(i < 100){console.log(i);i; }细看代码就是 先定义变量i&#xff0c;再执行{}中的代码&#xff0c;最后改循环变量的值 二、遍历 什么事遍历&#xff1f; 什么时候会用…

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;部分常用命令说明二-CSDN博客 CMakeLi…

基于springboot+vue+Mysql的自习室预订系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

谈谈Tcpserver开启多线程并发处理遇到的问题!

最近在学习最基础的socket网络编程&#xff0c;在Tcpserver开启多线程并发处理时遇到了一些问题&#xff01; 说明 在linux以及Windows的共享文件夹进行编写的&#xff0c;所以代码中有的部分使用 #ifdef WIN64 ... #else ... #endif 进入正题&#xff01;&#xff01;&…

Unity Navigation 入门(新版)

概述 在游戏的制作过程中&#xff0c;寻路功能一定是非常重要的部分&#xff0c;他可以为主角寻路&#xff0c;也可以运用到敌人追击等&#xff0c;相比于自己实现的难度&#xff0c;使用寻路组件就显得简单的多&#xff0c;那接下来就开始学习这部分的内容吧 1.安装AI Naviga…

MySQL 运维篇

回顾基本语句&#xff1a; 数据定义语言(DDL) 这类语言用于定义和修改数据库的结构&#xff0c;包括创建、删除和修改数据库、 表、视图和索引等对象。 主要的语句关键字包括 CREATE 、 DROP 、 ALTER 、 RENAME 、 TRUNCATE 等。 create database 数据库 &#xff1b; cr…

关于AIGC发展历程的研究报告(原创文章)

摘要&#xff1a; 2022年&#xff0c;Chat GPT和Stable Diffusion展现了AIGC强大的技术实力&#xff0c;拉开了AIGC时代的帷幕。2023年&#xff0c;GPT-4、Midjourney V5等又掀起了人工智能的热潮&#xff0c;2024年2月15日&#xff08;美国当地时间&#xff09;正式对外发布的…

代码随想录day51 | 动态规划P12 | ● 309. ● 714. ●买卖股票总结

309.最佳买卖股票时机含冷冻期 给定一个整数数组 prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&…

《21天学通C++》(第十一章)多态

为什么需要多态&#xff1f; 为了最大限度地减少代码&#xff0c;提高可读性 1.虚函数 虚函数是C中的一种特殊成员函数&#xff0c;它允许在派生类&#xff08;也称为子类&#xff09;中重写&#xff08;覆盖&#xff09;基类的实现&#xff0c;使用virtual进行声明 在C中&am…

【Java EE】多线程(二)Thread 类与常用方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

【Qt QML】Frame组件

Frame&#xff08;框架&#xff09;包含在&#xff1a; import QtQuick.Controls继承自Pane控件。用于在可视框架内布局一组逻辑控件。简单来说就是用来包裹和突出显示其他可视元素。Frame不提供自己的布局&#xff0c;但需要自己对元素位置进行设置和定位&#xff0c;例如通过…

【JavaEE 初阶(二)】线程安全问题

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.synchronized2.1例子2.2synchronized修饰代码块2.3 synchronized修饰方法2.4sy…