文章目录
- 1. 应用服务拆分
- 2. 分布式调用
- 3. 分布式协同
- 4. 分布式计算
- 5. 分布式存储
- 6. 分布式资源管理与调度
- 7. 高性能与可用性优化
- 8. 指标与监控
将分布式架构需要解决的问题按照顺序列举为如下几步
问题分类 | 具体内容 |
---|---|
应用服务拆分 | 分布式是用分散的服务和资源代替集中的服务和资源,所以先根据业务进行应用服务拆分。 |
分布式调用、协同与计算 | - 由于服务分布在不同的服务器和网络节点上,所以要解决分布式调用的问题。 - 服务能够互相感知和调用以后,需要共同完成一些任务,因此需要解决分布式协同问题。 - 在协同工作时,会遇到大规模计算的情况,需要考虑使用多种分布式计算的算法来应对。 |
分布式存储、资源管理与调度 | - 任何服务的成果都需要保存下来,这就要考虑存储问题。和服务一样,存储的分布式也可以提高存储的性能和可用性,因此需要考虑分布式存储的问题。 - 所有的服务与存储都可以看作资源,因此需要考虑分布式资源管理和调度。 |
服务的高性能与高可用、与监控 | - 设计分布式架构的目的是实现高性能和可用性。为了达到这个目的,一起来看看高性能与可用性的最佳实践,例如缓存的应用、请求限流、服务降级等。 - 系统上线以后需要对性能指标进行有效的监控才能保证系统稳定运行,此时指标与监控就是我们需要关注的问题。 |
1. 应用服务拆分
分布式架构的第一步是应用服务的拆分。合理的拆分方式能够确保系统的高可用性和可扩展性,而拆分过细或过粗都会带来额外的复杂度。为此,领域驱动设计(DDD)提供了一种有效的方法,它通过领域建模、限界上下文划分等方式,确保服务的高内聚、低耦合。
2. 分布式调用
针对调用的问题,在不同架构层面有不同的处理方式:
- 在用户请求经过互联网进入应用服务器之前,需要通过负载均衡和反向代理;
- 在内网的应用服务器之间需要 API 网关调用;ing
- 服务与服务之间可以通过服务注册中心、消息队列、远程调用等方式互相调用。
可以将分布式调用总结为两部分,第一部分是感知对方,包括负载均衡、API 网关、服务注册与发现、消息队列;第二部分是信息传递,包括 RPC、RMI、NIO 通信。
常见的分布式调用方式包括:
- 负载均衡:如 Nginx、F5,确保请求均匀分配到不同的服务实例。
- API 网关:如Spring Cloud Gateway,用于统一管理和路由 API 请求。
- 服务注册与发现:如 Eureka、Consul,动态管理服务实例。
- 远程调用:采用 RPC、RMI、消息队列等方式,实现跨服务通信。
3. 分布式协同
多个分布式服务在处理同一业务时,需要协调工作,避免数据不一致和资源竞争。解决方案包括:
- 分布式锁:如 Redis 锁、ZooKeeper 实现的互斥锁,确保临界资源的独占性。
- 分布式事务:包括 2PC(两阶段提交)、TCC(Try-Confirm-Cancel)等事务控制机制。
- 分布式选举:如 Bully 算法、Raft 算法,实现主从数据库切换等场景的选主机制。
4. 分布式计算
在大数据和高计算需求场景下,分布式计算提供了高效的处理能力。主要计算模式包括:
- MapReduce:适用于批量静态数据计算,常见框架有 Hadoop。
- Stream 计算:适用于实时数据流计算,常见工具有 Apache Storm、Flink。
5. 分布式存储
分布式存储涉及数据的持久化与管理,需要考虑存储均衡、故障恢复和扩展性。主要技术方案包括:
- 分布式数据库:MySQL 分库分表、主从复制等。
- 分布式缓存:如 Redis Cluster,实现缓存分片,提高访问性能。
- 分布式文件存储:如 HDFS、Ceph,适用于大规模数据存储。
6. 分布式资源管理与调度
操作系统的进程调度和分布式系统的资源调度在处理并发计算任务时,都是为了解决有限的资源(如 CPU、内存、存储等)如何合理分配给多个任务的问题。
-
操作系统的进程调度:在单核 CPU 的情况下,操作系统通过调度算法(如时间片轮转)在多个进程之间快速切换,使得它们看起来几乎是同时执行的。进程调度属于微观调度,它关注的是如何在有限的 CPU 时间片内高效管理和调度进程。
-
多核 CPU 和并发处理:随着技术发展,单核 CPU 的瓶颈被突破,进入了多核 CPU 的时代。多核 CPU 通过在不同的核心上并行执行任务来提高性能,操作系统的调度算法需要适应这种硬件的变化,合理分配任务到不同的核心上。
-
分布式系统的资源调度:为了进一步扩展计算能力,分布式系统通过水平扩展,将资源分配到多个服务器和网络节点上。这些节点拥有独立的 CPU、内存、硬盘等资源,任务需要跨多个节点进行调度和协调。分布式系统调度更加复杂,需要考虑节点之间的通信、负载均衡、容错性等因素。
综上,操作系统和分布式系统的调度虽然在不同层次和范围上进行,但核心目标一致:如何在有限的资源下,最有效地处理并发计算任务,提高系统整体性能。
资源管理和调度决定了系统的计算效率。常见调度架构包括:
- 中心化调度:由单个调度中心统一管理资源。
- 两级调度:资源管理层与任务调度层分离,提高调度灵活性。
- 共享状态调度:如 Kubernetes 共享任务状态,实现高效调度。
7. 高性能与可用性优化
提升分布式系统性能的关键在于缓存和高可用策略。
- 缓存优化:使用 HTTP 缓存、CDN、分布式缓存等方式加快数据访问。
- 可用性策略:采用限流(Rate Limiting)、熔断(Circuit Breaker)、降级(Fallback)等方式,提高系统稳定性。
8. 指标与监控
判断一个架构是好是坏时,有两个参考标准,即性能指标和可用性指标,分布式架构也是如此。性能指标又分为吞吐量、响应时间和完成时间。由于系统的分布性,服务会分布到不同的服务器和网络节点,因此监控程序需要在不同的服务器和网络节点上对服务进行监控。
监控系统确保分布式架构的稳定运行,主要包括:
- 性能指标:如吞吐量、响应时间、错误率、系统负载。
- 监控系统:Zabbix、Prometheus、ELK(Elasticsearch + Logstash + Kibana),用于收集和分析系统状态。