11月29日
许多大型的网站都是从小型的网站逐步发展过来了,所以我们经常说的一句话是网站不是设计出来的,而是演化出来的。网站从小到大的一个过程就是它的演化过程,在这个过程中网站需要处理越来越多的流量而处理越来越多的流量,对网站的具体需求就是要求网站能够具有更高的并发处理能力,并且可以平滑的进行这种处理能力的升级。这就是网站的伸缩性。通常情况下,我们一般只会研究网站的生而不会研究所因为随着时间的推移,网站的发展规模是越来越大的,除非一些特别的情况,比如一个互联网公司进行某项活动,活动时房门数量很大,活动以后又恢复原状,这个时候就需要根据业务的实际情况,灵活的调整互联网网站的结构,伸或者是缩。
对于网站的伸缩,大概可以分为两类,一类是根据功能进行物理分离来实现伸缩,一类是通过单一功能通过集群实现伸缩,进行物理分离是根据各个应用对负载的要求,对硬件设备进行相应的配置,要求高的用高配置要求低的用低配置来实现伸缩,通过集群来实现伸缩式通过向集群中添加服务器,集群中服务器的数量与他的处理能力呈线性的相关,服务器越多,处理能力越强。
不同的功能实现伸缩,通常最早期的网站是单一服务器,处理所有的服务,接下来会将功能最薄弱的数据库单独分离出来部署专门的服务数据库服务器,为了提高网站的响应速度会设置缓存服务器。还会吧,静态资源也从服务器分离出来,实现几个部分所构成的互联网网站的主体。由此我们可以将整个互联网网站从上到下分成网站的应用,服务,数据存储三个部分,其中具体的业务又可以分成不同的模块。每个模块都可以作为一个集群单独部署模块与模块之间具有低耦合性,互不影响这保证了每一个模块的服务器集群可以通过向其中添加服务器的方式增强其可并发处理的能力。
我们现在已经有了一个应用服务器集群,那么我们可以通过向集群中添加服务器的方式增加它的并发处理能力具体是怎么做的呢?我们必须要有一台负载均衡服务器这台服务器就像一个指挥官,会把他接收到的访问请求,以不同的方式分发给集群中的所有服务器,这些分发方式可以采用多种技术实现,比如常用的HTTP重定向DNS域名解析,反向代理负载均衡,IP负载均衡,以及数据链路层负载均衡,目前最常用的是最后一种方式,数据链路层负载均衡技术,这种技术也叫做三角传输模式,所谓数据链路负载均衡是指根据用户的MAC地址进行负载分发而不修改数据的IP地址。这样当用户访问web服务器的时候,外部服务器集群中的服务器并不需要更改数据的原地址和目标地址相当于外部服务器集群与用户的浏览器终端直接进行访问。
负载均衡算法是指访问请求的分发方式,比如说轮询是指请求被依次分发到每台应用服务器上,加权轮询对于集群中配置高的服务器,我可以让他多处理一些请求,所以给相应的服务器增加相应的权重随机分发顾名思义,就是指按照随机情况分配到各个应用服务器。最少连接分发方式就是查询各个集群服务器的连接数目把服务请求分发给连接最少的那台服务器相应他的处理能力是剩余最多的。最后一种是源地址散列服务器,为了把来自于同一个浏览器客户端的请求都由同一台服务器处理,可以使用这种方式,这种情况往往服务请求中会包含上下文信息的状态,这个状态可以供一个会话周期内的多次服务请求重复使用。
分布式缓存集群也可以通过向集群中添加服务器的方式实现应用程序,首先通过其客户端来访问缓存服务器集群客户端主要是由应用程序接口服务器集群的路由算法以及服务器集群列表和通信模块,这几部分构成。路由算法主要是处理对应用程序请求的分发发到哪一台具体的服务器中。分布式缓存集群的伸缩性有两个挑战。一个挑战是缓存无法命中的问题。比如说向集群中添加一台服务器,相应就要从其余服务器中转移一部分数据到这台新添加的服务器当中,通常采用的方式是嗯利用哈西余数来决定具体保存到哪一台服务器中,但是这样做会导致大量数据不能命中,服务请求将会直接访问后端的数据库,造成数据库的巨大的负载压力。一种解决办法是用一致性哈希算法。这种具体实践中是建立一个一致性的哈西环将服务器节点分布在环上,然后逆时针运转,当服务器需要新添加的时候从当前节点逆时针运转到下一个节点,上一个点到该节点之间的数据可以缓存的新加入的节点这样一致性哈希环上的大多数节点依然保持原有的缓存,这样能够对缓存数据造成最小的影响。但是这样也会带来另外一个问题,毕竟上一节点到新加入节点之间的缓存数据非常的少,这会造成所有的缓存服务器数据分布不均衡的问题。具体的解决办法就是在一致性哈希环上建立一个虚拟层,将虚拟节点平均分布在这个虚拟层上。这样就得到了一个数据,平均分布的一致性,哈希还,然后再将这个平均分布的哈西环上的数据对应到实际的物理服务器上。
对于数据存储服务器的伸缩性主要包含两个部分,一个是关系型数据库集群的伸缩,这不是简单的向集群中添加服务器那么简单,通常的做法,而是对于mysql数据库采用读写分离的方式,从主主服务器中写入数据在从服务器中读取数据,从服务器从主服务器中获取数据复制。其它方法是通过建立一个关系数据库的访问代理,通过代理来实现负载分发的方式。将数据均匀的分发到数据库服务集群中去,同时服务代理还需要对查询结果进行合并,最终转发给应用。