Step0
Why分布式
传统的电信、银行业,当业务量大了之后,普通服务器CPU/IO/网络到了100%,请求太慢怎么办?最直接的做法,升级硬件,反正也不缺钱,IBM小型机,大型机,采购了堆硬件。但是互联网不能这么干,互联网没有那么财大气粗,还有很多初创,能不能赚钱还不知道。所以就有了软件方面的解决方案:分布式系统,简单说,就是一台服务器不行,我用两台、10台、100台…这就要软件系统需要支持。
那么软件设计者就需要考虑了,那么多台机器,我如何让他们协同工作
1. 需要一个调度中心(或注册中心);
用zookeeper作为注册中心
2. 肯定涉及到机器间通信,那么需要一个高效的RPC框架
用dubbo(可用当当的dubbox)
3. 一个请求过来了,如何分发,需要一个请求分发系统(负载均衡)
nginx/HA,前者更轻量,后者负载均衡算法更丰富
3. 然后还要考虑每个角色都不能成为性能瓶颈;
4. 还有要能方便的进行横向扩展,还有考虑单节点故障。
5. 提高并发量肯定不低,那么有了上面的还是不够的,还需要考虑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》(针对有一定多线程编程基础的人)
- 分布式系统,我认为最最不好实现的,也是最最关键的,那就是一致性的事务管理,通常都是松散的一致性。这里涉及到事务、一致性算法等内容
Step1
综述(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集群
Step2
教材
- 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
Model Checker的核心就是让系统按照你形式化的描述来测试你指定的系统。