网站架构的伸缩性设计
一. 不同功能进行物理分离实现伸缩(新增服务器总是从现有服务器中分离出部分功能和服务):
- 纵向分离:将业务处理流程上的不同部分分离部署
-
横向分离:不同业务模块分离部署
二. 单一功能通过集群规模实现伸缩(应用服务器集群和数据服务器集群伸缩性)
应用服务器集群的伸缩性设计(负载均衡服务器)
-
HTTP重定向负载均衡(利用HTTP重定向协议实现负载均衡,使用302响应码临时重定向)
-
DNS域名解析负载均衡(基于地理位置域名解析)
-
反向代理负载均衡(部署简单,但是反向代理服务器是所有请求和相应的中转站,性能可能会成为瓶颈,在应用层进行转发)
-
IP负载均衡(无需用户进程处理,通过内核进行数据分发,需要修改IP地址)
-
数据链路层负载均衡(直接路由方式,必须要修改数据包的目标IP地址,比如LVS)
负载均衡算法
- 轮询
- 加权轮询
- 随机
- 最少连接(选择处理连接数最少的服务器)
- 源地址散列(源IP进行Hash映射到服务器上,保证同一个IP请求总在同一个服务器上处理)
分布式缓存集群的伸缩设计
注意:分布式缓存服务器集群中缓存访问请求不可以在缓存服务器集群中的任意一台处理,必须先找到缓存有需要数据的服务器然后才能访问,但是新上线的缓存服务器没有缓存任何数据,而已下线的缓存服务器还缓存这许多热点数据。所以目标就是让新上线的缓存服务器对整个分布式缓存集群影响最小。
-
Memcached分布式缓存集群的访问模型
路由算法负责根据应用程序输入的缓存数据KEY计算得到应该将数据下入到哪台服务器(写缓存)或者应该从哪台服务器读数据(读缓存)
- Memcached分布式缓存集群的伸缩性挑战
添加集群后Hash取余映射可能会偏离原本的服务器 -
分布式缓存的一致性Hash算法
通过引入虚拟节点的方式,增加网络中的节点数量,根据Hash的特性,使得负载更加匀衡,然后根据虚拟节点映射到指定的物理节点。
数据存储服务器集群的伸缩性设计
-
关系数据库集群的伸缩性设计(主从,分库,相关产品:Amoeba,Cobar)
比如select * from user where userid in (12, 22, 23),SQL路由模块可以根据路由规则配置(userid为偶数路由到数据库A,userid为奇数路由到数据库B)将应用程序的SQL分解成两条SQL(select * from user where userid in (12,22)和select * from user where userid in (23))
-
NoSQL数据库的伸缩性设计(放弃了SQL和ACID,而强化了高可用性和可伸缩性)
HBase的数据以HRegion为单位进行管理,存储在HRegionServer物理服务器上,所有HRegion的信息记录在HMaster服务器上,为了保证高可用,HBase启动多个HMaster,通过Zookeeper选举出一个主服务器,应用程序通过Zookeeper获得主HMaster地址,输入Key获取Key所在的HRegionServer地址,然后请求HRegionServer上的HRegion获得数据。