2015.3.13修改
分布式系统通常服务大请求、维护着大数据、快速响应、长时间可用。设计分布式后台服务需要考虑的东西很多,本文给出一些常用的设计准则,以备查看。
- 可用性:系统可以正常服务的时间,一些在线系统常常要求99%的可用性。高可用性往往通过关键组件备份冗余来实现(如冷备、热备)
- 性能:快速响应、低延迟
- 可靠性:系统可靠就是同样的请求返回同样的数据;更新能够持久化;数据不会丢失
- 可伸缩性:系统额外还能处理多少流量、能否轻易增加存储容量和计算能力来应付更多的工作
- 可管理性:便于运维,整个系统是否便于维护和变更,常常考虑的有-问题发生时能及时方便的发现和处理,系统修改和更新是否易于操作
- 成本:软硬件成本、部署和维护成本、学习成本
现实中面对这些要求常用的解决办法:
准则 | 战术 |
可用性 | •高可用集群 •有损服务:通过精心拆分产品流程,选择性牺牲一部分数据一致性和完整性从而保证核心功能绝大多数运行。降级或关闭一些辅助策略或者不必要的服务。 •异步消息 •请求限流(丢弃超过处理能力的流量) •隔离:服务隔离、数据隔离、资源隔离 •容量规划(单机容量(qps)=最大处理线程数/单次请求平均响应时间,系统容量(qps)=单机容量*机器数*r(容量系数,预留30%的冗余应对突发状况) •快速拒绝:尽早拒绝过载请求 •大系统小做:把复杂的大系统拆成多个独立、高度自治的小系统,实现高内聚低耦合,避免牵一发动全身 |
性能 | •负载均衡 •缓存,数据预加载 •数据读写分离、数据分片、分库、分表 •索引 •并发处理 •异步处理 •超时控制(丢弃超时响应) •阻塞容错
|
可伸缩性 | •弹性云计算平台 •数据层面:读写分离、数据分区 •应用层面:垂直伸缩、水平复制、功能分级(服务无状态)、应用分片 |
上表里面不管是服务还是数据都提到分区或分片,或者垂直/水平,其实就是切分的两个方向:
- 垂直扩展:单台服务器增加更快的CPU、更多的内存或磁盘,通过升级机器来达到扩展目的
- 水平扩展:增加更多的节点,需要从软件层面,系统架构支持这种扩展
来解释下常见的策略:
- 缓存上置:缓存往往存在于架构的上层,以实现不用经过繁重的下层处理而尽快返回数据。会用到分布式缓存和全局缓存
- 代理:用于接收从客户端发起的请求并传递到后端服务器。功能有过滤请求、记录日志、协调资源、请求转换等
- 负载均衡:处理并发请求,并将这些请求路由到一个节点上,使系统有可伸缩性、资源得到充分利用、提高响应
补充:
提高响应性能的手段归根结底就是三板斧:队列(Queue)、缓存(Cache)和分区(Sharding):
队列:可以缓解并发写操作的压力,提高系统伸缩性,同时也是异步化系统的最常见实现手段;
缓存:从文件系统到数据库再到内存的各级缓存模块,解决了数据就近读取的需求;
分区:保证了系统规模扩张和长期数据积累时,频繁操作的数据集规模在合理范围。