Why 分布式
传统的电信、银行业,当业务量大了之后,普通服务器 CPU/IO / 网络到了 100%,请求太慢怎么办?最直接的做法,升级硬件,反正也不缺钱,IBM 小型机,大型机,采购了堆硬件。但是互联网不能这么干,互联网没有那么财大气粗,还有很多初创,能不能赚钱还不知道。所以就有了软件方面的解决方案:分布式系统,简单说,就是一台服务器不行,我用两台、10 台、100 台… 这就要软件系统需要支持。
那么软件设计者就需要考虑了,那么多台机器,我如何让他们协同工作
- 需要一个调度中心(或注册中心);
用 zookeeper 作为注册中心 - 肯定涉及到机器间通信,那么需要一个高效的 RPC 框架
用 dubbo(可用当当的 dubbox) - 一个请求过来了,如何分发,需要一个请求分发系统(负载均衡)
nginx/HA,前者更轻量,后者负载均衡算法更丰富 - 然后还要考虑每个角色都不能成为性能瓶颈;
- 还有要能方便的进行横向扩展,还有考虑单节点故障。
- 提高并发量肯定不低,那么有了上面的还是不够的,还需要考虑 cache、mq、job、db 等方面的问题。
- cache,现在第三方缓存也比较成熟,redis/memcache 等;
- mq,rabbitmq,kafka 等等也不错;
- job,现在第三方任务框架有 elasticjob 和 tbschedule,或者你用 quartz 也支持分布式环境下的任务,不过 quartz 就没有运维工具了。
- DB,数据库最好在项目前期就考虑好业务拆分,系统拆分后 DB 对应的垂直拆分,后期可做读写分离,一主多从,甚至多主多从,业界也有了相应的解决方案。
分类
- 负载均衡
- 分布式缓存
- 分布式文件系统 / CDN
- 分布式 RPC
- 分布式数据库 / Nosql
- 分布式消息中间件
- 分布式 session 问题
理论基础
- 离散数学
- 拓扑学
- 图论
知识图谱
实践基础
- 网络编程《unix 网络编程 卷一》
- 为啥开发分布式系统,不就是传统系统不能满足性能的要求吗?那么并发、进程、线程技术以及 ipc 和同步互斥技术怎么能不学习。《Concurrent Programming in Java: Design Principles and Patterns》(针对有一定多线程编程基础的人)
- 分布式系统,我认为最最不好实现的,也是最最关键的,那就是一致性的事务管理,通常都是松散的一致性。这里涉及到事务、一致性算法等内容
综述(Ok)
- Distributed systems for fun and profit Chapter 1
- Fallacies of Distributed Computing
Explained - A Note Distributed System
负载均衡
https://segmentfault.com/a/1190000004492447
一致性哈希
一致性
- 一致性、2PC 和 3PC
- 选举、多数派和租约
- 时间、时钟和事件顺序
- CAP
- Paxos
- 分布式基础通信协议: paxos,totem 和 gossip
- Raft、Zab
- Paxos 变种和优化
- 《PAXOS 到 ZOOKEEPER 分布式一致性原理与实践》
ZOOKEEPER
实践
搭建 memcached 集群
教材
- Distributed systems for fun and profit
- 大型网站技术架构 核心原理与案例分析
- 分布式系统概念与设计
- Distributed systems theory for the distributed systems engineer
课程
论文
谷歌三宝
- The Google File System: 这是分布式文件系统领域划时代意义的论文,文中的多副本机制、控制流与数据流隔离和追加写模式等概念几乎成为了分布式文件系统领域的标准,其影响之深远通过其 5000 + 的引用就可见一斑了,Apache Hadoop 鼎鼎大名的 HDFS 就是 GFS 的模仿之作;
- MapReduce: Simplified Data Processing on Large Clusters:这篇也是 Google 的大作,通过 Map 和 Reduce 两个操作,大大简化了分布式计算的复杂度,使得任何需要的程序员都可以编写分布式计算程序,Hadoop 也根据这篇论文做了一个开源的 MapReduce;
- Bigtable: A Distributed Storage System for Structured Data:Google 在 NoSQL 领域的分布式表格系统,LSM 树的最好使用范例,广泛使用到了网页索引存储、YouTube 数据管理等业务,Hadoop 对应的开源系统叫 HBase(存在一个相应的系统叫 BladeCube,性能较 HBase 有数倍提升);
The Chubby lock service for loosely-coupled distributed systems
Google 的分布式锁服务,基于 Paxos 协议,其对应的开源系统 zookeeper。Finding a Needle in Haystack: Facebook’s Photo Storage
facebook 的在线图片存储系统,目前来看是对小文件存储的最好解决方案之一,facebook 目前通过该系统存储了超过 300PB 的数据(过一个类似的系统 pallas,不仅支持副本,还支持 Reed Solomon-LRC,性能也有较多优化);Windows Azure Storage: a highly available cloud storage service with strong consistency
windows azure 的总体介绍文章,是一篇很好的描述云存储架构的论文,其中通过分层来同时保证可用性和一致性的思路在现实工作中也给了我很多启发;GraphLab: A New Framework for Parallel Machine Learning
CMU 基于图计算的分布式机器学习框架,目前已经成立了专门的商业公司,在分布式机器学习上很有两把刷子,其单机版的 GraphChi 在百万维度的矩阵分解都只需要 2~3 分钟;Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
其实就是 Spark,目前这两年最流行的内存计算模式,通过 RDD 和 lineage 大大简化了分布式计算框架,通常几行 scala 代码就可以搞定原来上千行 MapReduce 代码才能搞定的问题,大有取代 MapReduce 的趋势;Scaling Distributed Machine Learning with the Parameter Server
百度少帅李沐大作,目前大规模分布式学习各家公司主要都是使用 ps,ps 具备良好的可扩展性,使得大数据时代的大规模分布式学习成为可能,包括 Google 的深度学习模型也是通过 ps 训练实现,是目前最流行的分布式学习框架,豆瓣的开源系统 paracell 也是 ps 的一个实现;Dremel: Interactive Analysis of Web-Scale Datasets
Google 的大规模(近)实时数据分析系统,号称可以在 3 秒相应 1PB 数据的分析请求,内部使用到了查询树来优化分析速度,其开源实现为 Drill,在工业界对实时数据分析也是比价有影响力;Pregel: a system for large-scale graph processing
Google 的大规模图计算系统,相当长一段时间是 Google PageRank 的主要计算系统,对开源的影响也很大(包括 GraphLab 和 GraphChi);Spanner: Google’s Globally-Distributed Databas
这是第一个全球意义上的分布式数据库,Google 的出品。其中介绍了很多一致性方面的设计考虑,简单起见,还采用了 GPS 和原子钟确保时间最大误差在 20ns 以内,保证了事务的时间序,同样在分布式系统方面具有很强的借鉴意义;Dynamo: Amazon’s Highly Available Key-value Store
Amazon 的分布式 NoSQL 数据库,意义相当于 BigTable 对于 Google,于 BigTable 不同的是,Dynamo 保证 CAP 中的 AP,C 通过 vector clock 做弱保证,对应的开源系统为 Cassandra;S4: Distributed Stream Computing Platform
Yahoo 出品的流式计算系统,目前最流行的两大流式计算系统之一(另一个是 storm),Yahoo 的主要广告计算平台;Storm @Twitter
开启了流式计算的新纪元,几乎是所有公司流式计算的首选,绝对值得关注;Large-scale cluster management at Google with Borg
F1 - The Fault-Tolerant Distributed RDBMS Supporting Google’s Ad Business;
Distributed systems theory for the distributed systems engineer
实践
Model Checker 的核心就是让系统按照你形式化的描述来测试你指定的系统。
https://blog.csdn.net/jason_cuijiahui/article/details/77621121