Linux集群理论及技术

一、定义分类

由多台提供相同服务的Linux服务器组成的集合,称为Linux集群。根据集群作用分类为:

1、负载均衡集群(LB)
目的是能够根据网站需求,自由扩展
2、高可用集群(HA)
目的是保障服务长时间可用
3、高性能集群(HP)
目的是解决大数据分析和计算

二、评估网站系统指标

1、可扩展性:根据网站需求,自由扩展或缩减
2、可用性:一般使用百分比来评估,95%,99%,99.9%,99.99%,99.999%即,可用性=年可用时长/一年总时长
3、性能:对整个网站访问量和响应时间的评估指标
4、容量:网站访问量,服务器硬件配置评估指标

三、评估运维水平的指标

1、可用性:重中之重,最基础的指标
2、标准化:对多套系统,架构的标准制定;例如:版本控制(包括系统,应用等),目录路径的统一;最后的效果是:提供相同服务的服务器做到只有一个指导文档
3、自动化:做到标准化以后,可以根据自己的需求定制开发自己的运维工具,达到自动化的目的

四、网站演化思路

1、分层:接入层——>应用层——>服务层——>数据层
2、分割:化整为零,将大业务切割成多个小业务
3、分布式
分布式分类举例:
    *分布式应用
    *分布式静态资源
    *分布式数据和存储
    *分布式计算

五、网站演化举例

一个以PHP开发的电商网站,初始只有一台lnamp服务器。那服务器遇到瓶颈怎么做扩展呢?

1、换高配硬件服务器

wKiom1Yc1JTBkQG1AACa7HHJ_oI933.jpg

这种通过更换硬件提高服务器配置性能的扩展,称为纵向扩展。但是,单台服务器的硬件配置终究会有用完的时候,而业务的增长却可以无限制;并且,随着硬件配置的提高,单台硬件服务器的价格也是呈几何倍数增加,投入产出的性价比会越来越低。

2、DNS解析

wKioL1Yc1PnS6_QFAACcorass0w645.jpg

这种通过增加提供相同服务的服务器的扩展方式,称为横向扩展。原理是:增加一台提供相同服务的服务器,通过DNS将访问请求分别解析到不同的ip地址,来达到分流的目的。

这种简单的分流方式存在比较多的问题:1DNS的缓存作用会使分流效果大打折扣;2、服务器之间没有共同的数据存取地址和通信机制,动态网站存在数据不同步问题;3、连接的会话可能会被分配到两台服务器上,造成用户看不到之前的操作,还是同步问题

3、分割

wKiom1Yc1UriQzbGAADFfGS8gxo099.jpg

这也是横向扩展的一种方式,将一台服务器上占用大量资源的服务拆分到单独的服务器上,减轻服务器压力。直到服务器正常,或者直接使每台服务器专注于一件事。

4、集群

经过3分割(分层)后,访问连接数增长,依然会面临资源问题。此时,需要增加某个资源紧张的节点服务器,组合成集群分担压力。类似2中,并行的增加一台节点服务器。例如:3中的AP节点压力过大,资源紧张,就需要增加AP环境的节点数量。所有的AP节点集合组成一个AP集群,其他层次的节点是相同的道理。

wKioL1Yc1ZvCcV1sAACd7fCfTLI832.jpg

5、集群调度

为了解决2中的DNS缓存带来的问题,在集群前端添加一层,作为集群的调度器。调度器的作用就是替代DNS的解析分流方式,由调度器来完成。DNS解析到LB,由LB来分配具体将连接分发给哪个服务器处理。

wKioL1Yc1gDBQcnOAACiX_gELYs067.jpg

6、SPOF

Single Point of Failure故障单点。问题思考:上面的架构,存在的致命问题,万一LB服务器挂了,造成什么后果?该怎么办?此时,两台LNAMP服务器不再直接面对外部的用户,连接全部由LB转入这两台服务器的。这样造成的结果就是“服务不可用”,尽管LNAMP两台服务器一点问题都没有。这样的LB服务器在这个架构中就被称为故障单点。那怎么解决?做冗余,下图

wKiom1Yc1e2Ap0utAACrTdh_Ryw983.jpg

两台LB之间通信,slave固定检测master是否可用,不可用时slave生效顶替master的工作。与mysql的主备结构原理相同

7、缓存

缓存技术是加快服务响应时间的重要手段。在分层结构中每层的前面加入缓存层,可以加快相对服务层的响应速度,CDN技术就是一种缓存手段。缓存的原理就是将静态且访问量最多的数据缓存到内存中,省去内存从硬盘查找读入内存的操作时间,从而达到加速的目的。

缓存命中率:在缓存服务器上读取到的数据所占所有访问数据的比重。需注意影响命中率的因素有:内存太小、数据更新频繁,都会降低命中率。甚至,可能因为频繁的将不同的数据缓存入内存,内存硬盘数据交互加剧,造成不必要的资源开销浪费。得不偿失;

8、消息队列

构建高可扩展性的网站架构需要遵循的基本原则:在集群系统内部尽量避免串行化和交互。如果无法避免,可以交互系统之间加入中间层,对系统进行解耦。

消息队列在消息的传输过程中保存消息的容器消息队列是一种行之有效的解决系统交互,解耦的方法。

wKioL1Yc1jaxBBCcAAB7HVjWsEw764.jpg 

例如:B服务的运行需要用到A服务的运行结果。1AB之间没有中间的一层(AB直接通信),如果一段时间B的程序运行时间过长,A无法将运行结果交付给B。就会造成A必须等待B而无法运行新的运算,从而浪费A的资源。

2AB之间有一层中间层(例如消息队列),A运行得到的结果存入消息队列,继续下一个请求。B随时可以从队列内读取数据,从而避免上面的情况,使A在任何时间都可以接收处理任务请求。