【转】一、LB集群---NAT方式

 一、集群简介

LVS(Linux Virtual Server)的三层结构

A、负载调度器(load balancer):集群对外的前端机,负责将客户的请求发送到一组服务器上执行;

B、服务器池 (server pool):执行客户请求的服务器,如Web、Mail、FTP、DNS;

C、共享存储 (shared storage):为服务器池提供共享的存储区,如NAS、SAN、iSCSI等

结构图
---------
|Client |--->CIP
---------
|
202.99.59.1(DGW)
|
|
202.99.59.110(Virtual IP)
|----------|
|director|
|----------|
192.168.10.254(Director IP)
|
-----------------------
|           |               |
RIP1    RIP2        RIP3

CIP:客户端IP

DGW:网关

VIP:集群对外的IP

DIP:对内部RealServer通信的IP

RIP:RealServer的IP

集群工作过程:客户端(Client)通过Internet路由访问集群的Director的对外IP(VIP),由Director按照一定的调度算法将接受到的请求分配给RealServer,RealServer将结果返回。

二、调度策略:
rr(Round Robin):轮询,将任务一个个的分发给RealServer
该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器间的负载失衡。

wrr(Weight Round Robin):加权轮询,在rr的基础上增加权值
权值表示服务器的处理性能,服务器的缺省权值为1。假设服务器A的权值为1,B的权值为2,则表示服务器B的处理性能是A的两倍。加权轮询调度算法是按权值的高低和轮叫方式分配请求到各服务器。权值高的服务器先收到的连接,即权值高的服务器比权值低的服务器处理更多的连接,相同权值的服务器处理相同数目的连接数。

lc(Least-Connection): 最小连接调度

算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减1。

wlc(Weight Least-Connection):加权最小连接
算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。

lblc(Locality-Based):基于局部性的最少链接调度
如果连续两次请求一样,则传给相同的服务器(Cache原理)
相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。

lblcr(Locality-Based Least Connections with Replication Scheduling):在上一个算法基础上,传给新一台服务器,建立多台Cache,以分担负担
LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

dh(Destination Hasing): 目标地址散列调度
根据客户端访问的VIP,经过hash后对应相应的Realserver


sh(Source Hashing):源地址散列调度
根据客户端IP,经过hash后,传给相应的Reaserver

sed(Shortest Expected):最短的期望的延迟,基于wlc算法。

举例:
ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后

会进行这样一个运算
A:(1+1)/1
B:(1+2)/2
C:(1+3)/3
根据运算结果,把连接交给C 。

nq(Never Queue):不排队,如果所有队列都满了,使用sed算法

三、配置举例(HTTP)
假设客户端和分发器是同一网段
CIP:20.0.0.1
VIP:20.0.0.2
DIP:10.10.10.31 
RIP1:10.10.10.32
RIP2:10.10.10.33

Director:
# ipvsadm -A -t 20.0.0.2:80 -s rr    #添加虚拟服务,使用rr调度策略
# ipvsadm -a -t 20.0.0.2:80 -r 10.10.10.32:80 -m    #在该服务上添加realserver,m代表地址伪装
# ipvsadm -a -t 20.0.0.2:80 -r 10.10.10.33:80 -m    #添加realserver
需要开启转发:
# vi /etc/sysctl.conf    
# sysctl -p

RealServer:
IP设置:
Apache安装:将RIP1和RIP2的页面设置为不同,以显示效果;
网关:指向DIP
# vi /etc/sysconfig/network-scripts/ifcfg-eht0 
GATEWAY=10.10.10.31

Client:
# elinks 20.0.0.2    #多次访问将显示不同页面

在Directory上监控
# ipvsadm -L --stats    #查看分发的数据统计状态
# ipvsadm -L -n -c    #追踪客户访问的源IP、VIP和DIP
# ipvsadm -C        #清空规则
这时候访问两次以上将会出问题,因为没有安装一个nat模块
# lsmod|grep nat
# modprobe iptable_nat
# arp -n    
发现有对应客户端IP的MAC地址,是由于没有安装之前的模块,需要清空arp缓存(15分钟后自动清空)

wlc算法:
# ipvsadm -A -t 20.0.0.2:80 -s wlc    #使用wlc调度策略
# ipvsadm -a -t 20.0.0.2:80 -r 10.10.10.32:80 -m -w 10    #-w,权值
# ipvsadm -a -t 20.0.0.2:80 -r 10.10.10.33:80 -m -w 20
用ab测试查看结果
#ab -n 1000 -c 1000 http://20.0.0.2/

动态的查看命令运行结果
# watch -n 0.001 ipvsadm -L -n --stats
例如:# free -n 0.001 free -m

四、FTP(被动模式)
Director:
将访问21端口和随即端口都标记为21,使其共用策略,放在同一个策略中
# iptables -t mangle -A PREROUTING -d 20.0.0.2 -p tcp --dport 21 -j MARK --set-mark 21
# iptables -t mangle -A PREROUTING -d 20.0.0.2 -p tcp --dport 10000:20000 -j MARK --set-mark 21
# ipvsadm -A -f 21 -s lc    #根据防火墙标记分发
# ipvsadm -a -f 21 -r 10.10.10.32 -m
# ipvsadm -a -f 21 -r 10.10.10.33 -m
客户端随即端口请求VIP的21端口---->Dir打标记--->根据算法转发到相应的RealServer--->返回给客户端一个1024+随机端口
这时,客户端请求Director的1024+,经过分发后,不一定会转发到之前建立连接的ReallServer
所以,只要客户端的IP不变(在一定时间内),客户下载请求的RealServer应该不变
# ipvsadm -C
# ipvsadm -A -f 21 -s lc -p 3600  #根据防火墙标记分发,在3600s内锁定Client IP对应的RealServer,当下次客户端建立下载的新连接时,仍然访问上次登录建立连接的RealServer,即Director将CIP--RIP的对应关系保存;
# ipvsadm -a -f 21 -r 10.10.10.32 -m
# ipvsadm -a -f 21 -r 10.10.10.33 -m

但是客户端下载数据时,RealServer返回端口在1000-20000之间,让客户端下载时使用iptables的限定的10000:20000,返回IP是RIP,但RIP是私有地址,所以只能返回给客户端VIP
# vi vsftpd.conf
pasv_min_port=10000    #返回给客户端的最小端口
pasv_max_port=20000    #返回给客户端的最大端口
pasv_address=20.0.0.2    #返回给客户端VIP,若不添加该项,则会返回给客户端RIP,而RIP是私有IP