###############################

集群的定义和分类

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

064256156.jpg

  • 用户请求到达INPUT链由ivps的匹配规则并修改就客户端的目标IP为集群服务中的Realserver地址,DNAT的动态扩展,同样支持端口映射,向外提供的服务和内部服务端口可以不一致,Realserver的网关指向DIP。

  • 缺点:由于Director为后端realserver网关,因此能够调度的Realserver有限,10个就已经差强人意了。

  • DR

    064403347.jpg

  • 集群节点跟Director必须在同一物理网络中,因为它靠mac地址转发数据包,ARP广播包不允许跨路由

  • RIP可以不用是私有地址,实现便捷的远程原理

  • Director只负责入站请求,响应报文由Realserver直接发网客户端,请求报文很小,所以DR模式的LVS能带动100台Realserver

  • 集群节点一定不能使用Director当做其默认网关

  • 不支持端口映射

  • 大多数的操作系统都可以用在Realserver,要求必须能隐藏VIP

  • TUN

064437159.jpg

  • 集群节点可以跨越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模型的实现

一、实现原理

070222206.png

  1. 客户端发出请求报文至路由网关,路由网关eth1发出ARP解析请求,请求数据包目标IP(192.168.1.200)的MAC地址是多少,所有realserver均收到APR请求,此时为了让解析的MAC为Director的MAC,需要对所有realserver做出设置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ######所有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   仅向目标网络通告与其网络匹配的地址信息是
  2. 客户端成功解析VIP的MAC地址为Director的MAC,将报文转发至调度器。

  3. Director根据调度算法和规则选择为Realserver_one,并发出APR解析请求得到RIP对应的MAC地址,并重新封装数据报文的帧首部,将源MAC地址改为自己,目标MAC地址改为解析到的RIP的MAC地址,并发送报文至Realserver_one。

  4. Realserver_one收到Director发来的报文处理并相应此请求报文,响应报文的源IP地址,必须是请求报文的目标IP(VIP)地址,需要对realserver做如下设置:

    1
    2
    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

  5. 此后整个传输过程数据包源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没有定义用户请求的集群服务,将试图自己响应客户端请求。