百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Nginx合集-高可用(LVS-DR)

wptr33 2025-08-06 23:25 47 浏览

LVS介绍

LVS 是 Linux Virtual Server 的简写,即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。此项目在 1998 年 5 月由章文嵩博士成立,是国内最早出现的自由软件项目之一,是根据 iptables 的实现来开发的,所以使用的时候会和 iptables 相类似

官网:The Linux Virtual Server Project

中文站点: LVS中文站点

LVS三种模式介绍

  1. NAT模式(网络地址映射)
  2. IP TUN模式(IP Tunneling IP隧道)
  3. DR模式(Direct Routing 直接路由)

不同的转发模式决定了不同的的网络结构

NAT模式

NAT 模式(即:网络地址映射)其工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程

  1. DNAT:目标地址转换,改变的是目标地址
  2. SNAT:源地址转换,改变的是源地址

NAT 模式就是使用 SNAT 和 DNAT 技术完成报的转发,NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,非常节省成本,但是整个系统的性能受到限制。因为执行 NAT 每次需要重写数据包,有一定的延迟,另外,大部分应用有 80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对LVS形成很大压力,容易成为瓶颈

IP TUN模式

IP TUN(IP Tunneling 即 IP隧道)当 LVS 分配请求到不同的 real server,real server 处理请求后直接回应给用户,这样 LVS 仅处理客户机与服务器的一半连接。IP TUN 技术极大地提高了 LVS 的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。real server 可以在任何 LAN 或 WAN 上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。但此模式要求所有服务器必须支持 IP 隧道协议,因此只能在 linux 下使用,在 windows 无法使用

DR模式

DR(即 Direct Routing 直接路由)与 IP TUN 类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性,DR 与 IP TUN 相比,没有 IP 封装的开销,但由于采用物理层(修改 MAC地址)技术,所有服务器都必须在同一个局域网

DR 和 IP TUN 的区别:

DR 与 IP TUN 相比,没有 IP 封装的开销,但由于采用数据链路层(修改 MAC地址)技术,所有服务器都必须在一个物理网段

三种模式对比


NAT模式

IP TUN模式

DR模式

对服务器要求

任何操作系统均支持

必须支持IP隧道协议,目前只有Linux支持

支持虚拟网卡,且可以禁用ARP响应

网络要求

局域网

局域网或广域网

局域网

支持的节点数

10~20个,视Director处理能力而定

可以支持到100个节点

可以支持到100个节点

安全性

较高,可隐藏real server

较差,real server 容易暴露

较差,real server 容易暴露

IP要求

仅需要一个合法IP地址作为VIP

除VIP外,每个服务器需要拥有合法IP地址可以直接路由至客户端

除VIP外,每个服务器需要拥有合法IP地址可以直接路由至客户端

拓展性

很好

特点

地址转换

封装IP

修改MAC地址

LVS配置实践

LVS-DR(直接路由)+ NGINX ——负载均衡集群部署及测试案例

环境准备

操作系统

IP

角色

备注

centos7 7.9.2009

10.0.53.77

vip虚拟ip



10.0.53.75

lvs



10.0.53.81

nignx-1



10.0.53.82

nignx-2



10.0.53.83

nignx-3


LVS服务器配置(10.0.53.75)

从Linux2.4内核及以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能

uname -r
find /lib/modules/$(uname -r)/ -iname "**.ko*" | cut -d/ -f5-  | grep ip_vs

安装LVS管理工具:ipvsadm

yum -y install ipvsadm
ipvsadm -v

虚拟ip配置

在ens192设备上绑定了一个虚拟设备ens192:0,同时设置了一个虚拟IP是10.0.53.77,然后指定广播地址也为10.0.53.77

虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255;因为有若干机器要使用同一个ip地址,用本身做广播地址和把子网掩码设成4个255就不会造成ip地址冲突了,否则lvs将不能正常转发访问请求。

ifconfig ens192:0 10.0.53.77 broadcast 10.0.53.77 netmask 255.255.255.255 up
#需要安装net-tools工具

服务器添加路由规则

route add -host 10.0.53.77 dev ens192:0

启用内核系统的包转发功能

echo "1" >/proc/sys/net/ipv4/ip_forward

清除原有lvs转发规则

ipvsadm --clear

添加虚拟IP规则(-s rr表示采用轮询策略, :80表示负载转发的端口是80)

ipvsadm -A -t 10.0.53.77:80 -s rr

在虚拟IP中添加服务规则

在新加虚拟IP记录中添加三条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式;
注意: lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口一致,这里都使用了80端口

ipvsadm -a -t 10.0.53.77:80 -r 10.0.53.81:80 -g
ipvsadm -a -t 10.0.53.77:80 -r 10.0.53.82:80 -g
ipvsadm -a -t 10.0.53.77:80 -r 10.0.53.83:80 -g

重启LVS

ipvsadm

nginx服务器配置(10.0.53.81、82、83)

nginx安装配置(略)

额外配置

在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。

在每个回环设备上绑定了一个虚拟IP地址

ifconfig lo:0 10.0.53.77 broadcast 10.0.53.77 netmask 255.255.255.255 up

添加路由规则

route add -host 10.0.53.77 dev lo:0

关闭arp解析

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

启动nginx

测试

IP轮询验证

浏览器访问虚拟ip:10.0.53.77,观察响应的后端nginx的ip

编辑

编辑

编辑

健康检查验证

停掉一个nginx服务测试:LVS具有健康检测机制,不会丢请求

关停10.0.53.81

编辑

不再访问10.0.53.81

编辑

编辑

重启10.0.53.81

编辑

重新访问10.0.53.81

编辑

参考文档

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

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...