网站的伸缩性架构
网站的伸缩性设计
不同功能进行物理分离实现伸缩
回顾网站架构发展历程,网站架构史就是一部不断向网站添加服务器的历史。只要工程师能向网站的服务器集群添加新的机器,只要添加新的服务器能线性提高网站的整体服务处理能力,网站就无需为不断增长的用户和访问而焦虑
单一功能通过集群规模实现伸缩
即使分离到最小粒度的独立部署,单一的服务器也不能满足业务规模的要求。因此必须使用服务器集群,即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,当一头牛拉不动车的时候,不要去寻找一头更强壮的牛,而是用两头牛拉车。
应用服务器集群的伸缩性设计
- HTTP重定向负载均衡:利用HTTP重定向协议实现负载均衡。
- DNS域名解析负载均衡:利用DNS处理域名解析请求的同时进行负载均衡
- 反向代理负载均衡:利用反向代理服务器进行负载均衡
- IP负载均衡:在网络层通过修改请求目标地址进行负载均衡
- 数据链路层负载均衡:在通信协议的数据链路层修改mac地址进行负载均衡
分布式缓存集群的伸缩性设计
分布式缓存集群的访问模型
在网站业务中,大部分的业务数据读操作请求事实上是通过缓存获取的,只有少量读操作请求会访问数据库,因此数据库的负载能力是以有缓存为前提而设计的。
伸缩问题:新增缓存服务器导致大部分缓存失效
Tips: 现在业界使用Redis作为缓存也非常常见
分布式缓存的一致性Hash算法
为了改进路由算法,使得新加入的服务器不影响大部分缓存数据的正确命中,现在流行一致性Hash算法,该算法用一个叫作一致性Hash环的数据结构实现KEY到缓存服务器的映射。
- Part1:把服务器映射到环上
- Part2:顺时针找到第一他服务器
- Part3:增加一台服务器
- Part4:虚拟服务器
Tips:俗话说,计算机行业的所有问题都可以通过增加一个抽象层来解决。计算机硬件、计算机网络、计算机软件都莫不如此。计算机网络的7层协议,每一层都可以看做是下一层的虚拟层;计算机操作系统可以看作是计算机硬件的虚拟层;Java虚拟机可以看作是操作系统的虚拟层;分层的计算机软件架构事实上也是利用虚拟层的概念。
数据存储服务器的伸缩性设计
关系数据库集群的伸缩性设计
- 市场上主要的关系数据都支持数据主从复制功能,使用这个功能可以对数据库进行简单伸缩
- 不同业务数据表部署在不同的数据库集群上,即俗称的数据分库
- 在大型网站的实际应用中,即使进行了分库和主从复制,对一些表单数据仍然很大的表,比如Facebook的用户数据库,淘宝的商品数据库,还需要进行分片,将一张表拆开分别存储在多个数据库中
NoSQL数据库的伸缩性设计
问题:关系数据库难以处理海量数据及僵硬的设计约束
解决方案:NoSQL(Not Only SQL),作为关系数据库的补充,而不是替代方案。一般而言,NoSQL数据库产品都放弃了关系数据库的两大重要基础:以关系代数为基础的结构查询语言(SQL)和事务一致性保证(ACID),而强化高可用性和可伸缩性。
业界流行:目前应用最广泛的是Apache HBase