第六章 永无止境:网站的伸缩性架构
来源:程序员人生 发布时间:2017-01-09 11:17:41 阅读次数:4221次
第6章 永无止境:网站的伸缩性架构
- 网站的伸缩性是指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就能够扩大或缩小网站的服务处理能力
- 大型网站的“大型”:在用户层面为大量用户及大量访问,在功能方面为功能庞杂,在技术层面为需要部署大量的服务器
- 大型网站是从小型网站渐进演变而来的,也有可能出现脉冲,传统企业易忽视这点(1开始就试图打造大型网站)
网站架构的伸缩性设计
- 不同功能进行物理分离实现伸缩
新增服务器总是从现有服务器中分离出部份功能和服务进行处理
- 纵向分离(分层后分离)
将业务处理流程上的不同部份分离部署
- 横向分离(业务分割后分离)
将不同的业务模块分离部署,粒度可以很小,乃至1个关键网页部署为1个独立服务
- 单1功能通过集群范围实现伸缩
不同功能分离部署,随着网站访问量的逐渐增加,即便最小粒度分离部署,也不能满足业务范围要求,因此要使用服务器集群,集群范围需要同时斟酌对其可用性、性能及关联服务集群的影响
利用服务器集群的伸缩性设计
利用服务器是无状态的,如果负载均衡服务器可以感知或可以配置集群的服务器数量,可和时发现集群中新上线或下线的服务器,并能向新上线的服务器分发要求,停止向已下线的服务器分发要求,那末就实现了利用服务器集群的伸缩性
负载均衡的实现技术有以下几种
事实上,大型网站总是使用DNS域名解析作为第1级负载均衡,域名解析得到1组提供负载均衡服务的内部服务器,然后再进行负载均衡分发要求
数据链路层负载均衡是目前大型网站使用最广的1种负载均衡手段
- 负载均衡算法
- 轮询(可加权)
- 随机(可加权)
- 最少连接(可加权)
- 源地址散列:会实现会话黏滞
- 散布式缓存集群的伸缩性设计
散布式缓存服务器集群中不同服务器缓存的数据各不相同,要求不可以在任意1台缓存服务器上处理,严重制约了散布是缓存集群的伸缩性设计
新加入缓存服务器后应当使全部缓存服务器集群中已缓存的数据尽量被访问,这是散布式缓存集群伸缩性设计的最主要目标
- Memcached散布式缓存集群的访问模型
利用程序通过Memcached客户端访问Memcached服务器集群,Memcached客户端主要由1组API、Memcached服务器集群路由算法、Memcached服务器集群列表及通讯模块构成
读写使用相同的集群路由算法,因此只要缓存存在便能保证命中
- Memcached散布式缓存集群的伸缩性挑战
简单的路由算法使用余数Hash,也可略微改进为加权余数Hash,但是集群需要扩容时大部份数据不能命中,比例随着范围1起增大,利用就会直接访问数据库服务器,大大超过数据库的负载能力,致使数据库宕机,不能简单重启恢复,需要较长时间恢复正常
1种解决办法:网站访问量最小时扩容,此时对数据库负载冲击最小,并且通过摹拟要求方式逐步预热缓存,使缓存服务器中的数据重新散布
- 散布式缓存的1致性Hash算法
构造1致性Hash环(通常使用2叉查找树),缓存服务器根据节点名称的Hash值进行放置,缓存数据根据数据KEY值的Hash值在Hash环上顺时针查找距离最近的缓存服务器节点,完成KEY到服务器的映照查找
扩容时新加入节点只影响环中1小段,继续命中率随着范围1起增大
1致性Hash算法会带来负载不均衡问题,可以通过增加1个虚拟层解决,将每台物理缓存服务器虚拟为1组虚拟缓存服务器,然后根据虚拟缓存服务器Hash进行放置,终究结果是新加入服务器分摊原有缓存服务器集群中所有服务器的1小部份负载,总的影响范围和不使用虚拟层相同
1般1台物理服务器虚拟为150个虚拟服务器比较公道
数据存储服务器集群的伸缩性设计
- 关系数据库集群的伸缩性设计
- 业务分库
- 主从数据库复制
- 单表分片
常见的产品有Amoeba、Cobar
散布式关系数据库访问代理,利用程序访问代理,代理根据SQL和分库规则分解SQL,分发到MySQL集群不同的数据库实例上履行,合并结果落后行统1返回利用程序
代理通常是无状态的利用服务器可以简单负载均衡进行伸缩;MySQL数据库服务器则利用1致性Hash算法和以Schema为单位的数据同步功能进行迁移,同步完成落后行Schema的IP修改并删除原有机器中的相干Schema便可
- 优点:性能和直接访问数据库相当;代理代替利用程序连接数据库,需要保护更少的连接,减少没必要要的资源消耗
- 缺点:需要避免事务或利用事务补偿机制代替数据库事务;需要分解数据访问逻辑避免Join操作;带有Join功能的代理延迟太高
- NoSQL数据库的伸缩性设计
- 放弃关系型数据库的以关系代数为基础的结构化查询语言(SQL)和事务1致性保证(ACID),强化高可用性和可伸缩性
- 利用最广泛的产品有HBase
- 数据以HRegion为单位进行管理,每一个Region存储1段Key值间的数据,HRegionServer是物理服务器,每一个HRegionServer可以启动多个HRegion实例,HRegion写入数据太多到达阈值时会分裂成两个HRegion,并在全部集群中进行迁移,使得HRegionServer的负载均衡
- 数据写入和访问:利用程序通过Key向Zookeeper(散布式数据管理服务)要求主HMaster地址,利用程序再通过Key向HMaster要求HRegionServer地址,最后再要求HRegionServer上的HRegion得到数据
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
------分隔线----------------------------
------分隔线----------------------------