-
负载均衡集群
-
服务器性能的扩展:
Scale On
:表示性能上面的向上扩展,通常是通过提供更好硬件来满足要求,硬件的性能增长比例不能够带动实际性能的线性增长,并且在一定的范围内是会下降的,并且价格上面的增长是难以接受的;Scale Out
:表示实现向外进行扩展,使用服务器的数量来分单服务器的请求,接下来需要是下服务器请求的负担;- 1.可以通过
DNS
的A
记录解析,来实现负载均衡的目的,这个解析并不是很理想,导致大量主机通过A
记录得到的都是一台服务器主机的地址; - 2.通过前端设备,来接收请求,并且将请求根据一定的调度算法分发到后端主机上面;
- 调度算法:
Round Robin
:轮询调度算法,通常来说一个主机的请求同时存在的不止由一个,如果将这些请求进行分发,那么响应速度就会快的多;但是这种算法忽略了各个服务器性能的差异,有的服务器性能好,有的相对比较差,这个调度算法比较粗燥;Weight Round Robin
:表示加权轮叫算法,可以考虑不同服务器的处理性能;
- 调度算法:
- 1.可以通过
-
上述集群称为负载均衡集群
(Load Balancing)
;通过服务器的恰当组合来实现处理大规模服务请求的集群,称为负载均衡集群; -
负载均衡集群的的数据共享方式:
Mysql
服务器:使用Mysql
集群来完成集群的的数据共享,但是数据库不能够保存图片等附件信息;NFS
:NFS
服务器将附件文件目录进行共享,处理用户请求的服务器可以通过共享来实现上传;这种方式需要借助于文件的同步机制,常见的文件同步机制:rsync
:用于实现文件同步和复制,相同的掠过,不同的进行复制,支持远程复制,可以通过crontab
来定义同步时间,还可以通过主动的通知机制来确保数据的实时同步,监控文件改变的机制是通过内核来实现的,内核可以通过Inotify
机制来确保将文件发生改变的信息通知给用户空间;所以可以结合rsync+inotify
来实现文件级别的数据同步;
-
集群的思想是将各种不同的功能进行区分,分别使用不同的集群来进行负责,每个不同的集群使用不同的调度器来负责实现负载均衡;
-
对于负载均衡集群的
directory
节点,会成为性能瓶颈,所以需要使用高可用集群来保证单个节点的高可用;高可用集群之间的健康信息检测需要通过心跳信息来确保;
primary <----> standby primary
将自己的heartbeat
信息随时传递给standby
服务器,只要收到这个信息就认为是正常的; -
Load Balance 集群分类
-
硬件级别:
F5 BIG IP
,以及Citrix Netscaler
和A10
;
-
软件级别:
- 四层负载均衡设备:
Linux virtual server
:可以根据用户的IP地址和端口号来实现将请求发送给分发给不同的后台主机的,章文嵩,工作性能更好,但是支持的不支持某些高级特性;
- 七层:
nginx
:代理的协议包括http smtp pop3 imap
haproxy
:用于代理http tcp(Mysql smtp)
;
- 四层和七层协议的区别:
* 四层不解析高层协议,所以工作性能更好,也正是因为这个原因,不支持对于高层协议的解析;
* 七层称为反向代理,可以精确的解析某种协议,并且对于这种协议进行某种修改之后,向后进行负载均衡,操纵能力更强,性能可能会降低,可以根据根据实际的项目需求进行配置;
- 四层负载均衡设备:
-
Linux Virtual Server
:
* 负载均衡设备,后端设备称为real server
,用于实现根据用户定义的IP地址和端口[通常是集群服务],来将不同用户的的不同端口的请求,调度到不同的后端real server
,对于非集群服务是不会进行代理的,LVS
也是工作在内核上面的,借助于Netfilter
的框架,LVS
工作在Input
链上面,如果用户请求的是集群服务,那么就进行修改并且转发至forward--->postrouting
链,送往后端主机;
* Warning: LVS和IPtabes是不能够同时使用的 -
LVS
是由两段组成的:
-
ipvsadm
:用于管理集群服务的命令行工具; -
ipvs
:工作在内核上面,并且监听在input
链; -
Linux 2.4.3
之前的内核版本需要编译内核,并且需要向内核打补丁,2.4.3
以后的版本直接内置的IPVS
的代码, -
schedul method
:挑选一个后端服务器接收用户新请求的计算标准,根据调度器,可以配置调度不同的后端集群;
-
LVS
对于地址协议栈的命名:LVS
工作主机提供的IP
称为VIP virtual IP
,后端服务器的Server
提供的IP
称为RIP
,LVS
工作主机和RIP
进行通信时,提供的IP
称为DIP
,发起请求的服务器端IP
称为CIP
; -
LVS
的类型:Network Address Translation(LVS-NAT)
:
* 表示地址转换,多个目标主机的DNAT
,访问的过程通常是Client IP ---> VIP ---> RIP(DIP)
;数据返回的过程通常是RIP(DIP) ---> VIP ----> Client IP
;
* 需要遵守的基本法则:
* 1.cluster
的IP
地址和Director
的IP
地址必须在同一个网路里面,并且网关是Director
;
* 2.RIP
地址通常都是私有地址,并且仅仅能够用于和DIP
以及各个集群节点之间进行通信;
* 3.Director
负责处理所有的通信,包括出来的和进来的,集群性能瓶颈所在,最多代理超过10
个用户代理;
* 4.集群节点Real Server
需要使用DIP
作为网关;
* 5.Director
可以实现端口映射,主要是借助于DNAT
实现的;
* 6.realServer
可以使用任何操作系统;
* 7.较大规模的应用场景中,director
容易称为操作系统的瓶颈,
* Direct routing(LVS-DR)
:
* 直接路由:Director
上面配置VIP/DIP
(网卡别名),VIP
用于接收用户请求,DIP
用户和后端的服务主机进行通信;
* Real Hosts
上面配置DIP/VIP
(网卡别名),不用于响应服务请求,只用于回送报文作为目的地址使用,在路由器发送ARP
报文时,Real Host
虽然配置有VIP
,但是不能够用来进行本地网路的通信,仅用于Directory
进行通信,所以很关键的步骤就是需要实现Real Server
的VIP
地址的隐藏;
* 在DR
模型中,由于在一个局域网里面是通过MAC
机制进行通信的,所以路由器首先需要进行ARP
广播,获得目的主机的MAC
地址,然后进行目的MAC
帧封装交给Director
,在这一步具有同样VIP
的Real Server
的地址需要进行隐藏,不能够响应ARP
报文,Director
在根据调度算法进行帧RIP
封装交给后端的RIP server
;
* 对于Directory
在将报文转发给后台的Real Server
时,是不会修改目标地址的,也就是不会拆分IP
协议报文的,而是通过修改MAC
地址来实现和Real Server
的RIP
进行通信的;
* 对于上面这种模式,Director
仅仅负责处理入站请求,对于响应的报文不进行任何处理;DR
模型可以处理上百台请求;
* DR模型的要求
* 1.集群节点和directory
必须在同一个物理网络网络中;
* 2.RIP
可以使用公网地址,这样在Dirctory
损坏时,可以使用公网地址进行通信;
* 3.Directory
仅仅处理入站请求,响应报文可以直接发送客户端;
* 4.集群节点不可以将网关指向DIP
,而是直接使用前端网关
* 5.Direcory
不支持端口映射,Real Host
直接发送相应报文给请求主机,如果端口不同,Client
会丢弃相应报文,并且这一步对于MAC
报文进行拆装,并没有对于IP
报文进行拆分;
* 6.因为Real Server
要求必须隐藏RIP
,所以不是所有的操作系统都适合的;
* 7.Direcotry
: 可以处理更多的物理请求;
* IP tunneling(LVS-TUN)
:
* 隧道技术,类似于DR
,在进行转发时,需要重新封装IP
报文;
* CIP+VIP
封装的报文送给Directory
,然后将Directory
通过自己的调度算法,在这个IP
报文的基础上面再次封装包含RIP2
信息的首部;
* RIP
在接受到报文信息后,首先将拆掉第一层报文封装信息,在返回报文时,将VIP
作为自己的源IP
,目的IP
为CIP
;
* IP tunneling
的要求:
* 1.各个集群节点没有必要在同一个网络中;
* 2.Real Server
的RIP
必须是公网地址;
* 3.Directoy
仅仅处理入站请求,相应报文由Real Server
直接发送给客户端;
* 4.Real Server
网关不能够执行Director
;
* 5.只有支持隧道协议的OS
,才能够用于Real Server
;
* 6.不支持端口映射;
* LVS的调度算法:
* 静态调度算法:
* RR
:表示轮询,每个服务器都是同样的权值,对于每个服务器依次进行轮询,不考虑每个服务器的响应差异;
* W RR
:表示Weight RR
,针对不同服务器的性能,改变权值,可以更好的发挥服务器的性能;
* Source Hash
:进行源地址HASH
,只要是同一个地址段的请求,都发送给同一个 Real Server
; 在第一次接收请求时,首先对于源地址进行Hash
计算,然后保存在Directory
表中,并且和分配的IP
地址的主机相对应;在这个客户端第二次进行请求时,直接转交给对应的Real Server IP
地址;
-
关于
cookie
的认证信息:
- 当浏览器发送的认证信息(包括用户浏览的信息等)到某个服务器时,服务器保存的用户浏览商品的信息,就应该通过一个
Session
信息来进行保存的,Http
协议是无状态的协议,Client
进行第一次认证之后,服务端将认证信息保存在本地,并且将认证通过得到凭证发送给Client
,Client
保存一份在本地,之后一段时间的认证信息和服务请求信息都可以通过这个凭证进行认证Client
端身份;Client
在发送请求时,往往会将所有的本地Cookies
都发送给Server
一份,这会导致用户的隐私泄漏,之后采用的策略是将用户的session
信息和Cokies
信息维护在Server
的内存中,用户的cookies
仅仅保存用户的认证信息; - 为了避免其中一个服务器出现故障,导致用户的
Session
会话信息消失,这里应该使用Session
会话共享机制,将这些信息保存在一个共享的服务器上面,或者各个Server
之间进行Session
的同步; 如果实现了Session
共享,那么就可能不需要进行SH
算法机制了; Destination hashing
:- 目标地址
HASH
,根据目标地址进行挑选,实现的目的是为了将来自同一个目的的请求发送给同一个Server
,挑选的算法是不同的; - 这个算法和缓存的命令率有关,假设用户请求的是某一个
Cache Server
,Cache Server
里面的内容并不存在那么需要请求原始的服务器,并且在缓存服务器中进行Cache
,那么对于同一种请求,应该在一段时间内,仍然转交给其中的一台服务器,只有在其他的Cache Server
中同样保存缓存内容时,这个请求的Hash
失效;DH
并没有考虑每一个Cache
的连接数;
- 目标地址
- 上面的这些算法在进行调度时,不需要考虑服务器是空闲的还是繁忙的,仅仅是按照
Direcotr
的内置策略进行调度的; active
:表示用户的请求正在处理用户的数据传输请求;inactive
: 只需要维护活动的状态,资源需求少;- 动态调度算法:
least conection
:最少连接调度算法;用于计算后端服务器的活动连接和非活动连接,哪一个连接的数目小,就挑选哪一个,通常计算方法是active*256+inactive
;Weight least connection
:计算方法是(active*256+inactive)/n
,n
表示权重;
- 通常在在服务器都没有连接处理请求进行处理时,尽可能挑选性能比较强的服务器进行使用;
WLC
不具备这样的功能;Shorst Expecation Delay
:最少期望延迟,不考虑非活动连接,计算方法是(active+1)*256/weight
,但是会出现会出现性能较差的服务器,好久都不能够出现请求的现象,也就是请求饥饿;Never Queue
:表示永不排队;在SED
的基础上能够尽快的转发用户的请求,用于将请求尽最大可能转发给没有接受连接的real Server
;locality-Based Least Connections
:表示基于本地的最少连接,目的和DH
一样,常用于缓存服务器当中,再多个缓存服务器都有缓存内容的时候,尽量挑选一个空闲的服务器,但是可能破坏命中率,尽可能保证对于同一个服务器的请求发送给同一个Real Server
;这个算法就是动态的DH
,用于尽最大可能的讲对于同一个服务器的请求权发送诶同一个Real Server
;Locality-Based Least Connections with Replication
:表示基于本地的带复制功能的最少连接; 这个算法用于尽最大可能的保证缓存命中率以及负载均衡效果;- 对于新的请求尽可能的发送给连接数较小的
Real Server
,缓存复制机制就是在各个Cache Server
上面建立缓存条目,允许各个Cache Server
之间按照某种协议处理之间的缓存交换,可以实现缓存对象;
- 对于新的请求尽可能的发送给连接数较小的
- 默认方法是
WLC
,非活动连接,在连接数非常大时,是不能够忽略的;
- 动态调度算法:
- 当浏览器发送的认证信息(包括用户浏览的信息等)到某个服务器时,服务器保存的用户浏览商品的信息,就应该通过一个
-
高可用集群
-
High Avaliablity
:前端的调度服务器同时还需要完成后端服务器的健康状况检查(Health Check
(正常或者不正常)),否则转发给的请求,就会被丢失,需要连续检查几次,来判断后端服务器是否正常,通过进行健康状况检查,可以将故障节点隔离出去,也可以将正常节点加入集群; -
各个节点之间的信息不能够通过广播的方式进行通信,可以使用组播的方式进行传递,相同的节点位于一个广播域里面,如果里面某个节点发生故障,改由谁来进行处理这个仲裁是交给
DC()
来进行裁决的; -
脑裂:左右两个设备可能出现脑裂现象,其中一台主机以为另一台主机故障,执行抢夺策略,另一个主机在网络资源被夺走后,仍然向共享设备上面上面写入数据,可能导致数据文件损坏,这就是脑裂现象;
- 为了防止这种情况的出现,在单方面认为某个主机故障之后,向电源管理设备发送数据切断改主机的电源防止出现脑裂现象;
- 或者通过存储设备来隔离
node
;
-
隔离级别分为两种:
node
级别和资源级别,需要设备支持远程管理指令; -
高可用集群最少需要奇数个节点,仲裁机制,必须确保集群中的哪一个半是有效的,那一半是无效的,并且处于集群中的node必须知道自己是有效的还是无效的;
-
两种集群的对比
-
Load balance
:是用于提高服务的并发处理能力为着眼点的; -
High Avaliablity
:是用于保证服务的在线能力为着眼点的; -
在线时间的:在线时间/(在线时间+故障处理时间)
99% 99.9%
十倍可用性的提升,99.99% 99.999%;
-
高性能集群
-
用于实现高性能计算的集群,
HP High Performance
,表示高性能计算机集群,用于实现将存储和计算能力分散在多个计算资源上面,分布式文件系统完成资源的分布存储,高可用集群完成资源资源的计算,利用分布式文件系统,实现将大任务切割为小任务的处理机制,通常有hadoop
集群; -
关于底层的存储设备
-
DAS
:表示直接存储设备Direct Attached Storge
,也就是直接附加存储设备,是在块级别的设备存储访问,其中UltraSCSI
的速率为20Mbps
,通常SAS
的速率可以达到6Gbps
;是通过内核直接操纵块级别的设备,如果是同一个主机上面的两个进程同时操纵一个块级别的设备,内核可以通过加锁来防止同时操作同一个块级别的设备,如果是位于两个主机A B
上面的进程同时访问DAS
设备,A
主机将文件放在内存缓冲区中进行操作,B
也进行同样的操作,根据内核的调度策略然后同步到磁盘上面,DAS
进行文件合并时,就会出现文件系统错乱,因为锁机制不能够跨主机存在;
-
NAS Network Attached storage
:表示网络附加存储设备,表示文件级别设备访问存储,NAS
自身提供了锁控制机制,可以通过锁机制阻塞其他主机对于同一个文件的请求操作;