栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

负载均衡lvs DR模式

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

负载均衡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作调度器、server23作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         

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

所以在server23

[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:  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,在server23的把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 &

在server23上面安装该插件

[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)

23修改策略
进来(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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/345858.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号