微服务或面向服务的体系结构不是分布式系统
例如,以下基于服务的体系结构的简化设计具有水平可伸缩性:
关于这个系统没有太多“分布式”。有多个主机和网络互连,但它们是紧密耦合的,它们的网络交互是可靠的,具有低延迟,并且是可预测的。在我们看来,真正分布的是指节点全局分布的系统; 网络交互是不可预测的,可以创建分区; 但是,这些节点一起工作以创建可预测的结果。分布式系统大规模地涉及在整个系统中分布和重新平衡状态,在添加和删除节点时作出反应,并且尽管全局系统中存在固有的不可预测性,它们仍然这样做。
对哈希环的理解是先决条件
如果您认为哈希环与犯罪大麻组织有关,那么这当然很有趣,但不幸的是,您将缺少用于分布式系统的常见模式的知识。
如果上面看起来并不熟悉,那么我建议你开始深入研究流行的分布式系统的工作方式,这些系统都依赖于一致哈希环背后的思想。参见例如:
- Cassandra
- Riak
- Dynamo
- Couchbase Server
Gossip 协议和consensus 算法是这一切的基础
大型分布式系统通常必须跟踪群集拓扑中的更改,以响应网络分区,故障和扩展事件。存在各种协议以确保可以发生这种情况,具有不同的一致性和复杂性。这需要是动态和实时的,因为节点在弹性系统中进出,需要快速检测故障,并且需要实时重新平衡负载和状态。使用像Ably这样的有状态系统,另外状态需要在新节点和旧节点之间实时移动,同时提供整个连续性。
如果您从未使用过Gossip或共识算法,那么我建议您阅读:
- Gossip 协议
- Paxos协议
- Raft consensus 算法
- 流行的共识支持系统,如etcd和Zookeeper,以及像Serf这样的Gossip 支持系统。
最终一致的数据类型和读/写一致性
通常在分布式系统中,锁实现是不切实际的,并且不可能扩展。因此,需要在数据的一致性和可用性之间进行权衡。例如,在许多情况下,可以优先考虑可用性,并使用CRDT等数据结构将一致性保证削弱到最终的一致性。
如果您不熟悉CRDT或Operational Transform,对分布式数据存储中的数据进行查询或写入的变量一致性概念,那么您需要做一些阅读:
- 运营转型 ?- 由Google最初在其Wave产品中实施,现在在Google Docs中实施。它在协作应用程序中有用,但OT很复杂,并没有广泛实现。
- 只要使用可用的数据类型,无冲突的复制数据类型或CRDT就会提供最终一致的结果。由Riak分布式数据库和在凤凰城的存在使用。
- Cassandra等分布式数据库中读写的一致性级别
深入了解网络协议
在分布式系统中,您几乎肯定会在网络堆栈的所有层中工作。虽然我们广泛依赖各种更高级别的协议,例如HTTP,WebSockets,gRPC和TCP套接字,但是如果不深入了解这些协议以及它们依赖于操作系统本身的完整协议栈,那么很可能你会当出现问题时,努力解决分布式系统中的问题。例如,以下请求或WebSocket连接将涉及以下所有内容。在每一层,您应该对您在数据包或帧级别调试问题的理解和能力充满信心:
- DNS协议和UDP用于地址查找。
- 文件描述符(在* nix上)和用于连接,NAT表,conntrack表等的缓冲区。
- IP在主机之间路由数据包
- TCP建立连接
- TLS握手,终止和证书认证
- HTTP / 1.1或更新版本最近由gRPC广泛使用。
- WebSocket通过HTTP升级。
本文暂时没有评论,来添加一个吧(●'◡'●)