大家好,我是 Snow Hide,作为《左耳听风》这个专栏的学员之一,这是我打卡的第 6 天,也是我第 6 次进行打卡这种操作。
今天我温习了该专栏里一篇叫《分布式系统关键技术:流量与数据调度》的文章。
关键词总结:分布式流量调度功能(服务流控、流量控制、流量管理)、分布式流量调度技术(高性能、高并发、基本业务能力、服务化)、分布式服务状态数据调度、分布式事务一致性问题(主-从、主-主、2PC/3PC、TCC、PRC)、分布式数据节点方案(数据库层面、文件层面)。
所学总结:
分布式流量调度功能
分布式系统中的流量调度的目的是确保系统的稳定性和高可用性。它能起到的作用可以是当系统处于流量过多的情况下,将过度的流量引导至其他空闲的服务上。它能起到的作用还可以是在系统进行自动扩缩容的过程将访问该系统的大量难以应付的流量牵分发至其他不那么繁忙的机器上。
流量系统的主要任务:
- 服务流控:服务发现、服务路由、服务降级、服务熔断、服务保护等等。
- 流量控制:负载均衡、流量分配、流量控制、异地灾备、异地多活等等。
- 流量管理:协议转换、请求校验、数据缓存、数据计算等等。
分布式流量调度技术
分布式系统中的流量调度技术通常是由具有应用程序接口网关(API Gateway)这一特征的的服务或服务器所实现的。
一个健壮的应用程序网关的组成部分:
- 高性能:由于 API 网关是分布式系统中的中枢,所以其必须包含高性能这一特性,具备这一特性的有借助 Lua 语言在 Nginx 服务器上扩展出来的 OpenResty 模块。
- 高并发:分布式系统中高并发解决方案通常是基于服务集群技术来实现的,过程中服务之间需要共享数据,这就需要借助一些特定的算法来保证服务间数据的一致性,这些算有:Paxos、Raft、Gossip。
- 基本业务能力:分布式系统的网关还需要承担一个可以提供基本业务逻辑操作的角色,就像 AWS 里被称为 Serverless(无后端服务器) 的 Lambda 服务。
- 服务化:分布式系统中配置信息的更改操作应该是可以通过调用应用程序接口来完成的,就像 AWS 所提供的可以对某一特定服务进行配置更改的接口。
分布式服务状态数据调度
分布式系统中的状态数据一般用 State 来表示。在使用单体架构时,应用在持有状态的情况下,并不会产生状态数据(例如用户登录的 Session,或者购物车的 Session)不一致的问题。但是当应用被拆分成多个细小的微服务时,原先单体应用持有的状态数据的方案就不奏效了,在分布式服务的情况下我们需要将所有的状态数据存放至第三方的服务器来进行管理,适合用于存储状态数据的系统有:Redis、Memcached、MySQL、MariaDB 等等。而服务本身必须是无状态的,否则会出现意想不到的问题。
例如,某个服务通过自身持有状态的方式(例如存储在服务本地的 Session)授权用户使用它的功能,当用户的后续操作是要通过其他的服务来进行时,由于其他服务并不知晓该用户在之前服务上所产生的状态数据,将导致后来的服务对该用户的申请不予以通过。这也就是为什么我们需要一个在服务之外可以对这些状态数据进行集中管理的服务器。
分布式事务一致性问题
分布式系统中最棘手的问题就是当相同数据处在不同数据服务时的分布式事务一致性的问题,也就是如何才能确保每个数据服务上的相同数据都是一致的。为了确保分布式数据的一致性,则需要在数据服务的性能方面做一些折中了。
主流的方案有:
- 主-从:也就是 Master-Slave 方案。写入主库,从从库读。
- 主-主:也就是 Master-Master 方案。在主库之间进行读写。
- 两阶段提交协议、三阶段提交协议:也就是 2PC(Two-Phase Commit Protocol)和 3PC(Three-Phase Commit Protocol)方案。
- 2PC 的两个阶段:提交投票/请求(Commit Request/Voting)和提交/完成(Commit/Completion)。
- 3PC 的三个阶段:可提交(Can Commit)、预提交(Pre Commit)和提交(Do Commit)。
除了以上主流的一些方案外,还有阿里推出的基于两阶段提交协议实现的 TCC(Try-Confirm-Cancel)方案,或者亚马逊的 PRC(Plan-Reserve-Confirm)方案。
分布式数据节点方案
分布式系统中的数据节点解决方案一般指的是数据库层面或文件层面。
- 数据库层面:数据库层面的分布式方案有 MySQL 的 MySQL Cluster、AWS 的通过复制 SQL 语句实现数据备份的 Aurora 数据库、PingCAP 的 TiDB、阿里的 OceanBase 等等,这些技术均兼容 MySQL 数据库。
- 文件层面:文件层面的分布式方案有 Hadoop、MogileFs、FastDFS、googleFs 等等。
末了
重新总结了一下文中提到的内容:流量调度的功能、流量调度的关键技术、状态数据调度、数据节点问题。