协调器

在 Neo4j 中,数据库创建等管理操作并非同步发生。相反,更改首先写入到 system 数据库,记录数据库管理系统 (DBMS) 的请求状态。每个服务器都有一个协调器,这是一个内部组件,它观察请求状态并更改本地服务器以匹配该状态。例如,system 数据库可能记录数据库 bar 预期在 server-1 上运行。当 server-1 上的协调器意识到这一点时,它会启动 bar。这意味着任何一台服务器的丢失都不能阻止操作的所有进展。

执行操作并获得成功响应意味着请求已安全地提交到 system 数据库,并且在服务器足够健康的情况下,将在某个时间点由集群的每个成员处理。

服务器可能在不同时间知晓同一操作,因为 system 数据库只是另一个 Raft 组,在某些情况下,追随者和副本可能会落后于领导者。最终,新状态会传播到所有健康的服务器,并且它们会对此采取行动。

如果您想确保每个服务器都在运行下一个操作之前处理了管理操作,可以使用 WAIT 关键字。WAIT 会使语句不返回,直到所有服务器都已看到该事务,并且其协调器已完成处理。

使用 WAIT 创建数据库的示例
CREATE DATABASE foo WAIT

当带有 WAIT 的语句返回时,这并不意味着操作在所有地方都必然成功。WAIT 只是确保操作已被处理。例如,如果协调器尝试启动数据库,但数据库失败并进入脏状态,则启动数据库的请求仍被视为已处理

错误

一个操作可能只在某些服务器上成功。例如,在创建数据库时,某些服务器可能处于离线状态,或者磁盘错误可能导致服务器无法启动数据库。在这种情况下,操作并没有整体失败,因为数据库甚至可能正在运行(尽管容错性可能低于您的预期)。

某些失败的操作可以重试:例如,如果并非所有成员都成功启动,并且您认为问题已解决,则可以重新运行 START DATABASE。其他失败仅需要解决底层问题。当问题解决后,协调器将进行预期更改,因为它仍在尝试达到请求的状态。例如,如果在 DEALLOCATE DATABASES FROM SERVER 期间新服务器发生故障(意味着数据库无法安全移动),那么修复新服务器就足以解决问题,因为新服务器将在目标准备就绪后立即启动其数据库副本,从而允许解除分配的服务器关闭其副本。

© . All rights reserved.