介绍
LB集群原理:当用户的请求过来时,会直接分发到director server上,然后它把用户的请求根据设置号的调度算法,智能均衡地分发到后端真正的服务器上(real server),为保证用户请求一致,通常需要共享存储
LVS:Linux virtual server虚拟服务器,已经是Linux内核标准的一部分
LVS架构从逻辑上分为调度层,server集群层和共享存储层
官方参考文档:http://www.linuxvirtualserver.org/Documents.html
LVS组成
ipvs(IP virtual server):工作于内核空间,是真正实现调度的代码
ipvsadm:工作在用户空间,负责ipvs内核框架编写规则,定义谁是集群服务器,谁是后端真实的服务器
相关术语
DR:director server 前端负载均衡节点
RS:real server 后端真正的服务器
VIP:虚拟IP地址,用户请求目标的IP地址
RIP:真实的IP地址,内部主机通讯的IP地址
CIP:客户端的IP地址
工作模型
NAT模型
工作流程
- 用户访问服务器集群提供的服务时,发往VIP的请求数据包到达DR(负载均衡设备)
- DR检查数据包的目的地址和端口,根据虚拟服务器(LVS)规则表匹配虚拟服务器服务,通过调度算法从集群中选取RS,并将连接添加到记录已连接的hash表中
- 将目标地址和数据包的端口重写为所有RS的目的地址和端口,并将数据包转发给相对应的RS
- 当回复数据包返回时,DR将数据包的源地址和端口重写为虚拟服务器的VIP和端口
- 当连接中止或者连接超时后,连接记录将从hash表中删除
特性
- RS应该使用私有IP地址,网关要为DIP
- DIP(DR对内的IP)和RIP属于同一个网段
- 请求报文和响应报文都要经过DR
- 支持端口映射
-
DR模型-响应报文不经过DR
工作流程
用户访问服务器集群提供的服务时,发往VIP的请求数据包到达DR(负载均衡设备)(VIP地址由DR和RS共享)
- 负载均衡设备配置VIP地址,用于接收请求数据包,并将数据包路由到选定的RS上
- 所有的RS的非arp别名接口(一般选取环回接口)都配置了VIP地址,或者将发往VIP地址的数据包重定向到本地套接字,以便RS可以在本地处理数据包
- DR和RS必须通过switch/HUB物理连接其中一个接口,DR只是将数据帧的MAC地址更改为所选的RS的MAC地址,然后再LAN上重新传输;这就是DR和RS必须通过同一个LAN进行连接的原因
3根据RIP-MAC选取RS
4中能转发到RS是因为目的IP为VIP没变
5根据ARP解析得到CIP-MAC和VIP-MAC
特性
- 保证前端路由将目的地址为VIP的报文通通发给DR
- RS可以使用私有IP地址,当然也可以使用公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
- RS和DR必须在用一个物理网络中
- 所有的请求报文经过DR,但是所有响应报文不能经过DR
- 不支持地址转换,也不支持端口映射
- RS的网关绝不允许指向DIP
- RS的环回接口配置VIP地址
因为ARP广播,想要保证目的地址为VIP报文发给DS,只能够让DR去响应ARP请求,而RS不能响应;修改RS上的内部参数(arp_ingore和arp_announce)将RS上的VIP配置在环回接口的别名上,并限制其不能响应VIP地址解析请求
LVS TUN模型
工作流程和介绍
- 在LVS NAT模型中,所有的数据请求和数据响应报文都会经过DR,所以当后端服务器集群超过10台时,则调度器DR会成为整个集群的瓶颈
- 数据请求报文往往小于响应报文的大小,因为响应报文中包含有具体的数据,所以LVS TUN模型的思路是:将请求和响应数据报文分离;让DR仅仅处理数据请求,而让RS响应数据报文直接返回给客户端
- 工作模式:IP tun技术——IP隧道技术
IP隧道技术
将原始的数据包封装并添加新的包头(新的源地址及端口,目标地址和端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的RS,通过将客户端发往调度器的原始数据包封装,在其基础上添加新的数据包头(修改目标地址为调度选择出来的RS地址和对应端口)
- LVS TUN模式要求RS可以直接于外部网络连接,RS在收到请求数据包后直接响应给客户端
特性
按照依次循环的方法将请求调度到不同的服务器上
- WRR
可以给RS设置权重,权重设置越高,那么分发的请求数越多
- 目的地址hash
根据请求的目的IP地址,作为散列值从静态的散列表中找出对应的服务器,若该服务器时可用的且未超载,将请求发送给服务器,否则返回为空
- 源地址hash
根据请求的源IP地址,作为散列值从静态的散列表中找出对应的服务器,若该服务器时可用的且未超载,将请求发送给服务器,否则返回为空
- 最少连接数
根据后端RS的连接数来决定把请求分发给谁,如果RS1连接数比RS2小,那么请求优先发给RS1
- 加权最小连接数
比最少连接数多一个权重的概念
- 最短延迟调度
根据WLC改进:overhead=(active+1)*256/权重
他就不会考虑非活动状态,把当前处于活动状态的连接数+1来实现,数目最小接收下次请求
- NQ永不排队/最小队列调度
无需队列,如果有台RS的连接数=0,直接分配过去,不需要进行算法运算,这样保证不会有一个主机非常空闲
- 基于局部性的最小连接
针对目的IP地址的负载均衡,目前主要用于cache集群,该算法根据请求的目标IP地址,找出该目标IP地址最近使用的服务器,若该服务器是可用的且未超载,将请求返回
- 带复制的基于局部性最小连接
LVS实验部署
LVS-NAT实验
环境准备:
DR服务器:两个接口
VIP:172.16.0.10(ens37)
DIP:192.168.220.102(ens33)
RS集群:RS1&RS2
RS1:192.168.220.103
RS2:192.168.220.104
DR部署:
- 安装ipvsadm工具
yum install ipvsadm -y
打开转发配置nat
[root@node1 ~]# echo 1 >> /proc/sys/net/ipv4/ip_forward
[root@node1 ~]# iptables ‐t nat ‐F
[root@node1 ~]# iptables ‐t nat ‐A POSTROUTING ‐s 192.168.10.0/24 ‐o ens36 ‐j MASQUERADE
设置wrr策略和添加RS主机
[root@node1 ~]# ipvsadm ‐A ‐t 172.16.0.10:80 ‐s wrr
[root@node1 ~]# ipvsadm ‐a ‐t 172.16.0.10:80 ‐r 192.168.10.20:80 ‐m ‐w 1
[root@node1 ~]# ipvsadm ‐a ‐t 172.16.0.10:80 ‐r 192.168.10.30:80 ‐m ‐w 1
查看策略信息
[root@node1 ~]# ipvsadm ‐ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
‐> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.10:80 wrr
‐> 192.168.10.20:80 Masq 1 0 0
‐> 192.168.10.30:80 Masq 1 0 0
RS部署:
[root@node2 ~]# echo "RS2" > /usr/share/nginx/html/index.html
[root@node3 ~]# echo "RS3" > /usr/share/nginx/html/index.html
测试:for i in {1..10};do curl 172.16.0.10;done
LVS-TUN实验
环境准备(所有设备都是一个网段的):
DIP:192.168.220.102(ens33)
RIP1:192.168.220.103
RIP2:192.168.220.104
VIP:192.168.220.105(ens33:0)
DR部署:
[root@node1 ~]# ifconfig ens33:0 192.168.10.100 broadcast 192.168.10.255 netmask 255.255.255.0 up
[root@node1 ~]# route add ‐host 192.168.10.100 dev ens33:0
[root@node1 ~]# ipvsadm ‐A ‐t 192.168.10.100:80 ‐s wrr
[root@node1 ~]# ipvsadm ‐a ‐t 192.168.10.100:80 ‐r 192.168.10.20:80 ‐m ‐w 2
[root@node1 ~]# ipvsadm ‐a ‐t 192.168.10.100:80 ‐r 192.168.10.30:80 ‐m ‐w 1
RS部署:
[root@node2 ~]# cat rs.sh
#!/bin/bash
vip=192.168.10.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add ‐host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
在所有RS上部署!
测试:for((i=1;i<5;i++));do curl 192.168.220.105;done
面试准备
网络
TCP/IP
算法
《剑指offer》
牛客网:内推/面经/水友
leecode:刷算法题
阿里巴巴:蚂蚁 阿里云 PE团队
腾讯:技术运营—技术支持/DBA/SRE运维/网络
百度:百度基础云平台/SRE
字节跳动:运维较少—数据结构算法(南京:广告部门大数据团队-python后端-桌面技术支持)
京东 美团 滴滴 网易 猿辅导
杭州:有赞,同花顺
南京:苏宁,扇贝
上海:携程
拼多多
依图
商汤