来源:https://juejin.im/post/6875134797228802056

作者:伴鱼技术团队

本文的缘起是回答知乎圆桌会议「分布式系统之美」的问题「如何系统性地学习分布式系统?」,后面稍微整理了一下,形成了这一篇文章(知乎 ID:kylin)。

前言

学习一个知识之前,我觉得比较好的方式是先理解它的来龙去脉:即这个知识产生的过程,它解决了什么问题,它是怎么样解决的,还有它引入了哪些新的问题(没有银弹),这样我们才能比较好的抓到它的脉络和关键点,不会一开始就迷失在细节中。

所以,在学习分布式系统之前,我们需要解决的第一个问题是:分布式系统解决了什么问题?

分布式系统解决了什么问题?

第一个是单机性能瓶颈导致的成本问题,由于摩尔定律失效,廉价 PC机性能的瓶颈无法继续突破,小型机和大型机能提高更高的单机性能,但是成本太大高,一般的公司很难承受;

第二个是用户量和数据量爆炸性的增大导致的成本问题,进入互联网时代,用户量爆炸性的增大,用户产生的数据量也在爆炸性的增大,但是单个用户或者单条数据的价值其实比软件时代(比如银行用户)的价值是只低不高,所以必须寻找更经济的方案;

第三个是业务高可用的要求,对于互联网的产品来说,都要求 7 * 24小时提供服务,无法容忍停止服务等故障,而要提供高可用的服务,唯一的方式就是增加冗余来完成,这样就算单机系统可以支撑的服务,因为高可用的要求,也会变成一个分布式系统。

基于上面的三个原因可以看出,在互联网时代,单机系统是无法解决成本和高可用问题的,但是这两个问题对几乎对所有的公司来说都是非常关键的问题,所以,从单机系统到分布式系统是无法避免的技术大潮流。

分布式系统是怎么来解决问题的?

那么,分布式系统是怎么来解决单机系统面临的成本和高可用问题呢?

其实思路很简单,就是将一些廉价的 PC 机通过网络连接起来,共同完成工作,并且在系统中提供冗余来解决高可用的问题。

分布式系统引入了哪些新的问题?

我们来看分布式系统的定义:分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。在定义中,我们可用看出,分布式系统它通过多工作节点来解决单机系统面临的成本和可用性问题,但是它引入了对分布式系统内部工作节点的协调问题。

我们经常说掌握一个知识需要理解它的前因后果,对于分布式系统来说,前因是「分布式系统解决了什么问题」,后果是「它是怎么做内部工作节点的协调」,所以我们要解决的第二个问题是:分布式系统是怎么做内部工作节点协调的?

分布式计算引入了哪些新的问题?

先从简单的情况入手,对于分布式计算(无状态)的情况,系统内部的协调需要做哪些工作:

1、怎么样找到服务?

在分布式系统内部,会有不同的服务(角色),服务 A 怎么找到服务 B 是需要解决的问题,一般来说服务注册与发现机制是常用的思路,所以可以了解一下服务注册发现机制实现原理,并且可以思考服务注册发现是选择做成 AP 还是 CP
系统更合理(严格按 CAP 理论说,我们目前使用的大部分系统很难满足 C 或者 A 的,所以这里只是通常意义上的 AP 或者 CP);

2、怎么样找到实例?

找到服务后,当前的请求应该选择发往服务的哪一个实例呢?一般来说,如果同一个服务的实例都是完全对等的(无状态),那么按负载均衡策略来处理就足够(轮询、权重、hash、一致性hash,fair等各种策略的适用场景);如果同一个服务的实例不是对等的(有状态),那么需要通过路由服务(元数据服务等)先确定当前要访问的请求数据做哪一个实例上,然后再进行访问。

3、怎么样避免雪崩?

系统雪崩是指故障的由于正反馈循序导致不断扩大规则的故障。一次雪崩通常是由于整个系统中一个很小的部分出现故障于引发,进而导致系统其它部分也出现故障。比如系统中某一个服务的一个实例出现故障,导致负载均衡将该实例摘除而引起其它实例负载升高,最终导致该服务的所有实例像多米诺骨牌一样一个一个全部出现故障。

避免雪崩总体的策略比较简单,只要是两个思路,一个是快速失败和降级机制(熔断、降级、限流等),通过快速减少系统负载来避免雪崩的发生;另一个为弹性扩容机制,通过快速增加系统的服务能力来避免雪崩的发生。这个根据不同的场景可以做不同的选择,或者两个策略都使用。

一般来说,快速失败会导致部分的请求失败,如果分布式系统内部对一致性要求很高的话,快速失败会带来系统数据不一致的问题,弹性扩容会是一个比较好的选择,但是弹性扩容的实现成本和响应时间比快速失败要大得多。

4、怎么样监控告警?

对于一个分布式系统,如果我们不能很清楚地了解内部的状态,那么高可用是没有办法完全保障的,所以对分布式系统的监控(比如接口的时延和可用性等信息),分布式追踪 Trace,模拟故障的混沌工程,以及相关的告警等机制是一定要完善的;

分布式存储引入了哪些新的问题?

接下来我们再来看分布式存储(有状态)的内部的协调是怎么做的,同时,前面介绍的分布式计算的协调方式在分布式存储中同样适用,就不再重复了:

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、Consistent
Hash 和 Range Based 分片策略,可以了解一下它们的优缺点和各自的应用场景;

3、怎么样做数据复制?

为什么满足系统的高可用要求,需要对数据做冗余处理,目前的方案主要为:中心化方案(主从复制、一致性协议比如 Raft 和 Paxos 等)和
去中心化的方案(Quorum 和 Vector
Clock)了解一下它们的优缺点和各自的应用场景,以及对系统外部表现出来的数据一致性级别(线性一致性、顺序一致性、最终一致性等);

4、怎么样做分布式事务?

对于分布式系统来说,要实现事务,首先需要有对并发事务进行排序的能力,这样在事务冲突的时候,确认哪个事务提供成功,哪个事务提交失败。对于单机系统来说这个完全不是问题,简单通过时间戳加序号的方式就可以实现,但是对于分布式系统来说,系统中机器的时间不能完全同步,并且单台机器序号也没用全局意义,按上面的方式说行不通的。不过整个系统选一台机器按单机的模式生产事务
ID 是可以的,同城多中心和短距离的异地多中心都没有问题,不过想做成全球分布式系统的话,那么每一次事务都要去一个节点去获取事务 ID
的成本太高(比如中国杭州到美国东部的 RTT 为 200 + ms ),Google 的 Spanner 是通过 GPS 和原子钟实现 TrueTime
API 来解决这个问题从而实现全球分布式数据库的。

有了事务 ID 后,通过 2PC 或者 3PC 协议来实现分布式事务的原子性,其他部分和单机事务差别不大,就不再细说来。

进阶学习阶段

到这里,对分布式系统脉络上有了基本的概念,接下来开始进入细节学习阶段,这也是非常幸苦的阶段,对于分布式系统的理解深入与否,对细节的深入度是很重要的评价指标,毕竟魔鬼在细节。这里可以往两个方面进行系统的学习:

1、从实践出发

研究目前比较常用的分布式系统的设计,HDFS 或者 GFS(分布式文件系统)、Kafka 和 Pulsar(分布式消息队列),Redis Cluster 和
Codis(分布式缓存),MySQL 的分库分表(传统关系型数据库的分布式方案),MongoDB 的 Replica Set 和
Sharing机制集以及去中心化的 Cassandra(NoSQL数据库),中心化的 TiDB 和去中心化的
CockroachDB(NewSQL),以及一些微服务框架等;

2、从理论出发

从理论出发,研究分布式相关的论文,这里推荐一本书「Designing Data-Intensive
Applications」(中文版本:数据密集型应用系统设计),先整体看书,对比较感兴趣的章节,再读一读该章节中涉及到的相关参考文献。

总结

本文从分布式系统解决的问题开始,再讨论它是怎么样来解决问题的,最后讨论了它引入了哪些新的问题,并且讨论这些新问题的解决办法,这个就是分布式系统大概的知识脉络。掌握这个知识脉络后,那么就可以从实践和理论两个角度结合起来深入细节研究分布式系统了。

参考

  • 知乎 | 如何系统性的学习分布式系统

  • Martin Kleppmann.Designing Data-Intensive Applications

  • CAP Twelve Years Later: How the "Rules" Have Changed

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

这样系统的学习分布式,他日必成大器!相关推荐

  1. 北大青鸟广州天河:班主任寄语:上善若水 慢而不争 必成大器

    北大青鸟广州天河:班主任寄语:上善若水 慢而不争 必成大器 [url]http://www.accp-teem.com.cn/ArticleView/2007-8-8/Article_View_123 ...

  2. 懂此言,日后必成大器

    1.一杯清水因滴入一滴污水而变污浊,一杯污水却不会因一滴清水的存在而变清澈. 2.这世上有三样东西是别人抢不走的:一是吃进胃里的食物,二是藏在心中的梦想,三是读进大脑的书. 3.马在松软的土地上易失蹄 ...

  3. 学习分布式不得不会的ACP理论

    转载自   学习分布式不得不会的ACP理论 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想.2年后,麻省理工学院的Seth Gilbert和Nan ...

  4. 学习分布式技术,技术人看这里

    随着微服务.云化架构的兴起,分布式技术开始在越来越多的场景得到应用,从外围系统到中台业务,再到核心交易业务,分布式技术成为企业基础架构转型的重中之重. CSDN学院联合巨杉大学共同推出公开免费在线认证 ...

  5. 深度学习分布式策略优化、显存优化、通信优化、编译优化综述

    综述 因为我个人最近在从事可能是AI领域对性能挑战最大的方向,自动驾驶领域,所以对整个深度学习训练的优化尤为关注,最近一直在学习相关内容,谨以此篇文章做一个总结. 我一直很看好深度学习训练优化这个方向 ...

  6. 睡前必读 | 如何系统性地学习分布式系统?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 导语:本文的缘起是回答知乎圆桌会议「分布式系统之美」的问题「如何系统性地学 ...

  7. [深度学习] 分布式Tensorflow 2.0 介绍(二)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow 2.0介绍(二) [深度学习] 分布式Pytorch 1.0介绍(三) [深度学习] 分布式Horovod介绍(四) 一 ...

  8. [深度学习] 分布式Pytorch介绍(三)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow介绍(二) [深度学习] 分布式Pytorch介绍(三) [深度学习] 分布式Horovod介绍(四)  一  Pytorc ...

  9. [深度学习] 分布式模式介绍(一)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow介绍(二) [深度学习] 分布式Pytorch 1.0介绍(三) [深度学习] 分布式Horovod介绍(四) 一  分布式 ...

最新文章

  1. java获取pdf文件的总页数
  2. spark on yarn提交后vcore数不对
  3. 【三分+枚举】LNOI2017 d1t1 期末考试
  4. mysql无效的时间默认值_mysql – ‘timestamp’的默认值无效
  5. LeetCode 483. 最小好进制(二分查找)
  6. pcb布线拐角处打地孔_PCB线路板布线的10个重要规则——公众号【深圳LED网】
  7. .NET WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)...
  8. jni.h头文件详解一
  9. 腾讯地图api_为你的小程序插上地图的“翅膀”,腾讯位置服务亮相阿拉丁大会...
  10. Themal稳态热仿真介绍
  11. 【解决方案】数字孪生智慧光伏电站三维可视化系统
  12. 数据标准化/归一化normalization
  13. 坚果pro2官方rom_坚果pro2线刷包_坚果pro2刷机包_坚果pro2固件包_坚果pro2救砖包 - 线刷宝ROM中心...
  14. win32编程 C++ 九格拼图游戏
  15. mybatis plus 出现 Invalid bound statement (not found)
  16. efm32芯片电压_【经验】基于EFM32G232芯片 ADC采样毛刺问题分析以及解决方案
  17. MTK获取iso的几种方式
  18. 朴素贝叶斯-后验概率最大化
  19. ssh访问控制,封杀ip,防止暴力破解
  20. PADS 原理图/PCB常见错误及DRC报告网络问题

热门文章

  1. html建立复选框,创建一个像html复选框一样的div
  2. 关于学习Python的一点学习总结(9->字典创建及相关操作)
  3. 学习python一开始枯燥_编程零基础应当怎样开始学python?他说,看这三个经典方法...
  4. 【学习笔记】树上启发式合并
  5. 灵异事件 !同一个代码在code::blocks和Dev上面运行结果不一样!(一番分析后找到原因!)
  6. iis 无法连接mysql_远程无法连接SQL2000及MySQL的原因和解决办法
  7. 贵州大学明德学院计算机有多少班级,2014年贵州大学明德学院算机科学及信息系电子信息工程专业介绍...
  8. 数据库基础笔记(MySQL)4 —— 基础约束
  9. python bs4 find_all_BeautifulSoup中的find,find_all
  10. oracle解析xml字符串命名空间,XML命名空间