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