协调器
在 Neo4j 中,数据库创建等管理操作不会同步执行。相反,更改首先写入 _system_ 数据库,记录 DBMS 的请求状态。每个服务器都有一个 _协调器_,这是一个内部组件,它观察请求的状态并对本地服务器进行更改以匹配该状态。例如,_system_ 数据库可能会记录预期在 _server-1_ 上运行数据库 _bar_。当 _server-1_ 上的协调器意识到这一点时,它会启动 _bar_。这意味着任何一台服务器的丢失都不会阻止操作的所有进展。
执行操作并获得成功响应意味着请求已安全地提交到 _system_ 数据库,并且将在某个时间点由集群中的每个成员处理,假设服务器足够健康。
服务器可能会在不同的时间点意识到相同的操作,因为system
数据库只是另一个Raft组,在某些情况下,跟随者和副本可能会落后于领导者。最终,新的状态会传播到所有健康的服务器,然后它们会采取行动。
如果您想确保每个服务器在运行下一个操作之前都已处理完管理操作,可以使用WAIT
关键字。WAIT
使语句在所有服务器都看到事务并且它们的协调器完成处理之前不会返回。
WAIT
创建数据库的示例CREATE DATABASE foo WAIT
当带有 |
错误
操作可能只在某些服务器上成功。例如,当创建数据库时,某些服务器可能处于离线状态,或者磁盘错误可能导致服务器无法启动数据库。在这种情况下,操作还没有失败,因为数据库可能仍在运行(尽管容错能力不如预期)。
一些失败的操作可以重新尝试:例如,如果并非所有成员都成功启动,则可以重新运行START DATABASE
,并且您认为导致该问题的原因已解决。其他故障只需要解决底层问题。当问题得到解决后,协调器将进行所需的更改,因为它仍在尝试实现请求的状态。例如,如果一个新的服务器在DEALLOCATE DATABASES FROM SERVER
期间失败(这意味着数据库无法安全地移动),修复新的服务器就足以解决问题,因为新的服务器将在目标准备就绪后立即启动其数据库副本,允许取消分配的服务器关闭其副本。