###############################
集群的定义和分类
LVS简介和基本使用
LVS工作模型和调度算法
DR模型的实现
LVS的持久连接
###############################
集群的定义和分类
一、集群的定义
集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。
二、集群的分类
1、Scale ON(向上扩展)
物理扩展,提高硬件参数
缺点:硬件的参数增长比例所带来的性能提升,不是线性的,价格往往高于硬件参数的倍数,并且CPU数量越多,仲裁机制消耗的资源就越大。
2、Scale Out 向外扩展 数量扩展
增加服务器数量
优点:在不影响业务的情况下,可以实现动态的在线扩容,每台服务器的费用可以成正比的转化为性能。
High Availability()
保证服务永久在线可用的集群,通过健康检测机制,大幅度的增强服务的可用性,HA集群中一个资源只能被一个节点占用,节点数通常为奇数。
可用性衡量标准=在线时间/(在线时间+故障处理时间)
Load Balancing(负载均衡集群)
那用户的请求均摊到多台服务器上的机制叫做负载均衡,主要是增加处理能力。
调度算法:论调(Round Robin)、加权(WRR)等……
硬件
F5 BIG IP
Citrix Netscaler
A10 AX系列
软件
四层 不能处理应用层协议,工作性能好,支持的功能特性有限 LVS
七层 可以过滤和修改应用层协议,性能略差于四层设备 Nginx、Haproxy
High Performance
科学集群是并行计算的基础。通常,科学集群涉及为集群开发的并行应用程序,以解决复杂的科学问题。科学集群对外就好像一个超级计算机,这种超级计算机内部由十至上万个独立处理器组成,并且在公共消息传递层上进行通信以运行并行应用程序。
LVS简介和基本使用
一、LVS简介
LVS工作在内核空间的TCP/IP协议栈上,LVS监控在INPUT链上,当用户请求的是集群服务(套接字),ipvs钩子函数会根据定义的规则修改请求并送至POSTROUTING链上,LVS和iptbles不能同时使用。
ipvsadm是工作在用户空间的规则编写的命令行工具
ipvs是工作在内核空间INPUT链上的钩子函数
注意:调度器的实现基于套接字(IP+port),所以一个调度器可以调度多个不同类型的服务,但通常调度能力有限,通常都为一种服务实现集群调度功能。
二、ipvsadm的用法
ipvsadm管理集群服务
1
2
3
4
5
6
7
8
|
添加 -A - t|u|f service-address [-s scheduler]默认调度算法是wlc
-t TCP 协议的集群
-u UDP 协议的集群
service-address IP:PORT
-f FireWallMark LVS持久连接
service-address MarkNumber
修改 -E
删除 -D - t|u|f service-address
|
ipvsadm管理集群服务中的realserver
1
2
3
4
5
6
7
|
添加 -a - t|u|f service-address -r server-address -[g|i|m] [-w weight]
在NAT模型中server-address可以是 IP:PORT
-g:DR 默认就是DR模型
-m:NAT
-i:TUN
修改 -e
删除 -d - t|u|f service-address -r server-address
|
ipvsadm查看
1
2
3
4
5
6
7
8
|
ipvsadm查看
- L|l 显示规则
-n 不反解析IP地址和端口,数字格式显示主机地址和端口号
--status 统计数据
--rate 速率
--timeout 显示tcp、tcpfin和udp的会话超时时长
--
sort
显示当前的ipvs连接状况
-c 查看连接数
|
删除所有集群服务
1
|
-C 清空ipvs所有规则
|
保存ipvs规则
1
2
|
-S >
/path/file
保存规则
service ipvsadm save
|
载入ipvs规则
1
|
-R <
/path/somefile
|
LVS工作模型和调度算法
NAT
用户请求到达INPUT链由ivps的匹配规则并修改就客户端的目标IP为集群服务中的Realserver地址,DNAT的动态扩展,同样支持端口映射,向外提供的服务和内部服务端口可以不一致,Realserver的网关指向DIP。
缺点:由于Director为后端realserver网关,因此能够调度的Realserver有限,10个就已经差强人意了。
集群节点跟Director必须在同一物理网络中,因为它靠mac地址转发数据包,ARP广播包不允许跨路由
RIP可以不用是私有地址,实现便捷的远程原理
Director只负责入站请求,响应报文由Realserver直接发网客户端,请求报文很小,所以DR模式的LVS能带动100台Realserver
集群节点一定不能使用Director当做其默认网关
不支持端口映射
大多数的操作系统都可以用在Realserver,要求必须能隐藏VIP
TUN
集群节点可以跨越Intelnet
RIP必须是公网地址
Director仅负责入站请求,响应报文则由Realserver直接发网客户端
Realserver网关不能指向Director
只有支持隧道功能的OS才能用于Realserver
不支持端口映射
二、LVS的调度算法
1、静态调度方法(director不考虑realserver已建立的活动链接和非活动链接状况)
rr 轮询
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
wrr 加权轮询
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
sh 源地址哈希
源地址hash,对请求的客户端IP进行hash计算,内部维持着一张hash表,它的主要功能用户实现session affinity,会话绑定,它在一定程度上破坏了负载均衡效果,但是为了现实应用的需求这种功能是必要的,如果每个realserver通过session sharing的集群机制共享session,就可以不适用source hash这种功能。
dh 目标地址哈希
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
2、动态调度方法
lc 最少连接数
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载,active*256+inactive。
wlc 加权最少连接数
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值(active*256+inactive)/weight。
sed 最短期望延迟
wlc的改进版,权重大的服务器事先被挑中,(active+1)*256/weight,权重大的服务器有很多的时候,权重小的服务器可能一个都没有。
nqnever queue 永不排队
无需队列,如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算。
lblc 基于本地的最少连接
它的主要目的跟dh一样,只是dh并不考虑从但前cacheserver的连接数,lblc考虑而已。尽管要保证命中的提高,并同样的请求发网通一个cache server但也要考虑轮询新的连接用一个相对空闲的cache server来响应。
lblcr 基于本地的带复制功能的最少连接
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入。
DR模型的实现
一、实现原理
客户端发出请求报文至路由网关,路由网关eth1发出ARP解析请求,请求数据包目标IP(192.168.1.200)的MAC地址是多少,所有realserver均收到APR请求,此时为了让解析的MAC为Director的MAC,需要对所有realserver做出设置如下:
12345678910111213######所有realserver配置信息
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_ignore=1
#######解释说明
arp_ignore 接收到别人请求后的响应级别
0 只要本机配置有相应地址就给予相应
1 仅在请求目标地址配置在请求到达的接口上的时候,才给予相应
arp_annonce 主动向外通告过自己IP地址和MAC地址对应关系的通告级别
0 将本机任何接口上的任何地址向外通过
1 试图仅向目标网络通告与其网络匹配的地址信息
2 仅向目标网络通告与其网络匹配的地址信息是
客户端成功解析VIP的MAC地址为Director的MAC,将报文转发至调度器。
Director根据调度算法和规则选择为Realserver_one,并发出APR解析请求得到RIP对应的MAC地址,并重新封装数据报文的帧首部,将源MAC地址改为自己,目标MAC地址改为解析到的RIP的MAC地址,并发送报文至Realserver_one。
Realserver_one收到Director发来的报文处理并相应此请求报文,响应报文的源IP地址,必须是请求报文的目标IP(VIP)地址,需要对realserver做如下设置:
12ifconfiglo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255
route add -host 192.168.1.200 dev lo:0
此后整个传输过程数据包源IP为VIP,目标IP位CIP,数据报文沿着路由器转发至客户端,完成整个请求和相应过程。
二、配置过程
Director配置
1
2
3
4
|
route add -host 192.168.1.200 dev eth0:0
ipvsadm -A -t 192.168.1.200:80 -s wlc
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.10 -g -w 2
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.20 -g -w 1
|
realserver端配置
1
2
3
4
5
6
|
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_ignore=1
ifconfiglo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255
route add -host 192.168.1.200 dev lo:0
|
三、健康检测机制
使用ldirectord来实现对realserver的健康状态检测
为了从主Director将LVS负载均衡资源故障转移到备用Director,并从集群中自动移除节点,我们需要使用ldirectord程序,这个程序在启动时自动建立IPVS表,然后监视集群节点的健康情况,在发现失效节点时将其自动从IPVS表中移除,本文没有使用这种方法,而是简单的通过脚本的方式来实现。
使用脚本来实现对realserver的健康状态检测
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#!/bin/bash
#
VIP=192.168.1.200
CPORT=80
BACKUP=127.0.0.1
STATUS=(
"1"
"1"
)
RS=(
"192.168.1.10"
"192.168.1.20"
)
RW=(
"2"
"1"
)
RPORT=80
TYPE=g
while
:;
do
letCOUNT=0
add() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq0 ] && return0 || return1
}
del() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq0 ] && return0 || return1
}
forI
in
${RS[*]};
do
ifcurl --connect-timeout 1 http:
//
$I &>
/dev/null
;
then
if
[ ${STATUS[$COUNT]} -eq0 ];
then
add $I ${RW[$COUNT]}
[ $? -eq0 ] && STATUS[$COUNT]=1
fi
else
if
[ ${STATUS[$COUNT]} -eq1 ];
then
del $I
[ $? -eq0 ] && STATUS[COUNT]=0
fi
fi
letCOUNT++
done
sleep5
done
|
注意:各节点之间的时间偏差不应该超过1秒,NTP时间服务器来同步时间。
LVS的持久连接
一、持久连接的实现机制
无论使用什么算法,LVS持久连接都能实现在一点时间内,将来自于同一个客户端请求派发至此前选定的realserver,DH调度算法本身依赖于TCP会话超时时间等其他计时器,而持久连接依赖于持久连接模板,每个新的连接请求,无论客户端的连接状态无论是否断开,只要客户端曾经访问过,LVS就会在持久连接模板中记录信息,持久连接模板(内存缓冲区):记录每一个客户端及分配的realserver的映射关系。
PPC 持久端口连接 基于端口
来自于同一个客户端对同一个服务的请求,始终定向至此前选定的realserver。
1
2
3
|
ipvsadm -A -t 192.168.1.200:23 -s rr-p 3600
ipvsadm -a -t 192.168.1.200:23 -r 192.168.1.10 -g -w 2
ipvsadm -a -t 192.168.1.200:23 -r 192.168.1.20 -g -w 1
|
PCC 持久客户端连接 基于所有端口
来自于同一个客户端对所有服务的请求,始终定向至此前选定的realserver
1
2
3
|
ipvsadm -A -t 192.168.1.200:0 -s rr -p 600
ipvsadm -a -t 192.168.1.200:0 -r 192.168.1.10 -g -w 2
ipvsadm -a -t 192.168.1.200:0 -r 192.168.1.20 -g -w 1
|
PNMPP 持久防火墙标记连接
来自于同一客户端对指定服务的请求,始终定向至此算定的realserver基于指定的端口,它可以将两个毫不相干的端口定义为一个集群服务,例如:合并http telnet为同一个集群服务。
1
2
3
4
5
6
|
######PNMPP是通过路由前给数据包打标记来实现的
iptables -t mangle -A PREROUTING -d 192.168.1.200 -eth0 -p tcp --dport 80 -j MARK --
set
-mark 3
iptables -t mangle -A PREROUTING -d 192.168.1.200 -eth0 -p tcp --dport 23 -j MARK --
set
-mark 3
ipvsadm -A -f 3 -s rr -p 600
ipvsadm -a -f 3 -r 192.168.1.10 -g -w 2
ipvsadm -a -f 3 -r 192.168.1.20 -g -w 2
|
注意:以上三种持久连接均使用了"-p"选项,它保证了持久性,默认为300秒
警告:Director没有定义用户请求的集群服务,将试图自己响应客户端请求。