将因果集群升级到 4.3
本节介绍如何升级 Neo4j 因果集群。
您可以通过执行滚动升级或离线升级来升级现有的 Neo4j 因果集群。
每个集群成员都必须完成先决条件和升级步骤。 |
离线升级
此变体适用于无法进行滚动升级的情况。
建议在类似生产环境的测试环境中执行升级,以获取停机时间信息。 |
准备升级
-
关闭所有集群成员(核心成员和只读副本)。
-
在每个集群成员上执行
neo4j-admin unbind
以移除集群状态数据。 -
在每个实例上安装您要升级到的 Neo4j 版本。有关如何安装您正在使用的分发版的更多信息,请参阅操作手册 4.3 → 安装。
-
将 neo4j.conf 文件替换为已在为新安装准备新的 neo4j.conf 文件部分中为每个实例准备好的文件。
-
复制所有用于加密的文件,例如私钥、公共证书以及受信任和已吊销目录(位于 <NEO4J_HOME>/certificates/ 中)的内容。
-
根据您的备份方法,使用
neo4j-admin restore
(在线)或neo4j-admin load
(离线)在新安装中恢复您的每个数据库和事务,包括system
数据库。如果您的旧安装修改了以
dbms.directories.*
开头或dbms.default_database
的配置,请验证新的neo4j.conf
文件是否正确配置以找到这些目录。 -
如果您正在使用自定义插件,请确保它们已更新并与新版本兼容,并将其放置在 /plugins 目录中。
升级您的集群
- 在一个核心成员上
-
-
打开新安装的 neo4j.conf 文件并配置以下设置
-
取消注释
dbms.allow_upgrade=true
以允许自动存储升级。 -
设置
dbms.mode=SINGLE
。这会启用system
数据库模式的自动升级,因为当dbms.mode=SINGLE
时,设置dbms.allow_single_automatic_upgrade
默认设为true
。
-
-
从
<NEO4J_HOME>
运行以下命令启动 Neo4jbin/neo4j start
升级在启动期间进行。
-
监控 neo4j.log 文件,了解升级将涉及多少步骤以及已进行到何种程度。
-
升级完成后,停止服务器。
-
打开 neo4j.conf 文件并配置以下设置
-
设置
dbms.mode=CORE
以在配置中重新启用因果集群。
-
使用
neo4j-admin dump
对您的每个数据库和事务(包括system
数据库)进行转储。 -
暂不要启动服务器。
-
- 在每个其他核心成员上
-
-
将您在第一个核心成员服务器上创建的数据库转储复制到每个其他核心成员。
-
使用
neo4j-admin load --from=<archive-path> --database=<database> --force
将您的每个数据库(包括system
数据库)替换为在第一个核心成员服务器上升级过的数据库。 -
启动每个核心服务器,包括第一个,并验证它们是否加入集群。
-
- 对于每个只读副本
-
启动只读副本并等待其追赶上其余集群成员。
(可选)尽管一个空的只读副本最终将从集群的其他成员那里获取所有数据的完整副本,但此追赶过程可能需要一些时间。为了加快此过程,您可以首先使用
neo4j-admin load --from=<archive-path> --database=<database> --force
加载数据,用已升级的数据库替换您的每个数据库,包括system
数据库。验证只读副本是否加入集群。
滚动升级
滚动升级是一种零停机时间的方法,用于升级因果集群。您可以一次升级一个成员,而其余成员仍在运行。但是,如果在滚动升级期间集群失去法定人数且无法恢复,则可能需要停机进行灾难恢复。
- 建议
-
-
升级过程中的关键点是了解何时可以安全地关闭原始成员。
强烈建议在每次移除之前监控状态端点,以便决定关闭哪个成员以及何时关闭是安全的。 -
为降低滚动升级期间的失败风险,请确保在升级期间集群未承受任何重负载。如果可能,最安全的方法是完全禁用写入操作。
-
在滚动升级期间,不应对数据库管理进行任何更改。有关更多信息,请参阅操作手册 4.3 → 管理数据库。
-
从 neo4j.conf 中移除
dbms.record_format
以避免任何意外的跨格式迁移。
-
固定数量服务器的滚动升级
此变体适用于服务器数量固定且必须就地更新的部署。
对固定数量的服务器执行滚动升级时,无法增加集群大小。因此,在替换成员时,集群的容错级别将降低。 |
先决条件
-
请确保您已完成升级清单上的所有任务。
在对 Neo4j 4.3 执行滚动升级时,请确保源版本是 4.2 的最新版本,否则升级可能会失败。
-
通过在Cypher® Shell 或 Neo4j Browser 中运行
SHOW DATABASES
来验证所有数据库是否在线。离线数据库可以使用START DATABASE [database-name]
启动。在开始滚动升级之前,所有数据库都必须启动。如果在滚动升级期间必须使某个数据库无法访问,可以使用以下命令禁用对其的访问
DENY ACCESS ON DATABASE [database-name] TO PUBLIC
您绝不能运行
DENY ACCESS ON DATABASE system TO PUBLIC
或DENY ACCESS ON DATABASE * TO PUBLIC
,因为这会使您无法访问system
数据库。如果您确实无法访问,请按照操作手册中禁用认证的步骤进行恢复,并阻止外部访问实例或集群。 -
使用以下命令确保在滚动升级期间无法停止、创建或删除数据库
DENY STOP ON DATABASE * TO PUBLIC DENY DATABASE MANAGEMENT ON DBMS TO PUBLIC
升级集群
您一次升级一个集群成员,而其余成员仍在运行。
如果在滚动升级期间集群失去法定人数且无法恢复,则可能需要停机进行灾难恢复。 |
- 对于每个集群成员
-
-
(推荐)使用状态端点中描述的过程来评估是否可以安全地移除旧实例。
-
关闭实例。
-
安装您要升级到的 Neo4j 版本。有关如何安装您正在使用的分发版的更多信息,请参阅操作手册 4.3 → 安装。
-
将 neo4j.conf 文件替换为已在为新安装准备新的 neo4j.conf 文件中为此实例准备好的文件,并设置
dbms.allow_upgrade=true
以允许自动存储升级。 -
启动新实例并等待其追赶上其余集群成员。
-
使用状态端点验证新实例是否已成功加入集群并追赶上其余成员。
-
在 neo4j.conf 文件中,配置以下设置
-
设置
dbms.allow_upgrade=false
以禁用自动存储升级。 -
如果之前已移除
dbms.record_format
的任何自定义值,请将其恢复。
-
-
由于只读副本不属于集群共识组,在升级期间替换它们不会影响集群的可用性和容错级别。但是,仍然建议逐步添加只读副本,以实现结构化和可维护的升级过程。 |
升级 system
数据库
在 4.x 版本中,Neo4j 使用共享的 system
数据库,其中包含复杂信息,例如用户、角色及其权限的安全配置。随着 DBMS 功能的增长,system
数据库中包含的图的结构会随着 Neo4j 的每个新版本而变化。因此,每次升级 Neo4j 部署时,system
数据库的内容(即模式)也必须进行转换。当执行单个部署或因果集群的离线升级时,这些更改会自动发生,这是配置 dbms.mode=SINGLE
的结果(请参阅准备升级和升级您的集群)。但是,在执行滚动升级时,您永远不会使用配置值 dbms.mode=SINGLE
启动实例,也就是说,无法自动更新 system
数据库。
您希望启用的任何特定指标必须在 |
兼容性与同步
对于具有多个实例的因果集群,在依次升级每个实例时,会有一段时间集群由一些旧实例和一些新实例组成。单个 system
数据库在整个集群中一致地复制。因此,无法使其模式根据某些实例上新 Neo4j 版本的需要而结构化,而其他实例则根据旧版本的需要结构化。
当 system
数据库与给定实例的 Neo4j 版本不兼容时,该实例将以兼容模式运行。这意味着两个 Neo4j 版本共有的功能将继续工作,但需要新模式的功能将被禁用。例如,如果您尝试授予旧模式不支持的新权限,您将收到错误并且授予将失败。因此,当滚动升级完成后,您必须手动升级 system
数据库模式才能访问所有新功能。
如果 |
手动触发 system
数据库升级
-
在其中一个集群成员上,调用存储过程
dbms.upgradeStatus()
来确定是否需要升级CALL dbms.upgradeStatus();
+-------------------------------------------------------------------------------------------------------------------------+ | status | description | resolution | +-------------------------------------------------------------------------------------------------------------------------+ | "REQUIRES_UPGRADE" | "The sub-graph is supported, but is an older version and requires upgrade" | "CALL dbms.upgrade()" | +-------------------------------------------------------------------------------------------------------------------------+
有关可能的状态值的完整列表,请参阅
dbms.upgradeStatus
的状态码。 -
在其中一个集群成员上,通过对
system
数据库调用存储过程dbms.upgrade()
来执行升级CALL dbms.upgrade();
+---------------------------+ | status | upgradeResult | +---------------------------+ | "CURRENT" | "Success" | +---------------------------+
由于 Neo4j 使用共享的
system
数据库,升级后的system
数据库将在整个集群中复制。如果升级因某种原因失败,状态将不会改变,并且upgradeResult
字段将描述哪些组件未能升级。
云基础设施的滚动升级
此变体适用于使用可替换云或容器资源的部署。它遵循与固定数量服务器相同的步骤,但您可以在关闭旧成员之前添加新成员,从而保留集群的容错级别。由于只读副本不属于集群共识组,在升级期间替换它们不会影响集群的可用性和容错级别。但是,仍然建议逐步添加只读副本,以实现结构化和可维护的升级过程。