将因果集群升级到 4.1
本节介绍如何升级 Neo4j 因果集群。
您可以通过执行滚动升级或离线升级来升级现有的 Neo4j 因果集群。
必须为每个集群成员完成先决条件和升级步骤。 |
离线升级
此变体适用于无法执行滚动升级的情况。
建议在类似生产的环境中执行测试升级,以获取停机时间的信息。 |
先决条件
确保您已完成升级清单上的所有任务。
准备升级
-
关闭所有集群成员(核心和只读副本)。
-
在每个集群成员上执行
neo4j-admin unbind
以删除集群状态数据。 -
在每个实例上安装要升级到的 Neo4j 版本。有关如何安装您正在使用的发行版的更多信息,请参见操作手册 4.1 → 安装。
-
将 neo4j.conf 文件替换为您在部分准备新安装要使用的 neo4j.conf 文件中为每个实例准备的文件。
-
复制用于加密的所有文件,例如私钥、公钥证书以及受信任目录和被吊销目录的内容(位于 <neo4j-home>/certificates/ 中)。
-
使用
neo4j-admin restore
(联机)或neo4j-admin load
(离线)将每个数据库和事务还原到新安装中,包括system
数据库,具体取决于您的备份方法。如果您正在运行 Debian/RPM 发行版,则可以跳过此步骤。如果您的旧安装修改了以
dbms.directories.*
或设置dbms.default_database
开头的配置,请验证新的neo4j.conf
文件是否已正确配置以查找这些目录。 -
如果您使用的是自定义插件,请确保它们已更新并与新版本兼容,并将它们放在/plugins 目录中。
升级您的集群
- 在一个核心上
-
-
打开新安装的 neo4j.conf 文件并配置以下设置
-
取消注释
dbms.allow_upgrade=true
以允许自动存储升级。 -
设置
dbms.mode=SINGLE
。这将启用system
数据库模式的自动升级,因为设置dbms.allow_single_automatic_upgrade
在dbms.mode=SINGLE
时默认情况下为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.1 → 管理数据库。
-
针对固定数量服务器的滚动升级
此变体适用于服务器数量固定且必须就地更新的部署。
在为固定数量的服务器执行滚动升级时,无法增加集群大小。因此,在替换成员时,集群容错级别将降低。 |
先决条件
-
确保您已完成升级清单上的所有任务。
-
通过在Cypher® Shell或 Neo4j 浏览器中运行
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
数据库之外。如果您确实把自己锁定了,请按照操作手册中的禁用身份验证步骤恢复并防止外部访问实例或集群。从 Neo4j 4.0.x 升级时,您必须禁用对有权访问该特定数据库的每个角色的访问,因为
PUBLIC
尚未存在DENY ACCESS ON DATABASE [database-name] TO [role1],[role2]
可以使用
SHOW ROLES
查询所有可用角色。 -
使用以下命令确保数据库在滚动升级期间不会被停止、创建或删除
DENY STOP ON DATABASE * TO PUBLIC DENY DATABASE MANAGEMENT ON DBMS TO PUBLIC
从 Neo4j 4.0.x 升级时,您只能禁用停止数据库的功能。
DENY STOP ON DATABASE * TO admin
必须对
admin
角色以及具有停止数据库权限的所有其他角色执行此操作。有关列出权限的更多信息,请参见Cypher 手册 4.1 → 图和子图访问控制。
升级集群
您一次升级一个集群成员,而其他成员仍在运行。
如果在滚动升级期间,集群丢失了仲裁且无法恢复,则可能需要停机来执行灾难恢复。 |
- 对于每个集群成员
-
-
(推荐) 使用状态端点中描述的过程评估是否可以安全地移除旧实例。
-
关闭实例。
-
安装您要升级到的Neo4j版本。有关如何安装您正在使用的发行版的更多信息,请参见操作手册 4.1 → 安装。
-
将neo4j.conf文件替换为在准备新的neo4j.conf文件以供新安装使用中为此实例准备的文件。
-
启动新实例并等待它赶上其他集群成员。
-
使用状态端点验证新实例是否已成功加入集群并赶上其他成员。
-
由于只读副本不是集群共识组的一部分,因此在升级期间替换它们不会影响集群的可用性和容错级别。但是,仍然建议逐步添加只读副本,以实现结构化且可维护的升级过程。 |
升级system
数据库
在 4.x 版本中,Neo4j 使用共享的system
数据库,其中包含复杂信息,例如用户、角色及其权限的安全配置。system
数据库中包含的图的结构随着每个新版本的 Neo4j 都会发生变化,因为 DBMS 的功能不断增强。因此,每次升级 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
字段将描述哪些组件未能升级。
升级后步骤
滚动升级后,必须执行以下步骤。
-
恢复
PUBLIC
角色的停止数据库权限REVOKE DENY STOP ON DATABASE * FROM PUBLIC
-
恢复
PUBLIC
角色的创建和删除数据库权限REVOKE DENY DATABASE MANAGEMENT ON DBMS FROM PUBLIC
-
(可选) 如果您已启动离线数据库并在滚动升级的准备阶段拒绝了一些访问权限,您还应将其恢复到原始状态
-
通过运行以下命令停止每个数据库
STOP DATABASE [database-name]
-
通过运行以下命令重新启用对数据库的访问
REVOKE DENY ACCESS ON DATABASE [database-name] FROM [role1],[role2]
-
-
(推荐) 使用空目标目录执行完整备份。
云基础设施的滚动升级
此变体适用于使用可替换的云或容器资源的部署。它遵循与固定数量的服务器相同的步骤,但您可以在关闭旧成员之前添加新成员,从而保留集群容错级别。由于只读副本不是集群共识组的一部分,因此在升级期间替换它们不会影响集群的可用性和容错级别。但是,仍然建议逐步添加只读副本,以实现结构化且可维护的升级过程。