集群,是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。
集群分为
:
负载均衡集群
(Load-balancing,简称LB)
高可用集群
(High Avaliablity,简称HA)
高性能集群
(High Perfomoncing,简称HP)
LVS(Linux Virtual Server)相当于工作在四层的路由,他并不会发送ack确认信息的,它具有:
高吞吐量
(For High Throughput)
冗余
(For Redundancy)
伸缩
(For Adaptability)三种性能
LVS的ip地址根据客户端数据包的走向分为
:
VIP
(虚拟ip地址)
RIP
(真实ip地址)
DIP
(Director上的ip地址)
CIP
(客户机端地址)
具体如下图:
LVS集群通常通过转发方式的类型即这个LVS Director去响应客户端进来的请求到这个内部集群的节点,当前可用的三种类型:
LVS-NAT
(网络地址传送,即转发)
LVS-DR
(直接路由)
LVS-TUN
(ip隧道)
【LVS-NAT
从客户端发送请求到收到回应信息的过程详细如下图:
它的基本特性如下:
1)
这个集群节点需要在相同的网络(VLAN或Subnet)作为这个Director
2)
RIP地址必须是私有地址,不转发ip地址,只是为了说明信息传送
3)
客户端进来的请求和real-server响应后的信息都经过了Director传送
4)
这个Cluster node使用Director的DIP作为它们的默认网关用来响应客户端的请求
5)
Director可以重测图网络端口数,此时一个请求响应这Director的VIP时,这个端口可以发送给一个RIP内部集群一个不同的端口
6)
Cluster可以是任意操作系统
7)
在此图种单个的Director很可能成为一个瓶颈
【LVS-DR
即客户端请求响应给Director再到内部Cluster node直接回应给客户端从而不再经过Director来回应客户端请求了,具体过程如下图所示:
它的基本特征如下:
1)
Cluster node必须在同一网段或VLAN中,并且可以不是私有地址了
2)
Director仅仅出路客户端进来的练接请求,而出去的连接不再经过Director了
3)
真实服务器的默认网关一定不能是Director了
4)
Director不能做端口转换了
5)
内部集群使用的大多数的操作系统都可以用真实的real serevr了
6)
一个LVS-DR Director可以比一个LVS-NAT支持后台更多的服务器了
7)
LVS-DR是在一个Linux企业Cluster中用的最多的转发方式,因为它允许你去建立Cluster nodes以至于可以直接回应来自外界的请求
8)
但是这样直接路由可能带来安全问题,尽管如此它还是优大于略啊
【LVS-TUN
可以被用来转发来自一个Subnet或LAN(VLAN)到另一个Subnet或VLAN甚至当这个包必须通过另一个网络或Internt,具体过程如下图:
它的基本特征如下:
1)
DIP和VIP完全不需在同一个网络内了
2)
RIP必须不是私有的ip地址了
3)
Director仅仅处理客户端请求的连接
4)
real server网关不能指向DIP了
5)
只有做ip隧道的采用此类型
当Director接受一个客户端的在VIP上的访问集群服务的请求时,Director需要去选择使用哪一个Cluster node应该去给客户端回应访问请求呢?此时在Director上使用调度算法就可以去做出选择, LVS调度算法分为:
静态的调度方式(不关心服务器当前的工作状态从而选择Culster node的)
动态的调度方式
(它会关心服务的连接数从而再去选择Cluster node的即Director会纪录每一个分给real serevr的活动信息的,并根据当前负载状态去分配的)
【静态的调度方式有
:
1)Round-robin(RR)即可解释为轮流分配请求给Cluster node
2)Weighted roubd-robin(WRR)即加权,指你可以给每一个Cluster node指定一个权重或等级基于如何更好的负载它可以运行的步骤
3)Destination hashing(dh)即同一个目标地址多次访问分的目标地址都一样即分到同一台real server上,如locality-based least-connection(LBLC)调度算法方式是使用在当这台内部cluster 是隐藏或代理服务器时
4)Sourcreal hashing(sh)即可以当这个Director需要去确保这个响应包是发送到同一路由或防火墙上时是来自于同一个请求的,这个调度算法通常只用在当这个Director有多个物理网络连接,以至于此Director知道那个路由器或防火墙去发送这个回应包通过适当的客户端
【动态的调度方式有
:
1)Least-connection(LC)它会根据Cluster node的当前活动与非活动连接的个数去使用最少的连接定义应该响应客户请求的。若活动数为N,非活动数为M,则这样去计算最少的连接数的:N*256+M
2)Weighted Least-Connection(WLC)即加权最少连接,此时应该为其指定权重的,它是
默认使用的算法,若权重数为P,则计算方式如下:(N*256+M)/P
3)Shortest Expected Delay(SED)即最小期望延迟,此时在选择那个real server事它不再关心非活动连接了,只关心当前real server的活动连接数了
4)Nerver Queue(NQ)即无乱任何时候只要内部某台real server没有活动链接,Director就会指派一个新的客户端请求给它Director
5)Locality-Based Least-Connection(LBLC)即基于本地的最少连接数,它会尝试去发送所有的请求预定为一个特别的ip地址或一个特别的wed server到这个透明的代理服务器
6)Locality-Based Least-Connection with Replication Scheduling(LBLCR)即基于本地的最少加权连接数
下面我们来了解LVS-NAT,它的缺陷是与防火墙不兼容,它的详细工作环境如图:
若基于上图我们要建立一个LVS-NAT Wed Cluster我们操作步骤如下:
1)
安装操作系统
2)
并在real server上配置并启动Apache服务
3)
在real server上设置默认路由
4)
在Director上安装LVS软件包
5)
在Director上配置LVS
6)
测试Cluster配置是否成功
ipvsadm(Linux Virtual
Server administration
)它的两条执行命令格式如下:
1)
ipvsadm COMMAND [protocol] service-address
[scheduling-method] [persistence options]
2)
ipvsadm command [protocol] service-address
server-address [packet-forwarding-method]
[weight options
]
ipvsadm -A|E -t|u|f service-address [-s scheduler]
[-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
ipvsadm �CC
ipvsadm �CR
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
[--syncid syncid]
ipvsadm --stop-daemon state
ipvsadm �Ch
其中选项含义如下:
COMMANDS
即命令部分:
-A,
--add-service
(添加一个虚拟服务)
-E,
--edit-service
(编辑一个虚拟服务)
-D
, --delete-service
(删除一个虚拟服务)
-C,
--clear
(清空这个虚拟服务器表)
-R,
--restore
(恢复linux虚拟服务器规则)
-S
, --save
(保存这个linux虚拟服务器规则)
-
a
, --add-server
(添加一个real server到一个虚拟服务中)
-
e
, --edit-server
(编辑一个real server到一个虚拟服务中)
-
d
, --delete-server
(从一个虚拟服务中删除一个real server)
-L
,
-l,
--list
(列出这个虚拟服务器表
-Z,
--zero
(清空计数器的)
--set
tcp tcpfin udp
(为IPVS连接改变超时值的)
-h
, --help
(显示帮助信息的)
PARAMETERS
即参数部分:
-t,
--tcp-service service-address
(指定使用tcp协议服务,这个服务地址方式是:
host[:port]
)
-u,
--udp-service service-address
(指定使用udp协议服务,这个服务地址方式是:
host[:port]
)
-f,
--fwmark-service integer
(指定使用一个防火墙标记,用一个大于0的整数值来表示一个虚拟服务从而代替一个地址、端口和协议,这个标记包用一个用一个
firewall-mark
是配置在iptables(8)中使用
-m|--mark
选项)
-s,
--scheduler scheduling-method
(指定使用哪种调度算法的)
-p,
--persistent [timeout]
(指定一个虚拟服务具体超时时间的)
-M,
--netmask netmask
(指定虚拟服务的子网掩码)
-r,
--real-server server-address
(指向服务地址,定义real server的)
-w,
--weight weight
(为服务器定义权重的)
-x,
--u-threshold uthreshold
(定义服务器的最大上限)
-y,
--l-threshold lthreshold
(定义服务器的最大下限)
[packet-forwarding-method]
-g,
--gatewaying
(使用DR即网关直接路由的,默认用法)
-i,
--ipip
(使用ipip封装,即tunneling隧道模型)
-m,
--masquerading
(使用网络访问传输NAT模型)
-c,
--connection
(指定连接超时)
--stats
(输出ipvsadm状态信息的)
--rate
(输出ipvsadm速率信息的)
--timeout
(超时输出)
--sort Sort
(列出虚拟服务和real server
LVS-DR工作过程具体如下图:
ARP Broadcast
如何把real server上的VIP隐藏起来呢?我们用arp-announce和arp-ignore就可做到嘿嘿
…
..
arp-announce
(在通过某个网卡向外发送ARP请求时宣称自己的地址以那个地址作为源地址的)
arp-announce INTEGER
0 (本地任意地址,配置在任意接口上的,默认选项)
1(表尽量避免使用跟对方不在同一网段的地址)
2(一般使用最适合的本地地址去响应目标主机)
arp-ignore
(如何定义响应别人的)
arp-ignore INTEGER
0(任意本地ip地址配在任意接口上的都行)
1(从那块网卡进来的客户端请求信息就从此网卡响应客户端信息)
2(必须使用流进来的地址去响应它并不在同一网段上的地址)
在DR模式下每个real server的VIP都要配隐藏的,具体配置如下:
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