分布式系统的技术栈
前言
最近在拜读耗子兄-分布式系统技术栈一文,现在记录下自己学到的东西
构建分布式系统的目的
- 提高整体架构的吞吐量,服务更多的并发和流量。
- 大流量处理,通过集群技术把大规模并发请求的负载分散到不同的机器上。
- 提高系统的稳定性,让系统的可用性更高。
- 关键业务保护。提高后台服务的可用性,把故障隔离起来阻止多米诺骨牌效应(雪崩效应),如果流量过大,需要对业务降级,以保护关键业务
提高系统的性能
- 缓存系统:缓存分区、缓存更新、缓存命中
- 负载均衡系统(网关系统):负载均衡、服务路由、服务发现
- 异步调用:消息队列、消息持久、异步事务
- 数据镜像:数据同步、读写分流、数据一致性
- 数据分区:分区策略、数据访问层、数据一致性
缓存系统
- 可以提高快速访问能力。
- 从前端浏览器、网络、后端服务、底层数据库、文件系统、硬盘和CPU,全都有缓存。
- 对于分布式缓存系统,首先需要一个缓存集群,其中需要一个Proxy来做缓存的分片和路由
负载均衡
- 是做水平扩展的关键技术。
异步调用
- 通过消息队列来对请求做排队处理,把前端请求进行削峰,后端请求根据自己的处理速度来处理请求。
- 优点:增加系统的吞吐量
- 缺点:实时性比较差,同时还会引入消息丢失的问题,所以需要对消息进行持久化,这会造成有状态的节点,从而增加服务调度的难度。
数据分区和数据镜像
- 把数据按照一定的方式分成多个区,不同的数据来分担不同区的流量,这需要一个数据路由的中间件,会导致跨库Join和跨库事务非常复杂。
- 数据镜像:把多个数据库备份,多个节点可以提供数据读写功能,节点间在内部实现数据同步。缺点:数据一致性问题。
- 在初期使用读写分离的数据镜像方式,后期采用分库分表方式。
提高系统稳定性
- 服务拆分(服务治理):服务调用、服务依赖、服务隔离
- 服务冗余(服务调度):弹性伸缩、故障转移、服务发现
- 限流降级:异步队列、降级控制、服务熔断
- 高可用架构:多租户系统、灾备多活、高可用服务
- 高可用运维:全栈监控、DevOps、自动化运维
服务拆分
- 隔离故障
- 重用服务模块
- 服务拆分完之后,会引入服务调用间的依赖问题。
服务冗余
- 去除单点故障,并可以支持服务的弹性伸缩以及故障转移。
- 对于一些有状态的服务来说,冗余这些有状态的服务会带来更高的复杂性。
- 当其中一个进行弹性伸缩时,需要考虑数据的复制或重新分片,迁移的时候还要迁移数据到其他机器上。
限流降级
- 当系统流量超过系统承载时,只能通过限流或者功能降级的方式来处理。
高可用架构
- 主要时为了不出现单点故障。
高可用运维
- DevOps中的CI(持续集成)/CD(持续部署)。
- 应该有一条很流畅的软件发布管线,包括足够的自动化测试,还可以做好相应的灰度发布,以及线上系统的自动化控制。