负载均衡lvs DR模式

前言

client -> dns -> cdn(cache) -> server
客户端先访问dns然后到缓存,要不然流量太大不能直接访问server。
我们要做的时server的负载均衡
aliyun
client -> dns -> cdn(cache) -> SLB server SLB负载均衡层,就是负载均衡加高可用
LB(负载均衡) + HA(高可用) 高可用确保负载均衡器正常运行对后端server能均衡调度
client -> dns -> cdn(cache) -> LB +HA server
client -> dns -> cdn(cache) -> LB +HA -> web server(处理静态的)多个->(处理动态的)比如: tomcat(应用服务器)多个 处理java的->
每个多个都会有负载均衡的存在,每层都有负载均衡
web如何调度服务器,所以有条件会添加逻辑接入层,后端应用服务器太多,前端无法在代码写个具体的连接,所以接入一个统一的调度层逻辑层。
client -> dns -> cdn(cache) -> LB +HA -> web server(处理静态的)多个->逻辑接入层->(处理动态的)比如: tomcat(应用服务器)多个 处理java的 -> db -> storage(存储)
应用放在物理机上面维护成本高,所以要把这些全部放在容器里面。
docker + k8s + openstack + hadoop (大数据,分布式文件系统加并行运算)+ gp(更火,大数据)

复习要看lvs原理

lvs文档

中文文档

lvs搭建

1.实验环境:server1作调度器、server2\3作really server。
通过1来负载均衡2和3两个节点(web server)
server1:

[root@server1 yum.repos.d]# yum install ipvsadm -y

这个工具是用户端专门写lvs策略的
ipvsadm属于lvs内核功能,安装完成后在内核会有模块安装好
linux的内核模块是动态的,当你使用时,它会自动为你加载,也可以手动加载。

[root@server1 yum.repos.d]# lsmod | grep ip_vs
ip_vs                 145497  0 
nf_conntrack          133095  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

server2和3安装httpd作测试:

[root@server2 ~]# yum install httpd -y
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
[root@server2 html]# echo server2 > index.html
[root@server2 html]# ls
index.html
[root@server2 html]# curl localhost
server2

server3重复server2的操作

相关扩展

[root@server1 yum.repos.d]# ipvsadm --help

查阅本地的文档

[root@foundation38 ~]# cd /run/media/kiosk/Backup\ Plus/pub/docs/lvs/
[root@foundation38 lvs]# evince 阿里lvs.pdf &

A添加一个服务 -t tcp服务 172.25.138.100虚拟ip,该ip要没被占用,-s调度 ,rr最均衡的。

[root@server1 yum.repos.d]# ipvsadm -A -t 172.25.138.100:80 -s rr

-g dr模式直连,将really服务器添加进去

[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.138.100:80 -r 172.25.138.2:80 -g 
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.138.100:80 -r 172.25.138.3:80 -g 

TCP 172.25.138.100:80 rr 创建的虚拟服务,可多个,里面调度不同的主机。

[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.138.100:80 rr
  -> 172.25.138.2:80              Route   1      0          0         
  -> 172.25.138.3:80              Route   1      0          0         

但是虚拟ip我们没添加

[root@server1 yum.repos.d]# ip addr | grep 172.25.138.100

添加虚拟ip

[root@server1 yum.repos.d]# ip addr add 172.25.138.100/24 dev eth0

宿主机访问不了

[root@foundation38 ~]# curl 172.25.0.100

但是server1这边接受到了请求

[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.0.100:80 rr
  -> 172.25.0.2:80                Route   1      0          3         
  -> 172.25.0.3:80                Route   1      0          2         

证明:数据包到调度器后,调度器把数据调度到2\3,证明2、3无法相应请求
因为是tcp协议,tcp要满足三次握手,四次分手(必问)
因为,原地址src:172.25.0.250 目标地址dst:172.25.0.100 经过调度器,目标地址变成0.2\0.3
对于客户端目标地址没变,tcp三次握手目标是不可以改变,地址不变,所以它的数据包被转发在2层被转发到server2时,
它的src和dst依旧依旧0.100,然后server2\3没有100vip,认为走错路,数据包被机器内核丢弃掉。

所以在server2\3

[root@server2 ~]# ip addr add 172.25.138.100/32 dev eth0
[root@server3 ~]# ip addr add 172.25.138.100/32 dev eth0

测试client:

[kiosk@foundation38 Desktop]$ curl 172.25.138.100
server3
[kiosk@foundation38 Desktop]$ curl 172.25.138.100
server2

问题1,DR模式需要相同VIP,要不然完成不了三次握手,同时因为相同VIP造成arp缓存的问题。

本地arp缓存的地址:

[root@foundation38 ~]# arp -an | grep 100
? (172.25.138.100) at 52:54:00:58:2e:f1 [ether] on br0

删掉arp本地缓存的地址:

[root@foundation38 ~]# arp -d 172.25.138.100
[root@foundation38 ~]# arp -an | grep 100

arp协议在本地在一个VLAN会以广播的形式来学习
ping通一下相当于又一次学习一下
拿到的地址不一样了,一样的话就正常,一次server2 一次server3,现在地址变了。
地址变成server3了

[root@foundation38 ~]# ping 172.25.138.100
[root@foundation38 ~]# arp -an | grep 100
? (172.25.138.100) at 52:54:00:57:08:6c [ether] on br0

所有都变成sevrer3了

[root@foundation38 ~]# curl 172.25.138.100
server3
[root@foundation38 ~]# curl 172.25.138.100
server3

同时调度器收不到响应了

[root@server1 ~]# ipvsadm -ln
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.138.100:80 rr
  -> 172.25.138.2:80              Route   1      0          0         
  -> 172.25.138.3:80              Route   1      0          0         

arp缓存地址变成sever3了

[root@server3 ~]# ip addr 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:57:08:6c brd ff:ff:ff:ff:ff:ff
52:54:00:57:08:6c这个地址和上面宿主机arp缓存地址一样了

arp学习谁,先响应就先缓存谁学习谁。同一个VLAN,地址响应级别是等同的。
原因:三个节点在同一个VLAN下拥有同一个vip地址冲突

解决方法1,直接修改内核,禁用arp协议。

因为arp协议在一个广播,它不能过路由,因此它必须在一个VLAN,在server2\3的把arp响应屏蔽掉。
在内核中禁用掉:1.在内核直接修改内核参数
2.rhel系统提供的方法arp防火墙,只针对arp协议有效。
跟iptable无关,iptable是包过的火墙,所有的数据包都过它。
使用方法2:
相关文档在宿主机

Plus/pub/docs/rhel6cluster
[root@foundation38 rhel6cluster]# evince Red_Hat_Enterprise_Linux-6-Virtual_Server_Administration-zh-TW.pdf &

在server2\3上面安装该插件

[root@server2 ~]# yum install -y arptables_jf
[root@server3 ~]# yum install -y arptables_jf

arp防火墙有3条链,input(数据包进来)、output(出去)、forward

[root@server2 ~]# arptables -L
Chain INPUT (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)

2\3修改策略
进来(INPUT):
-A添加在INPUT链路添加一条策略
当INPUT进来 -d 访问的目标地址是172.25.138.100 -j 这个动作 DROP丢弃

[root@server2 ~]# arptables -A INPUT -d 172.25.138.100 -j DROP

出去arp(OUTPUT)
arp协议本身也是广播协议,接到VLAN上,它会自动把自己的mac地址传到广播让其他主机进行学习。

如果以172.25.138.100出去,转换该地址172.25.138.2(转换成eth0该发布网站的固定地址)

[root@server2 ~]# arptables -A OUTPUT -s 172.25.138.100 -j mangle --mangle-ip-s 172.25.138.2

保存该策略,该策略是在内存中,运行内核会自动生效。
但我们要保存在内核中,要不然一重启就没了。

[root@server2 ~]# arptables-save  > /etc/sysconfig/arptables 
[root@server2 ~]# cat /etc/sysconfig/arptables 
*filter
:INPUT ACCEPT
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -j DROP -d 172.25.138.100 
-A OUTPUT -j mangle -s 172.25.138.100 --mangle-ip-s 172.25.138.2 

你每次重启,你系统在服务会自动读取该配置文件,生效。

[root@server2 ~]# systemctl status arptables.service 

刷新内存的arp策略,重启该服务还在,因为系统读取该arp文件了。

[root@server2 ~]# arptables -F
[root@server2 ~]# arptables -L
Chain INPUT (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

Chain FORWARD (policy ACCEPT)

-nL不解析

[root@server2 ~]# systemctl restart arptables.service 
[root@server2 ~]# arptables -nL
Chain INPUT (policy ACCEPT)
-j DROP -d 172.25.138.100 

Chain OUTPUT (policy ACCEPT)
-j mangle -s 172.25.138.100 --mangle-ip-s 172.25.138.2 

Chain FORWARD (policy ACCEPT)

把该策略给server3:

[root@server2 ~]# scp /etc/sysconfig/arptables server3:/etc/sysconfig/

server3:修改下配置,把ip 2改成3

[root@server3 ~]# vim /etc/sysconfig/arptables

client:测试

[root@foundation38 ~]# arp -d 172.25.138.100
[root@foundation38 ~]# curl 172.25.138.100
server3
[root@foundation38 ~]# curl 172.25.138.100
server2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用LVS-DR(Linux Virtual Server - Direct Routing)时,有一些注意事项需要考虑。首先,需要注意LVS-DR的配置和注意事项可能因环境和需求的不同而略有变化,因此建议在实施LVS-DR之前仔细阅读相关文档和指南,并根据实际情况进行适当的调整和配置。 LVS-DR是LVS中最常用和性能最高的一种工作模式,它可以在Linux服务器上实现高可用性和性能增强。 在使用LVS-DR时,有几个需要注意的事项。首先,需要设置正确的网络配置,包括将VIP(Virtual IP)绑定到物理服务器的网络接口上,并配置正确的IP地址和子网掩码。此外,还需要确保物理服务器之间具有正确的网络连通性和路由设置。 另外,需要注意在LVS-DR模式下,真实服务器(Real Server)的响应数据包是直接返回给客户端的,而不经过负载均衡器。因此,需要在真实服务器上配置正确的网络路由和ARP(Address Resolution Protocol)表项,以确保响应数据包能够正确返回给客户端。此外,需要注意在真实服务器上禁用ICMP重定向,以避免网络问题导致的异常行为。 最后,如果在使用LVS-DR时遇到问题或困惑,建议寻求专业人士的帮助和支持。他们可以根据具体情况提供更准确和有效的解决方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [LVS-DR模式](https://blog.csdn.net/Breeze_nebula/article/details/132319087)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值