当前位置: 首页 > 科技观察

干货:如何系统学习分布式系统?

时间:2023-03-17 19:27:40 科技观察

在学习分布式系统之前,我们首先要解决的问题是:分布式系统解决什么问题?分布式系统解决什么问题?首先是单机性能瓶颈带来的成本问题。由于摩尔定律的失效,廉价PC的性能瓶颈无法继续突破。小型机和大型机可以提高单机性能,但成本太高,一般企业难以容忍;二是用户和数据的爆炸式增长带来的成本问题。互联网时代,用户数量呈爆炸式增长,用户产生的数据量也呈爆炸式增长。但是,单个用户或单个数据的成本价值实际上低于软件时代的价值(比如银行用户),因此必须找到更经济的解决方案;三是业务高可用的需求。对于互联网产品,要求提供7*24小时的服务,不能容忍停止服务等故障,提供高可用服务的唯一途径就是增加冗余。这样一来,即使是单机系统可以支持的服务,也会因为可用性要求高而变成分布式系统。基于以上三个原因可以看出,在互联网时代,单机系统无法解决成本和高可用的问题,但这两个问题对于几乎所有的公司来说都是非常关键的。因此,从单机系统到分布式系统是一个不可回避的技术趋势。分布式系统如何解决这个问题?那么,分布式系统如何解决单机系统面临的成本和高可用问题呢?其实思路很简单,就是将一些廉价的PC通过网络连接起来共同完成工作,在系统中提供冗余来解决高可用的问题。分布式系统引入了哪些新问题?我们来看一下分布式系统的定义:分布式系统是由一组计算机节点组成的系统,这些计算机节点通过网络进行通信,协调它们的工作来完成一个共同的任务。在定义中我们可以看到分布式系统通过多个工作节点解决了单机系统面临的成本和可用性问题,但是引入了分布式系统内部工作节点的协调问题。我们常说,掌握一门知识需要了解其前因后果。对于分布式系统来说,原因是“分布式系统解决什么问题”,结果是“它如何协调内部工作节点”,所以我们要解决第二个问题:分布式系统如何协调内部工作节点节点?分布式计算引入了哪些新问题?让我们从一个简单的情况开始。对于分布式计算(无状态)的情况,系统内部协调需要做哪些工作:1.如何找到服务?在分布式系统中,会有不同的服务(角色)。服务A如何找到服务B是一个需要解决的问题。总的来说,服务注册和发现机制是一个比较普遍的想法,所以可以了解一下服务注册和发现机制的实现原理,可以考虑一下服务注册,看看选择做AP是不是更合理或CP系统(严格按照CAP理论,我们目前使用的大部分系统都很难满足C或A,所以这里只是通常意义上的AP或CP);2.如何找到实例?找到服务后,当前请求应该选择发送到服务的哪个实例?一般来说,如果同一个服务的实例是完全对等的(无状态的),那么按照负载均衡策略来处理就可以了(轮询、权重、哈希、一致性等各种策略的适用场景散列、公平等));如果同一个服务的实例不是点对点的(有状态的),那么首先需要通过路由服务(元数据服务等)判断当前请求访问的数据在哪个实例上,然后访问它。3、如何避免雪崩?系统雪崩是由于导致不断扩展的规则的正反馈序列而导致的故障失败。雪崩通常是由整个系统的一小部分故障引起的,从而导致系统的其他部分也发生故障。例如,如果系统中某个服务的一个实例发生故障,负载均衡器会移除该实例并导致其他实例的负载增加,最终导致该服务的所有实例像多米诺骨牌一样一个接一个地发生故障。整体避免雪崩的策略比较简单,只要有两个思路,一是快速失效和降级机制(熔断、降级、限流等),可以通过快速降低系统负载来避免雪崩;另一种是弹性扩容机制,通过快速提升系统的服务能力,避免雪崩。根据场景的不同,可以做出不同的选择,或者两种策略都可以使用。一般来说,快速失败会导致一些请求失败。如果分布式系统要求高一致性,快速故障会导致系统数据不一致。弹性扩展会是一个更好的选择,但是弹性扩展的实现成本和响应时间比失败快要大得多。4、如何监控告警?对于分布式系统,如果我们不能清楚地了解内部状态,那么就没有办法充分保证高可用性。因此,对于分布式系统的监控(如接口延迟、可用性等),必须完善分布式跟踪Trace、模拟故障的混沌工程,以及相关的告警机制;分布式存储引入了哪些新问题?接下来我们看看分布式存储(stateful)的内部协调是如何完成的。同时,上面介绍的分布式计算的协调方法也适用于分布式存储,不再赘述:1.分布式系统理论和权衡ACID、BASE和CAP理论,了解这三个主题,推荐这篇文章及文末相关参考资料:英文版:https://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed/中文版:https://www.infoq.cn/article/cap-twelve-years-later-how-the-rules-have-changed/2。如何做数据分片?单台机器的存储能力不可能存储所有的数据,因此需要解决如何将数据按照一定的规则存储在不同的机器上。目前使用最多的方案有:Hash、ConsistentHash和RangeBased分片策略。您可以了解它们的优缺点和各自的应用场景;3、如何做数据复制?为满足系统的高可用性要求,需要对数据进行冗余处理。目前的方案主要有:中心化方案(主从复制、Raft、Paxos等一致性协议)和去中心化方案(Quorum、VectorClock)了解它们的优缺点和各自的应用场景,以及向系统外部展示的数据一致性级别(线性一致性、顺序一致性、最终一致性等);4、如何做分布式事务?对于分布式系统来说,要实现事务,首先需要具备对并发事务进行排序的能力,以便在事务发生冲突时,确认哪个事务提交成功,哪个事务提交失败。对于单机系统来说,这根本不是问题。只需在序列号中添加时间戳即可实现。但是对于分布式系统来说,系统中机器的时间无法完全同步,单个机器的序号没有全局意义。按照上面的方式,是行不通的。但是,整个系统可以选择一台机器以单机模式产生交易ID。同城多中心、近距离异地多中心都没有问题。但是,如果要做全球分布式系统,那么每笔交易都必须去一个节点获取交易ID的成本太高了(比如中国杭州到美国东部的RTT是200+ms),谷歌的Spanner解决了这个问题,通过GPS和原子钟实现TrueTimeAPI,实现全球分布式数据库。有了事务ID,通过2PC或3PC协议实现分布式事务的原子性。其他部分与单机事务区别不大,不再赘述。进阶学习阶段到了这里,对分布式系统上下文有了基本的概念。接下来,我将进入详细的学习阶段。这也是一个非常幸运的阶段。对分布式系统的理解是否深入,细节的深度是一个很重要的评价指标,毕竟细节决定成败。在这里可以从两个方面进行系统的学习:1.从实践出发,研究常用分布式系统的设计,如HDFS或GFS(分布式文件系统)、Kafka和Pulsar(分布式消息队列)、RedisCluster和Codis(分布式缓存))、MySQL的分库分表(传统关系型数据库的分布式方案)、MongoDB的ReplicaSet和Sharing机制集和去中心化的Cassandra(NoSQL数据库)、中心化的TiDB和去中心化的CockroachDB(NewSQL),以及一些微服务框架,ETC。;2.从理论出发,研究分布式相关论文,这里有一本《DesigningData-IntensiveApplications》(中文版:Data-intensiveapplicationsSystemdesign),先通读全书,再阅读涉及的相关参考资料在更有趣的章节中。总结本文从分布式系统解决的问题开始,然后讨论它是如何解决问题的,最后讨论它引入了哪些新问题,并讨论了这些新问题的解决方案。这是分布式系统上下文的常识。掌握了这些知识脉络之后,就可以从实践和理论的角度对分布式系统进行详细的研究。