背景:业务中主要是TCP/SSL连接,要做四层负载均衡。
之前做负载均衡,调研了nginx(见之前的nginx实现后端服务负载均衡和nginx负载均衡监测后台服务状态)。
nginx作为一个应用,做四层负载均衡效率低。lvs是linux内核的,非应用,用它做四层负载均衡效率更高更合适。所以会见到lvs+nginx做四层七层负载均衡这种组合。
一般我们遇到的:
负载均衡集群
高可用集群
和分布式的区别:
集群是一群机器做同样的事情,分布式是不同的机器负责不同的事情
常用的软件负载均衡:
lvs 四层
nginx(tengine)七层
haproxy
硬件也有,不展开了。
类似于nginx的应用方式。客户请求流量先到达lvs,再由lvs做负载均衡。
举例:一台linux服务器启用lvs实现负载均衡的作用,其他的是业务服务器(RS)。
我们主要在lvs服务器上面做配置。业务服务器可能会有额外的配置(除了ip,如何配置取决于lvs的负载均衡方式,比如,下面会介绍):
在lvs上开启ipvs,配置ip、RS地址、负载均衡方式。
业务服务器:配置ip
为了描述,定义:
名称 | 简写 |
---|---|
客户的ip | CIP |
lvs服务器对外的IP | VIP |
lvs服务器真实的IP | DIP |
业务服务器的IP | RIP |
lvs服务器 | DS |
请求Request流量都要经过DS:数据包的源地址一定是CIP;
响应Response流量根据经过和不经过DS分为两类:
都是lvs做nat转换,区别在于究竟NAT了什么部分:
NAT
请求包数据包源地址不变,NAT目的地址;响应包NAT请求地址
请求:
DS接收的数据包:源地址:CIP 目的地址:VIP
发送给RS的数据包:源地址:CIP 目的地址:RIP
响应:
DS接收的数据包:源地址:RIP 目的地址:CIP
发送给客户的数据包:源地址:VIP 目的地址:CIP
Full-NAT(不常用)
请求包和相应包数据包源地址、目的地址都NAT
请求:
DS接收的数据包:源地址:CIP 目的地址:VIP
发送给RS的数据包:源地址:DIP 目的地址:RIP
响应:
DS接收的数据包:源地址:RIP 目的地址:DIP
发送给客户的数据包:源地址:VIP 目的地址:CIP
需要改变业务服务器的配置!
业务服务器也都配置虚拟IP为VIP。
直接路由DR
业务服务器要关闭对arp请求的响应。
有两种做法(分别见参考1和2)
1.绑定vip之后,配置忽略arp广播
ip addr add dev lo 192.168.246.160/32 #在lo接口上绑定VIP
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
2.创建一个dummy网卡
ip addr add dev dummy0 192.168.0.222/32
DS通过改变数据包的mac地址,将流量发给RS。
请求:
DS接收的数据包:源地址:CIP 目的地址:VIP
数据帧:目的MAC地址:DS的MAC地址
发送给RS的数据包:源地址:CIP 目的地址:VIP
数据帧:目的MAC地址:RS的MAC地址
响应:RS直接发给客户!
RS发送的数据包:源地址:VIP 目的地址:CIP
IP隧道 IP tunnel(不常用)
RS需要支持ipip协议,必须加载ipip模块,解封装数据包来获得原始包。
集群服务器如果是虚拟机,那么其物理机器上不能有ipip隧道设备
DS通过将原请求数据包在封装一层,发给RS。RS解封装得原数据包,直接回复响应给客户。
请求:
DS接收的数据包:源地址:CIP 目的地址:VIP
发送给RS的数据包:源地址:DIP 目的地址:RIP 载荷内容:接收的数据包
响应:RS直接发给客户!
RS发送的数据包:源地址:VIP 目的地址:CIP
负载
响应过lvs可能是瓶颈,所以大流量的情况下考虑响应不过lvs的两种。
服务器结点数目
NAT 10-20
IP tunnel 100
DR >100
网络配置要求
NAT 模式 和 Full-NAT模式:只需要DS一个有公网ip作为VIP,RS和DS三层可达。
DR模式:只需要一个有公网ip作为VIP,要求负载均衡器的网卡必须与物理网卡在一个物理段上
IP tunnel模式:只需要一个有公网ip作为VIP,RS需要支持IPTUNNEL协议
网关
NAT : DS
DR和IP tunnel:自己的路由器
RS网络和DS的关系:
NAT:局域网与外部网络
DR:DS和RS在同一个子网,RS也配置VIP
IP tunnel:DS和RS可以不在一个子网
DS和RS的端口对应关系
NAT模式下,这两个端口可以不相同,DS会做好转换
DR模式下,因为不会对传输层做修改,所以这两个端口必须相同
工作在内核,处理请求转发。
“IPVS通过在Netfilter框架中的不同位置(LOCAL_IN/FORWARD/LOCAL_OUT)注册自己的处理函数来捕获数据包,并根据与IPVS相关的信息表对数据包进行处理,按照IPVS规则中定义的不同的包转发模式,对数据包进行不同的转发处理。”
IPVS相关的信息表:用户维护
包转发模式:负载均衡模式
命令行工具,用户空间
向IPVS中写入规则
一些命令:
// 添加vip
ip addr add dev ens33 192.168.1.10/32
// 添加一个虚拟服务器
ipvsadm -A -t 192.168.1.10:80 -s rr
-A:append:添加一个虚拟服务器
-t:tcp-service:对tcp协议作转发
-s:schduler:均衡算法
rr:round robin:将工作平均分配给可用的真实服务器的算法
// 添加后端服务器
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.101:80 -g -w 1
-a:append:添加一个后端真实服务器
-t:tcp-service:转发tcp协议
-r:real-server:后端真实服务器地址
-w:weight:权重
-g:Direct Routing,默认模式,也成网关模式(gatewaying);
-m:NAT,也称作伪装模式(masquerading)。
-i:IP Tunneling,也称作 ipip 封包模式(ipip encapsulation);
轮询
加权轮询
最小连接数:维护后端服务器的连接数
加权最小连接数:连接数/权重,选取值最小的RS
基于本地的最少连接数:维护目的IP地址:RS映射表
具有多副本的LBLC:映射表中RS是set,用加权最小连接数选一个RS
目的地址匹配:静态哈希表
源地址匹配:静态哈希表
最短期望延迟:连接数+1/权重,选取值最小的RS
Never Queue:有空闲用空闲,无空用最短期望延迟调度
如 LVS + Keepalived
疑问:路由决策和LOCAL_OUT的先后顺序?