前言
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]
这个工具是用户端专门写lvs策略的 ipvsadm属于lvs内核功能,安装完成后在内核会有模块安装好 linux的内核模块是动态的,当你使用时,它会自动为你加载,也可以手动加载。
[root@server1 yum.repos.d]
ip_vs 145497 0
nf_conntrack 133095 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
server2和3安装httpd作测试:
[root@server2 ~]
[root@server2 ~]
[root@server2 ~]
[root@server2 html]
[root@server2 html]
[root@server2 html]
index.html
[root@server2 html]
server2
server3重复server2的操作
相关扩展
[root@server1 yum.repos.d]
查阅本地的文档
[root@foundation38 ~]
[root@foundation38 lvs]
A添加一个服务 -t tcp服务 172.25.138.100虚拟ip,该ip要没被占用,-s调度 ,rr最均衡的。
[root@server1 yum.repos.d]
-g dr模式直连,将really服务器添加进去
[root@server1 yum.repos.d]
[root@server1 yum.repos.d]
TCP 172.25.138.100:80 rr 创建的虚拟服务,可多个,里面调度不同的主机。
[root@server1 ~]
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
[root@server1 yum.repos.d]
宿主机访问不了
[root@foundation38 ~]
但是server1这边接受到了请求
[root@server1 ~]
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 ~]
[root@server3 ~]
测试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 ~]
? (172.25.138.100) at 52:54:00:58:2e:f1 [ether] on br0
删掉arp本地缓存的地址:
[root@foundation38 ~]
[root@foundation38 ~]
arp协议在本地在一个VLAN会以广播的形式来学习 ping通一下相当于又一次学习一下 拿到的地址不一样了,一样的话就正常,一次server2 一次server3,现在地址变了。 地址变成server3了
[root@foundation38 ~]
[root@foundation38 ~]
? (172.25.138.100) at 52:54:00:57:08:6c [ether] on br0
所有都变成sevrer3了
[root@foundation38 ~]
server3
[root@foundation38 ~]
server3
同时调度器收不到响应了
[root@server1 ~]
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 ~]
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]
在server2\3上面安装该插件
[root@server2 ~]
[root@server3 ~]
arp防火墙有3条链,input(数据包进来)、output(出去)、forward
[root@server2 ~]
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 ~]
出去arp(OUTPUT) arp协议本身也是广播协议,接到VLAN上,它会自动把自己的mac地址传到广播让其他主机进行学习。
如果以172.25.138.100出去,转换该地址172.25.138.2(转换成eth0该发布网站的固定地址)
[root@server2 ~]
保存该策略,该策略是在内存中,运行内核会自动生效。 但我们要保存在内核中,要不然一重启就没了。
[root@server2 ~]
[root@server2 ~]
*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 ~]
刷新内存的arp策略,重启该服务还在,因为系统读取该arp文件了。
[root@server2 ~]
[root@server2 ~]
Chain INPUT (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
-nL不解析
[root@server2 ~]
[root@server2 ~]
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 ~]
server3:修改下配置,把ip 2改成3
[root@server3 ~]
client:测试
[root@foundation38 ~]
[root@foundation38 ~]
server3
[root@foundation38 ~]
server2
|