当前位置: 首页 > news >正文

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

1.前言

个人备忘笔记,欢迎探讨。

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

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

之前写过一篇lvs-nat模式。实验起来相对顺利。dr模式最大特点是响应报文不经调度器,而是直接返回客户机。

dr模式分同网段和不同网段。同网段实现简单,容易达成效果,而不同网段需要思路清晰,我更感兴趣的事实验不同网段。

不同网段时,我用了一个centos8做路由器,用于把后端服务器的http响应返回给客户机。起初tcpdump抓包实验可以在内网接口抓到响应包,但外网接口抓不到包。已经开启内核转发和关闭防火墙,甚至selinux。就是响应包过不去。为这个曾怀疑人生,但还是在努力和机缘下解决了,详见下文。

因为有上一篇铺垫,所以下面涉及网路、系统操作、web服务器,就不再赘述,重点是思路和过程。

2.实验目标:

使用调度方法rr,配合web短连接,最终在客户端访问director8080端口,要看到网页在node1/2之间切换。

数据包走向:客户机 > director > rs > 客户机。

3.客户机准备:

两台客户机如下:

物理机win11,cip=192.168.0.2。

虚拟机win11一块网卡,VMware桥接,cip=192.168.0.116。

2.同网段实验

2.1.网络结构

物理机win11的cip,虚拟机win11的cip,虚拟机director的dip和vip,虚拟机rs的rip,都桥接在一起。

还是从centos8克隆出director,rs(node1,node2)。它们只有一个桥接网卡。也就是都跟物理机一个网络。每一个centos都启用内核转发ip_forward=1。

还是要强调一下,我实验设置网路ip的工具是用NetworkManager,亦即nmcli和nmtui,用ifconfig查看。设置ip后要使用nm把连接重启一下,仅适用systemctl restart NetworkManager不行。

2.2.调度器director网络:

一块vmware桥接网卡。使用nmtui设置dip=192.168.0.3,设置完要把ens160这个连接禁用启用一下,重启连接后ifconfig可以看到ip生效。

接着把vip绑定在ens160:0别名上。

还需要加一条路由,确保请求数据包由vip响应。

2.3.后端服务器rs(node1/2)网络:

一块vmware桥接网卡,分别设置rip=192.168.0.4/5,gw=192.168.0.1(家里的路由器)。

配置好以后,director的dip192.168.0.3,vip192.168.0.8,rs的192.168.0.4,192.168.0.5,互相能ping通。

为实现dr模式三种方法,但最易用是修改内核参数。应该先修改参数再给rs绑定vip,以免局域网故障。

然后把vip绑定到lo:0别名,同时给一条路由。这条路由的意义就是让接受包途径有vip的接口,回应时把源地址“伪装”成vip。

rs上以前配置过lvs-nat测试的nginx站点,分别显示“page in node1”和“page in node2”以示区别。

设置好web服务后,稳妥起见可以分别对rip访问试试,因为现在是相同网络下。不再赘述。

2.4.调度器director策略:

dr模式不支持端口映射。

2.5.lvs-dr同网段效果:

以上设置好后,分别在物理机或虚拟机win11上尝试访问192.168.0.8:8080,刷新会看到两个页面切换。

实验成功。

3.不同网段实验:

3.1.网络结构:

下图中客户机只画了一个,不影响。

调度器需要两个网卡,一个对外一个对内。方便起见,对外接口直接和客户机桥接。对内使用vmware主机网络vmnet1。

两台后端服务器(RealServer)都是一个网络接口,使用vmnet1。

添加一个路由,两个网络接口,一个对外一个对内。

3.2.调度器director网络:

需要两个网卡,ens160对外vip=192.168.0.8,ens224对内dip=172.16.100.2。

策略修改,不用像上述“lvs-dr同网段实验”那样加路由(删掉那条即可)。

3.3.后端服务器rs网络:

由于基于上一个“lvs-dr同网段”实验,rs已经修改内核参数,lo:0接口上已经绑定vip,且做好路由。因此只是改rip:

node1是172.16.100.3,node2是172.16.100.4,网关都指向路由172.16.100.254,其它不用动。

3.4.路由router:

也是centos8克隆的,两块网卡,ens160对外192.168.0.254,ens224对内172.16.100.254,开启内核转发。它作为内网网关。我希望http的回应包先到达router的ens224内网口,再转发到ens160外网口,从而实现路由。

先说结论:原本centos8配置好网口,并开启内核转发ip_forward,它就是个天生的路由器,啥也不用动。但由于rs的回应包用vip伪装了源地址,所以router还需要设置内核参数rp_filter。就像设置rs的arp_ingore和arp_announce一样。

        #sysctl -w net.ipv4.conf.all.rp_filter=0

        #sysctl -w net.ipv4.conf.default.rp_filter=0(默认就是)

这里划重点,起初实验,我就卡在这里了。一定要详细记录并自省!

使用tcpdump分别在两个接口抓包。rs使用ping客户机时,可以明确看到ping的icmp包,在ens224和ens160都有抓到,亦即顺利通过路由到达ens160接口。当然,由于没处理ping回应,所以在后端服务器rs的命令行不一定看到ping通。

但是,lvs-dr的rs回应包,原本我们希望它能经此路由到达客户机,但就是通不过。使用tcpdump可以在ens224内网接口抓到,在ens160外网接口抓不到,显然没通过。

已经反反复复确认,有开启内核转发,关闭了防火墙firewalld和selinux。甚至咨询了以前的网工兄弟,他提到vmware有时候会跟实际网络不一样,有可能过滤掉“伪装”过的包,建议开启混杂模式。

于是又研究混杂模式,实际上tcpdump本身就是混杂模式,查看系统日志也看到每次抓包它就会临时开启混杂模式。所以问题不在这。

更甚至,我尝试构建了更复杂的网络,让vip和客户机不在一个网络,效果还是一样,不行。

解决:

还是要时刻熟知linux网络实现原理才行,当学习防火墙iptables时就知道,osi四层以下工作在内核空间,防火墙通过钩子函数工作在内核,跟ipvs一样,只要在内核它就时刻存在,只需要我们使用用户空间工具定制策略它就生效。而所谓数据包走向,先经过网络接口(网卡)再进入内核,然后内核决定如何转发或使用策略,属于本机该接收的包,会发给用户空间进程……总之,一旦想到原理,就立刻定位了故障点:

根据上述思路搜索原因,结果是,内核确实默认开启了“伪装”包过滤,内核参数rp_filter,就像上面后端服务器rs中修改内核参数一样。它是net.ipv4.conf.all.rp_filter和net.ipv4.conf.default.rp_filter。

改完这个参数,立竿见影,成功了。

3.5.lvs-dr不同网段效果:

每次刷新页面会在两个后端服务器上切换,不一定非是1-2-1-2这样,也可能是1-2-2-1,总之rr策略是轮巡的,负载均衡。

4.总结

本文3.4部分是最耽误我时间的,也许对于高手早就完成了。而我一开始就打算做不同网段实验一次搞定,结果总不成功,但不服输。最终还是从最简单同网段开始,需要先建立信心。

痛定思痛,基础知识还是要扎实,善于深入思考和定位问题。其实,我所谓的深入,可能对于大家来说太简单。不怕暴漏自己弱点。所以总结几点:

4.1.ping:

能否ping通,不一定能作为网络通不通的标准。ping包有去有回才“ping通”。像本文记录的,只要ping过去就可以,实际是看不到ping通的。

4.2.tcpdump:

上述我常用的:

#tcpdump -i ens224 src 192.168.0.8 and port 8080 -nn 

#tcpdump -i ens160 src 192.168.0.8 and port 8080 -nn

总之看man手册就都有了,常用这些对我足够了,挺好用的。

journalctl命令可以看到tcpdump本身就是混杂模式工作的。

4.3.结束:

本文完。


http://www.mrgr.cn/news/97079.html

相关文章:

  • swift-oc和swift block和代理
  • Dive into Deep Learning - 2.4. Calculus (微积分)
  • 如何实现浏览器中的报表打印
  • yolov12检测 聚类轨迹运动速度
  • 【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react)
  • Vanna:用检索增强生成(RAG)技术革新自然语言转SQL
  • #SVA语法滴水穿石# (002)关于 |-> + ##[min:max] 的联合理解
  • JAVA线程安全
  • orangepi zero烧录及SSH联网
  • c++项目 网络聊天服务器 实现
  • Neo4j操作数据库(Cypher语法)
  • Java 大视界 -- 基于 Java 的大数据机器学习模型在图像识别中的迁移学习与模型优化(173)
  • Linux线程同步与互斥:【线程互斥】【线程同步】【线程池】
  • leetcode117 填充每个节点的下一个右侧节点指针2
  • hackmyvm-Principle
  • 《概率论与数理统计》期末复习笔记_下
  • QGIS实战系列(六):进阶应用篇——Python 脚本自动化与三维可视化
  • AI医疗诊疗系统设计方案
  • 《概率论与数理统计》期末复习笔记_上
  • Flink 1.20 Kafka Connector:新旧 API 深度解析与迁移指南