所谓的集群知识—只需要简单的梳理

(图可能较多,笔者喜欢用图形的排版方式来梳理知识而告别繁琐的文字)

   刚解除集群,这东西庞而多杂的概念,各种集群的架构:负载均衡、高可用、高性能等等,难免或让人眼花缭乱。当然想要快速掌握他们,需要的只是从简单到复杂。那么笔者同大家一起进行这些知识的梳理,告别繁琐的文字的束缚,由浅入深,来一层一层剥离他们的关系。

如上图,我们告别繁琐的书面信息(这些东西从哪里来,怎么得来,由谁搞出来等),先来大致认识下集群及其分类,大致功能。这些掌握ok再去寻根问底。



LB负载均衡集群详解

定义(本人解释方法):

1
2
如果一台服务器,某个时间点接受了N多用户的请求,那么它肯定会出现处理不了导致响应缓慢的问题,而硬件提升服务器太昂贵或者已经达到顶峰,那么LB的作用就在这里体现了。
当用户(大量)请求到来时,由负载均衡器接收,而将这些请求分摊发放给由它管理的服务器上。让M多服务器同时来承受这些用户的请求(这些服务器的功能是相同的也就好比同一台服务器的影分身)。


了解了他的大致作用,来看下图,它的分类

到这里,我们大致要对LB有个思维上的理解,那么开始详解他们的功能



四层LVS详解:



LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。

当用户的请求发往虚拟服务器,LB根据设定的包转发策略负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。同请求包一样,应答包的返回方式也与包转发策略有关。



LVS转发策略:三种模式

(ps:这里我们需要说明一下具体的一些名词:)


1
2
3
4
5
Director:复制调度集群的主机
VIP(virtual ip) 向外提供服务的IP
RIP(real ip)后端真正提供接点的ip
DIP(Director‘s ip)及负载均衡器(Loader balance,LB)上连接D/RIP的地址(向内部的IP通信的IP,在Director主机上)
CIP(custom ip)用户请求的ip



1、NAT 地址转换



1
2
3
4
5
6
7
8
9
10
1.集群节点跟director(引向器)必须在同一个IP网络中
2.RIP通常是私有地址,仅用于各集群节点通讯
3.director位于client和real server之间,并负责处理进出的所有通信
4.realserver必须将网关指向DIP
5.支持端口映射
6.realserver可以使用任意操作系统(OS)
7.使用在较大规模应用场景中,director易成为系统瓶颈(进口出口都在DIP)
PS:
Director上只需要一个网卡,然后利用别名来配置两个IP:VIP和DIP。Director在接受到外部主机的请求的时候转发给Real Server。
Real Server进行回复时,将请求先交给DIP,然后由VIP转发给交换机实现通信。



2、DR直接路由 (最常用的)


1
2
3
4
5
6
7
8
9
10
11
1.集群节点跟directr必须在同一个物理网络中;
2.RIP可以使用公网地址,实现便捷的远程管理和监控;
3.director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
4.realserver不能将网关指向DIP;
5.不支持端口映射;
6.realserver隐藏自己的DIP
PS:
Director如NAT模型
每个Real Server上都有两个IP:VIP和RIP,但是VIP是隐藏的,只是用来做请求回复的(暂时可以这么理解)。
Director在接受到外部主机的请求的时候转发给Real Server的时候并不更改目标地址,只是进行一次封装然后转给Real Server
Real Server在接受到信息以后拆除第一层封装,并且丢掉,只保留原始的SIP(CIP),然后直接回复给CIP


3、TUN 隧道模型


这个模型跟DR模型有些相似,只不过Real Server跟DIP不在同一物理网络中。Real Server回复模式同DR模型相似。DIP向RIP传送的时候同样也是进行了一次包装而里面保留了CIP的SIP(source ip)。图不在继续画。

1
2
3
4
5
6
集群节点可以跨越互联网;
RIP必须是公网地址;
director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
realserver不能将网关指向DIP;
只有支持隧道功能的OS才能用于realserver;
不支持端口映射



LVS的调度算法


LVS是一个L4转发,因为他是根据用户请求的服务不同,提供转发的,所以他是使用四层的端口进行转发的,对用户来说是透明的。


静态调度方法

1
2
3
4
5
6
7
8
rr:
轮叫,轮询轮循着,它将请求依次分配不同的RS,也就是在RS中均摊请求。这种算法简单,但是只适合于RS处理性能相差不大的情况;
wrr:
Weight, 加权轮调,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。相同权值的RS得到相同数目的连接数;
sh:
sourcehash, 源地址hash将来自同一个用户的请求,始终转发到特定的路由器或防火墙(平均内网负载),从而保证cookie与session等进行会话绑定;
dh:
destination hash根据服务的请求转发到特定的服务器,跟用户建立粘性,提高缓存命中率。主要用于缓存服务器;


动态调度方法


1
2
3
4
5
6
7
8
9
10
11
12
lc:
(least-connect)最少连接,检查active和inactive,连接数(overhead)最少的接受请求。公式:active*256+inactive 谁小给谁
wlc
(weight least-connect)加权最小连接数(集群最好的算法),公式:(active*256+inactive)/weight谁小给谁(权值表示服务器的性能,越好权值越高。)默认
sed:
shortest expected delay (SED)最短期望延迟(谁响应最快给谁),不考虑非活动状态,在计算overhead之前,把非活动状态的总数加上1 。公式:(active+1)*256/weight
nq:
(never query)基于sed, 只要有空闲的,不考虑算法的接受请求;
LBLC:
(locality-based-least-connect:DH)支持权重(Real server是缓存服务器的),基于地址的最小连接数调度(Locality-Based Least-Connection) , 如果这台服务器尚未满负荷,将来自同一目的地址的请求分配给同一台RS(realserver),否则分配给连接数最小的RS,并以它为下一次分配的首先考虑;
LBLCR: (带复制功能的最少连接)
(locality-based-least-connect with replication scheduling)是对LBLC的改进,对于某一目的地址,对应有一个RS子集。对此地址的请求,为它分配子集中连接数最小的RS;如果子集中所有的服务器均已满负荷,则从集群中选择一个连接数较小的服务器,将它加入到此子集并分配连接(同时从本应连接的那台服务器中复制过来用户的信息);若一定时间内,这个子集未被做任何修改,则将子集中负载最大的节点从子集删除;

LVS的命令介绍


1
2
3
ipvsadm:管理集群服务的命令行工具,工作于用户空间
ipvs:为lvs提供服务的内核模块,工作于内核空间
PS:在linux内核2.4.23之前的内核中模块默认是不存在的,需要自己手动打补丁,然后把此模块编译进内核才可以正常使用:确定内核中是否有ipvs模块,grep-i 'ip_vs'/boot/config-2.6.18-308.el5


ipvsadm命令

ipvsadm 功能及使用:

1
2
3
4
5
6
7
8
9
10
11
12
1.定义集群服务默认方法:wlc
ipvsadm -A|-E -t|-u|-f VIP:PORT {tcp|udp|firewall mark} [-s scheduler调度算法]
-A 添加
-t: TCP协议的集群
-u:UDP协议的集群
service-address:IP:PORT
-f:FWM 防火墙标记fileware mark
server-address: Mark Number
-E 修改
-D 删除
ipvsadm -D -t|-u|-f VIP:PORT 删除定义的集群
# ipvsadm -A -t 172.16.100.1:80 -s rr


2.要为集群服务定义realserver


1
2
3
4
5
6
7
8
9
10
11
12
13
14
ipvsadm -a|-e -t|-u VIP:port -r REALSERVER:port -g|-i|-m(模型) [-w weitht]
-a 添加
-t|-u|-f service-address:实现定义好的某集群服务
-r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射
-e 修改
-w 权重
-d 删除
ipvsadm -d -t|-u VIP:port -r REALSERVER:PORT
-C 情况规则
-R 恢复
-S 保存
其中模式中的-g|-i|-m分别用于dr|tun|nat
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m


3.查看

1
2
3
4
5
6
7
8
9
ipvsadm
-l|-L|--list
-n 数字的方式来显示主机地址和端口号
--stats显示统计的数据信息
--rate 显示统计的速率
--timeout: 显示tcp、tcpin和udp的会话超时时长
--sort:根据协议、地址和蹲坑进行排序
-c:显示当前ipvs连接状况
-Z: 清空,重新计数


4.删除所有集群服务

1
-C:清空ipvs规则


5.保存规则


1
2
3
4
5
6
7
-S
# service ipvsadm save 在 /etc/sysconfig/ipvsadm.web
或者
# ipvsadm -S > /path/to/somefile
载入此前的规则:
-R
# ipvsadm -R < /path/from/somefile


实验:

由于实验环境约束,将对NAT模型及DR模型进行演示。

由于实验过程加起来有点长,本人将在后边的博客中进行贴出。此处留位子以便以后进行编辑。



HA高可用集群详解

什么是高可用集群

高可用集群是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。高可用集群的应用系统有多样化发展趋势,用途也越来越多样化,同时带来了配置及可操作性方面的复杂性,因此选择好的高可用软件至关重要。

PS:上边是学术界给出的说法,笔者觉得一句话就可以了:保证服务不间断安全运行的方式。

少一点文字,直接上关系图:


结合什么是高可用集群的概念与这张图。大概可以划分下其中大致关系:


split-brain:脑裂:

脑裂扰乱心跳信息的传递,集群节点无法有效获取其它节点的状态信息,产生脑裂


什么是状态信息,他们怎么传播状态信息?


1
2
3
节点A B为主从关系(1个挂掉由另外一个接替关系),但是为了更好的确保他们是否知道对方是否出现故障(挂掉),双方(当然节点多的情况下你懂的)要进行通信(也就是发送状态信息),也可以将之称之为(heartbeat),这个传播的通道即为 Messaging Layer。
脑裂的后果之一:
抢占共享存储:假如节点A B都连接到一台MySQL,如果A正在写入数据到表中,但是突然发生了脑裂,B默认接收不到A的信息自然会认为A坏掉了,从而接管A的位子,正式连接到MySQL,恰巧连接到了A正在写入数据的表中,那么双方都在写入,如果都进行存储,势必会发生文件系统崩溃。当然如果是三个节点,ABC,如果AB可以通信。C他们都连接不到,那么自然会认为是C坏掉了,然后干掉C。


避免脑裂的方式:

1
2
3
4
5
6
1、在A和B之间连接一个硬盘,让他们不停的往里面写数据,当检测到对方停止写数据时,自然认为他坏掉了。于是干掉。
2、当节点为多节点的时候,可以引入“仲裁机制”:比如2个节点的场景,A节点性能好,给他2位的权位,B位1位的。如果通信不到,A就干掉B。多节点的情况类似。
without_quorum_policy“法定票数”不够仲裁的情况下:(根据权重票数分法不同)资源隔离设备:
freeze:冻结
stop:关闭停止
ignore:忽略,


CRM: Cluster Resource Manager: 集群资源管理器(CRM是运行在节点上的)

搜索每一个资源的状态,来计算出来资源节点应该运行的级别上,DC。


1
2
3
4
5
6
7
8
9
DC: Designated Coordinator : 指定的协调器(计算粘性的)
(DC:PE,TE)
PE:策略引擎 Policy Engine :得出结果
TE:事务引擎Transaction:指挥执行
LRM: Local Resource Manager: 本地资源管理器
接受TE的指挥,从而在某个节点上运行
LSB:linux Standard Base 符合linux标准库的脚本:
RA:Resource Agent资源代理(俗称脚本)
RG:Resource Group 资源组(将VIP 和IPVS 定义在一个资源组)


资源约束:Constraint (资源粘性)


1
2
3
4
5
6
7
8
9
10
排列约束:coloationconstraint
资源是否能够运行于同一节点
score:
正值:可以在一起负值:不能在一起
-inf:负无穷 inf:正无穷
位置约束:location constraint , score(分数)
正值:倾向于此节点
负值:倾向于逃离此节点
顺序约束(order constraint)
定义资源启动或关闭时的次序 VIP-IPVS