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三种模式介绍
- NAT模式(网络地址映射)
- IP TUN模式(IP Tunneling IP隧道)
- DR模式(Direct Routing 直接路由)
不同的转发模式决定了不同的的网络结构
NAT模式
NAT 模式(即:网络地址映射)其工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程
- DNAT:目标地址转换,改变的是目标地址
- 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
ipvsadmnginx服务器配置(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字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
