简介
概述
Neo4j 的集群提供以下主要功能
-
安全性:以主模式托管数据库的服务器为事务处理提供了一个容错平台,只要大多数主服务器正常运行,该平台就能保持可用。
-
可扩展性:以辅助模式托管数据库的服务器为图查询提供了一个可大规模扩展的平台,使非常大的图工作负载能够在广泛分布的拓扑结构中执行。
-
因果一致性:当客户端应用程序被调用时,可以保证它至少读取自己的写入。
-
可操作性:数据库管理与服务器管理分离。
这些功能共同使最终用户系统能够在发生多个硬件和网络故障时保持完全功能,并且能够读写数据库,从而简化对数据库交互的推理。此外,集群的管理非常简单,包括扩展集群规模以及分配和平衡可用资源。
本节的其余部分概述了集群在生产环境中的工作原理,包括操作和应用程序方面。
运维视角
从运维的角度来看,将集群视为一个同构的服务器池是有益的,这些服务器运行多个数据库。服务器具有两种不同的数据库托管功能,分别称为主节点和从节点模式。服务器可以同时充当一个或多个数据库的主节点,以及其他数据库的从节点。类似地,即使服务器是集群的一部分,数据库也可能仅托管在一个服务器上。在这种情况下,服务器始终以主节点模式托管该数据库。
这两种模式是任何生产部署的基础,但彼此的管理规模不同,并在管理整个集群的容错性和可扩展性方面承担不同的角色。
主节点模式
以主节点模式托管数据库的服务器允许读写操作。一个数据库可以由一个或多个主节点托管。
为了实现高可用性,应使用多个主节点创建数据库。如果不需要高可用性,则可以使用单个主节点创建数据库以获得最小的写入延迟。本节的其余部分假设数据库具有多个主节点。
数据库主节点通过使用 Raft 协议复制所有事务来实现高可用性。Raft 通过等待数据库中大多数主节点 (N/2+1) 确认事务,然后才向最终用户应用程序确认其提交,从而确保数据安全持久。在实践中,多个主节点中只有一个执行来自客户端的写入事务。此写入节点是从数据库的主节点中自动选举出来的,并且可能会随着时间的推移而发生变化。写入主节点会同步地将写入复制到其他主节点。数据库从节点异步地从集群中更新的成员复制写入。
这种同步复制会影响写入事务的延迟。隐式地,写入事务由最快的多数确认,但是随着数据库主节点数量的增加,确认写入所需的多数数量也会增加。
数据库的容错性使用公式 M = 2F + 1 计算,其中 M 是容忍 F 个故障所需的节点数。例如
-
为了容忍两个主节点故障,您需要一个由五个服务器组成的拓扑结构,这些服务器以主节点模式托管您的数据库。
-
最小的容错集群(可以容忍一个故障的集群)必须具有三个数据库主节点。
-
也可以创建一个仅包含两个主节点的集群。但是,该集群没有容错能力。如果两个服务器之一发生故障,则剩余的服务器将变为只读。
-
具有单个主服务器的数据库也不能容忍任何故障。因此,建议使用三个或更多主节点来实现高可用性。
对于数据库主节点,如果数据库发生足够的主节点故障,它将无法再处理写入,并变为只读以保持安全性。 |
从节点模式
数据库从节点通过事务日志传输从主节点异步复制。它们定期轮询上游服务器以获取新事务,并将这些事务传输过来。许多从节点可以从相对较少的节点获取数据,从而允许查询工作负载的大量扩展。
数据库通常可以有相当多的从节点。丢失一个从节点不会影响数据库的可用性,除了其图查询吞吐量的一部分损失外。它不影响数据库的容错性。
数据库从节点的主要职责是扩展读取工作负载。从节点充当图数据的缓存,并且完全能够执行任意(只读)查询和过程。
由于其异步特性,从节点可能不会提供在主服务器上提交的所有事务。
因果一致性
虽然集群的运维机制从应用程序的角度来看很有趣,但考虑应用程序如何使用数据库完成工作也很有帮助。在许多应用程序中,通常希望从图中读取和写入图。根据工作负载的性质,通常希望图的读取能够考虑到先前的写入以确保因果一致性。
因果一致性是分布式计算中使用的众多一致性模型之一。它确保因果相关的操作在系统中的每个实例中以相同的顺序可见。因此,客户端应用程序保证能够读取自己的写入,无论它们与哪个实例通信。这简化了与大型集群的交互,允许客户端将它们视为单个(逻辑)服务器。 |
因果一致性使得可以写入托管在主节点服务器上的数据库,并从托管在从节点服务器上的数据库(其中图操作已扩展)读取这些写入。例如,因果一致性保证在创建用户帐户的写入在同一用户随后尝试登录时存在。
在执行事务时,客户端可以请求一个书签,然后将其作为参数提供给后续事务。使用该书签,集群可以确保只有处理了客户端书签事务的服务器才会运行其下一个事务。这提供了一个因果链,从客户端的角度保证了正确的读后写语义。
除了书签之外,其他所有内容都由集群处理。数据库驱动程序与集群拓扑管理器一起工作,选择最合适的服务器来路由查询。例如,将读取路由到数据库从节点,并将写入路由到数据库主节点。