背景介绍
随着科技的发展、互联网的普及和数据规模的不断增长,传统的集中式系统往往难以满足这些需求,尤其是在性能、可靠性、灵活性等方面更是捉襟见肘,因此分布式系统设计思想应运而生。分布式系统设计思想的出发点在于应对大规模数据和高并发的挑战,满足用户对高性能、可靠性和可扩展性的需求。其重要意义是能够帮助工程师设计和构建能够应对上述挑战的系统。今天,我们来看下工程实践中用到了哪些分布式系统的设计思想。
设计思想
-
可伸缩性(Scalability): 分布式系统应具备良好的可伸缩性,即能够在面对不断增长的负载时,通过增加硬件资源和节点数量,保持性能的稳定和可接受的响应时间。可伸缩性的设计可以通过水平扩展(增加更多的机器)和垂直扩展(增加机器的资源)实现。
-
容错性(Fault Tolerance): 分布式系统应对单个组件出现故障或异常情况具备容错能力,即能够自动检测、隔离和恢复从而保证系统的正常运行。
-
一致性(Consistency): 分布式系统涉及到多个节点和副本的数据存储和操作,数据一致性是一个重要的设计目标。一致性指的是在任何时刻,不同节点和副本之间的数据是一致的。
-
可靠性(Reliability): 可靠性指的是分布式系统能够在长时间运行过程中,不断提供正确的结果。为了实现可靠性,分布式系统应该具备容错性和恢复性,并且能够对错误进行检测和修复以确保系统的连续性。
-
可扩展性(Extensibility): 分布式系统应该具备良好的可扩展性,即能够方便地添加新的功能模块或扩展现有的功能。
-
安全性(Security): 分布式系统应该具备安全性,保障数据在传输和存储过程中的机密性、完整性和可靠性。
业务挑战
由于篇章有限,我们从上述的分布式系统设计思想挑选几个典型问题展开讨论,例如一致性、容错性、可拓展性问题。
- 一致性 - 由于系统的复杂性和网络的不稳定性,可能会导致请求重复或者请求丢失,从而导致数据的不一致。
- 容错性 - 无论是消息中间件还是数据库中间件,我们始终无法保障服务100%可用,如何设计面向中间件的容错方案是工程事件中首先要解决的问题。
- 可伸缩性 - 随着计算元数据的增长,普通的水平扩容已经无法性能的要求,而垂直扩容的成本有很高。这也是工程实践中的主要挑战之一。
工程实践
就上述三个典型问题,我们解决工程实践看下如何解决。
- 一致性
- 问题-请求失败或者重复
- 方案- 基于幂等+重试+告警方案
在分布式系统中,由于网络延迟、部分失败和重试机制等因素,可能出现系统无法保证请求的可靠性,导致请求被重复发送或处理。此时,幂等性能够保证在请求被重复处理时,系统的状态和结果保持一致,不会产生重复的业务逻辑执行或数据修改。
工程实际中,我们发现使用唯一标识符UUID的可靠性、可维护性是最佳的。而且可以以通用组件的形式提供给整个部门使用。通过注册业务接口,恢复组件(见下节内容)以及告警平台的集成,可以很好的处理因为网络问题导致的失败问题。对于整个系统提供了相对平衡的一致性保障。
- 容错性
- 问题 - 中间件不可用
- 方案 - 基于本地文件的数据恢复方案
容错性的设计思想是比较通用的,即借助冗余备份、故障检测和自动恢复机制来实现。在实际的工程实践中,我们 无法避免网络分区问题,因此在设计容错方案时首先要排除依赖网络的方案。从可靠性和通用性来说,基于本地文本的方案是最佳选择。设计方案如下:
核心的设计思路是对于依赖中间件的幂等方法,通过注解@FileRecovery配置,使用AOP拦截入参和返回结果。如果返回异常与注解配置匹配,则采集该方法和入参,发送给恢复组件的任务队列。任务队列负责将该业务恢复数据写到对应的文件路径。调度器根据Zookeeper的配置,开始轮询指定文件路径下的文件,并通过反射机制重新执行方法。如果超过容忍策略,则上报告警信息。
- 可伸缩性
- 问题 - 元数据增长
- 方案- 基于数据分片的分布式计算元数据方案
计算元数据随着业务的发展,也是逐步增加的。在初期,我们可以通过水平拓展的方式轻松的应对。但是当数据从512M增长到1G,再到10G时,单实例的性能瓶颈越发明显,这个时候我们可以选择垂直扩容。但是数据仍旧持续增大,垂直扩容的成本越来越高。为了避免后续的窘境和成本增加,我们选择了以数据分片为基础的分布式元数据计算方案。整体设计如下:
核心的设计思想就是数据分片。数据分片技术的应用,一是解决了元数据集持续增长,二是通过多副本提高了并发度。既能解决性能问题,也可以通过水平拓展,实现集群弹性扩缩容。是一个典型的分布式系统应用场景。
思考总结
由于现代应用和服务的复杂性和规模日益增长,分布式系统设计思想成为了解决这些挑战的关键。它提供了一种可靠、高效和可扩展的架构来构建和部署分布式系统,从而满足用户的需求并提供流畅和可靠的体验。 因此,在复杂的业务需求中如何灵活运用这些宝贵的技术显得尤为重要。 技术,以服务业务为主,只有产生了实际的业务价值,才是有效的技术,才是有价值的技术。 我们虽然一直在探索技术的发展,紧跟紧跟再紧跟,其实,回过头来,发现技术对于业务多数时候是过剩的。 为什么? 因为很多技术在实际的业务场景中无用武之地。 或者是因为技术成本,又或者因为没有发现技术的价值。 技术以业务为本。