科普
集群概念
阿里云的SLB 服务
基于工作的协议层次划分
传输层(通用):DNAT 和 DPORT
LVS:
nignx:stream
haproxy:mode tcp
应用层(专用):针对特定协议,常陈伟proxy server
LVS 有4种工作模式,10种调度算法
LVS 集群类型中的术语
VS:virtual server ,director server(DS),dispatcher(调度器),load balancer
RS:real server (lvs) ,upstream server (nginx),backend server(haproxy)
CIP:client IP
VIP:virtual server IP VS 外网的IP
DIP:Director IP VS内网的IP
RIP:Real server IP
访问流程 CIP VIP ==== DIP RIP
LVS 模型
1、LVS-NAT:修改请求报文的目的IP,多目标的DNAT
2、LVS-DR:操作封装新的mac地址
3、lVS-TUN:在原请求IP 报文之外新加一个IP首部
4、LVS-FULLNAT:修改请求报文的源和目标IP【默认内核不支持,需要做二次开发】
LVS-NAT
LVS-NAT:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为挑出得RS的
RIP和PORT 实现转发
(1)RIP 和 DIP 应在同一个IP网络,且应使用私网地址;RS 的网关要指向DIP
(2)请求报文和响应报文都必须经由Director 转发Director 易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS 必须是linux 系统,RS 可以是任意OS 系统
为什么要求RIP 和 DIP 应在同一IP 网络?
实际也可以不在同一网段内,但是中间得换成路由器以及RIP 服务器的网关部署在路由器上
交换机的转发性能优于 路由器
IPVS 位于PREROUTING 和 INPUT 链之间,然后再强制调转到forward--postrouting 转发
LVS-DR[请求报文和响应报文是不同路,不需要都经过LVS,形成三角形]
direcrt router 直接路由模式,需在每台RIP上都配置VIP
其中每台RIP 都配置VIP 会有提示地市冲突问题,因此需要在每台RIP 服务器上关闭arp 通告和 arp 忽略等功能【具体是VIP 的arp 功能禁用,物理网卡不禁用】
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
DR 模式的特点:
(1)Director 和 各RS 都配置有VIP
(2)确保前端路由器将目标IP 为VIP 的请求报文发往Director
在前端网关做静态绑定VIP 和 Director 的MAC地址
在RS 上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
在RIP上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
(3)RS的RIP 可以使用私网地址,也可以是公网地址,RIP 与DIP 在同一IP 网络,RIP 的网关不能指向DIP,
以确保响应报文不会经由Director
(4)RS 和 Director 要在同一物理网络,因为Director 需要发送RIP的mac 请求。
(5)请求报文要经由Director,但响应报文不经由Director,而由RS 直接发往Client
(6)不支持端口映射(端口不能修改)【因为DR 模式下,只修改目的MAC】
(7)RS 可使用大多数OS系统
LVS的TUN 模式
转发方式:不修改请求报文的IP头部(源IP为CIP、目标IP为VIP),而在原IP 报文之外再封装一个IP头部(源IP是DIP,目标IP是RIP)。将报文发往挑选出的目标RS,RS 直接响应给客户端(源IP为VIP,目标IP是CIP)
TUN模式特点:
(1)DIP、VIP、RIP 可以是公网地址
(2)RS的网关一般不能指向DIP
(3)请求报文要经由Director,但响应不经由Director
(4)不支持端口映射
(5)RS的OS 支持隧道功能
LVS FULLNAT【默认内核不支持,需要编译修改内核参数】
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --- > DIP
VIP--- > RIP
fullnat 模式特点:
(1)VIp是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此RIP的网关一般不会指向DIP
(2)RS 收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
(3)请求和响应报文都经由Director
(4)相对NAT 模式,可以更好的视线LVS --- Realserver 间跨VLAN通讯
(5)支持端口映射
LVS-FUllNAT 模式目前阿里内部使用,
LVS 工作模式总结和比较
LVS-NAT 与LVS-FULLNAT
请求和响应报文都经由Director
LVS-NAT:RIP 的网关要指向DIP,或者做通路由
LVS-FULLNAT:RIP 和 DIP 未必在同一IP 网络,但要能通信
LVS-DR与 lVS-TUN
请求报文要经由Director,但响应报文由RS 直接发往Client
LVS-DR :通过封装新的MAC 首部实现,通过MAC 网络转发
LVS-TUN:通过在原IP 报文外封装新IP报头实现转发,支持远距离通信
LVS 调度算法【灵魂】
ipvs scheduler:根据其调度时是否考虑各RS 当前的负载状态
分为两种:静态方法和动态方法
静态方法:
仅根据算法本身进行调度:
1、RR :roundbrobin 轮询
2、WRR:weighted RR ,加权轮询
3、SH:source hashing ,实现session sticky,源IP 地址hash,将来自于同一个IP地址的请求始终发往第一次挑中的RS 。从而实现会话绑定【适合后端服务器相对固定的情况下】
4、DH:Destionation hashing,目标地址 哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至
第一次挑中的RS ,典型使用场景是正向代理缓存场景中的负载均衡,如:带宽运营商
动态方法:
主要根据每RS 当前的负载状态及调度算法进行调度overhead=value 较小的RS 将被调度
1、LC:least connections 适用于长连接应用
overhead=activeconns*256 + noactiveconns
2、WLC:weighted LC,默认调度方法
overhead=(activeconns*256 + noactiveconns)/ weight
3、SED shortest expection delay ,初始链接高权重优先
overhead=(activeconns+1)*256 / weight
4、NQ: nerver queue,第一次均匀分配,后续SED
5、LBLC:locality-based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with replication,带复制功能的LBLV,解决LBLC 负载不均衡的问题,从负载重的复制
到负载轻的RS
内核版本4.15 版本后新增调度算法:FO 和 OVF
LVS 相关软件
程序包:ipvsadm
用户空间的程序软件,用于管理LVS的
ipvsadm核心功能:
集群服务管理:增删改
集群服务的RS管理:增删改
查看
ipvsadm工具用法:
注意 -g -i -m
-g 表示DR模式
-i 表示TUN 模式
-m 表示NAT 模式
LVS 防火墙标签
在Director 主机基于标记定义集群服务
LVS 会话保持
对于长连接的服务需要加入
ipvsadm -E -f 10 -s wrr -p
加入-p persistent 持久,官方文档写着默认300s ,实际敲下后显示360s
LVS 实现
LVS-NAT 模式案例
默认算法是WLC
ipvsadm -A -t 172.20.200.200:80 -s rr
ipvsadm -a -t 172.20.200.200:80 -r 10.1.1.1:80 -m -w 3
ipvsadm -a -t 172.20.200.200:80 -r 10.1.1.2:80 -m -w 3
ipvsadmi -Ln //查看IPvs 规则 ------- /proc/net/ipvs
ipvsadm -Lc //查看IPvs 链接数 ------- /proc/net/ipvs_conn
修改调度算法
ipvsadm -E -t 172.20.200.200:80 -s wrr
保存: 建议保存至 /etc/sysconfig/ipvsadm 【不然重启就丢失了】
ipvsadm-save > /PATH/TO>IPVSADM_FILE
ipvsadm -s > /PATH/TO>IPVSADM_FILE
systemctl stop ipvsadm.service #会自动保存规则至/etc/sysconfig/ipvsadm
启动ipvsadm 服务时候注意相关报错,需要新建相关文件 /etc/sysconfig/ipvsadm
并且注意LVS 需要开启 forward转发功能
cat /etc/sys/net/ipv4/ip_forward
echo 1 > /etc/sys/net/ipv4/ip_forward
LVS-DR 单网段的案例
一、internet hostname -I route -n 二、路由器配置 echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf sysctl -p 修改路由器的转发模式 或者使用 echo 1 > /proc/sys/net/ipv4/ip_forward 此项只是暂时写在内存,临时生效
路由器的网卡配置
三、RS的配置
yum install -y httpd
hostname > /var/www/html/index.html
systemctl start httpd
修改内核参数以及VIP 网卡配置
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo0/arp_announce
修改arp 参数参考如上,不发送免费arp,以及对arp 不响应
ifconfig lo0:1 10.0.0.100/32
注意:先修改内核参数,再配置IP 地址,避免IP地址冲突
四、VS的配置
ifconfig lo0:1 10.0.0.100/32
注意lVS 不支持端口映射,写上端口映射也没啥用,实际不生效
注意:LVS 是否需要有路由指向网关?
需要,因为LVS 在替换RIP mac的时候,也会查看SIP 是否可达,判断有误路由,有路由则会替换
RIP mac 进行转发。
tcpdump -i eth0 -nn -e
//-e 以太网链路层信息
LVS-DR 多网段的案例
LVS 最大的问题,缺少对后端服务器健康性检查
借助keepalived 组件
ldirectord
这个软件实现HA功能,比较老旧,现在都有keepalived 方案替代解决
idirectord 在centos6 7 上实现的,centos 8后被遗弃
补充:
对于内核参数补充说明
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP 配置在本地主机的接收到请求报文的接口上时,才给予相应。
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告