调解器 (Reconciler)企业版
在 Neo4j 中,诸如创建数据库之类的管理操作并非同步发生。相反,变更会首先被写入 system 数据库,记录 DBMS 的预期状态。每个服务器都有一个 reconciler(协调器),这是一个内部组件,负责观察预期状态并对本地服务器进行更改以匹配该状态。例如,system 数据库可能记录了数据库 bar 应在 server-1 上运行。当 server-1 上的协调器感知到这一点时,它就会启动 bar。这意味着丢失任何一台服务器都不会阻碍操作的整体进展。
执行操作并获得成功响应,意味着该请求已安全提交到 system 数据库中,并且在服务器健康状况良好的前提下,最终会被集群中的每个成员处理。
服务器感知到同一操作的时间可能不同,因为 system 数据库本质上是另一个 Raft 组,在某些情况下,跟随者(follower)和副本(replica)可能会滞后于领导者(leader)。最终,新状态会传播到所有健康的服务器,并由它们采取相应的行动。
如果您希望在运行下一个动作之前确保每台服务器都已处理了管理操作,可以使用 WAIT 关键字。WAIT 会使语句在所有服务器都看到该事务并且其协调器已完成处理之前不返回结果。
WAIT 创建数据库的示例CREATE DATABASE foo WAIT
|
当带有 |
错误
操作可能仅在部分服务器上成功。例如,某些服务器在创建数据库时可能处于离线状态,或者磁盘错误可能导致服务器无法启动数据库。在这种情况下,操作并没有作为整体失败,因为数据库可能仍在运行(尽管容错能力低于您的预期)。
某些失败的操作可以直接重试:例如,如果并非所有成员都成功启动,且您认为导致失败的原因已解决,则可以重新运行 START DATABASE。其他失败则仅需解决底层问题即可。当问题修复后,协调器会自动执行预期的更改,因为它一直在尝试实现请求的状态。例如,如果某台新服务器在执行 DEALLOCATE DATABASES FROM SERVER 期间发生故障(意味着数据库无法安全迁移),修复该新服务器通常就足以解决问题,因为一旦目标就绪,新服务器就会启动其数据库副本,从而允许原有的服务器关闭其副本。