知识库

将您的因果集群从 3.1.x 升级到 3.2.x

本文概述了将 Neo4j 3.1.2+ 因果集群升级到 3.2.2 的可能步骤。对于此升级路径,Neo4j 不支持滚动升级,因此需要停机来完成该过程。不过,以下步骤旨在尽可能减少读写操作的停机时间,同时尽可能保留数据安全性和高可用性。这种权衡可能并不适用于所有设置。

前提条件

  • 您拥有一个运行中的 Neo4j 3.1.x(x>=2)因果集群。

  • 您有三台核心(Core)服务器,没有从属(Follower)服务器。

  • 您的操作系统是 Linux。

  • Neo4j 的安装是通过解压 .tar.gz 文件完成的。

  • 您已获得多数据中心操作许可,请参阅 /docs/operations-manual/current/clustering/causal-clustering/multi-data-center/#multi-dc-licensing

  • 在遵循本文升级步骤时,您的配置、插件以及 data/dbms/ 中的文件不会发生更改(当然,步骤中描述的调整除外)。

  • 您的可用磁盘空间至少是当前安装(包括数据库文件)大小的两倍。

升级步骤

在执行以下步骤之前,请通读全文并在预发布环境中测试该流程。

第 0 步 - 准备工作

  • 确保您可以访问 Neo4j 3.2.2 的安装源。

  • 确保您的客户端应用程序具备良好的错误处理机制,因为它们会在短时间内收到异常。例如,使用 Java 驱动程序时,您可能需要通过 Config.build().withMaxTransactionRetryTime( .. ).toConfig() 进行配置。

  • 确保您的客户端应用程序能区分读事务和写事务。即:仅读取时,请使用 session.readTransaction() 或将 session 的访问模式设置为 AccessMode.READ

  • 确保所有插件都与新版本兼容。

  • 对数据库进行备份。

第 1 步 - 安装 Neo4j 3.2.2

在每台服务器上:

  • 解压 neo4j-enterprise-3.2.2-unix.tar.gz 文件。

  • 将旧的(运行中)Neo4j 安装目录中的以下目录的所有文件复制到新解压的(已关闭)安装目录中(保持目录结构一致):

    • conf/ 中的文件

    • data/dbms/ 中的文件

    • plugins/ 中的文件

下文中,我们将提到“旧”和“新”文件或实例。旧文件/实例是指 Neo4j 3.1 安装版本,新文件/实例是指 Neo4j 3.2 安装版本。

第 2 步 - 将 Follower 设置为“仅从属 (Follower Only)”模式

  • 识别旧集群安装中的 Leader 和 Follower 实例。您可以使用以下命令之一:

    • 在 Neo4j Browser 中执行 :sysinfo,或

    • 通过 Cypher 执行 CALL dbms.cluster.overview()

  • 挑选一个尚未处于“仅从属”模式的 Follower 实例。

    • 在该实例的旧 neo4j.conf 文件中:

    • 设置/添加 causal_clustering.refuse_to_be_leader=true,以及

    • 设置/添加 causal_clustering.multi_dc_license=true

    • 重启该实例,它将不再能够成为 Leader。

    • 等待该实例完全启动并正常运行。

  • 重复第 2 步,直到所有 Follower(在本场景中为两个)都处于“仅从属”模式。

在此步骤中,您可能会遇到处理读请求时有短暂(几毫秒)的延迟。但是,如果您已配置应用程序进行事务重试(见第 0 步),则预计不会出现停机。完成此步骤后,我们拥有一个三实例集群,其中只有一个实例允许成为 Leader。这降低了写入操作的高可用性。例如,如果此时 Leader 发生故障,读取操作仍可处理,但无法进行写入。

第 3 步 - 关闭 Leader

  • 停止旧的 Leader。此步骤标志着写入停机的开始!读取操作仍通过两个 Follower 实例进行处理。

第 4 步 - 将数据库复制到新 Leader

  • 在旧 Leader 实例上:

    • 将您的(旧)活动数据库文件夹(默认为 data/databases/graph.db)复制到新的 3.2.x 安装目录中(该目录已在第 1 步中设置)。通过复制数据库文件夹,我们可以确保在出现回退时拥有最新的写入数据。

第 5 步 - 配置 3.2.x 以进行格式迁移

  • 在 Leader 机器上的新 3.2.x neo4j.conf 文件中,确保设置以下参数:

    • dbms.allow_format_migration=true

    • dbms.mode=SINGLE

第 6 步 - 升级数据库文件(格式迁移)

  • 在新安装的 Leader 机器上:

    • 启动 Neo4j 3.2.x。根据数据库的大小,此步骤可能需要片刻时间完成。

    • 检查 logs/neo4j.log 文件以确认成功。应该包含以下行: 2017-07-06 18:08:59.933+0000 INFO Successfully finished upgrade of database

    • 停止 Neo4j 3.2.x。现在我们拥有了一个已升级的数据库,可以使用它来初始化新集群。

第 7 步 - 还原第 5 步的配置

  • 在 Leader 机器上的新 conf/neo4j.conf 文件中,确保设置以下参数:

    • dbms.allow_format_migration=false

    • dbms.mode=CORE

第 8 步 - 初始化集群

  • 将新升级的数据库文件夹(默认为 data/databases/graph.db)复制到 Follower 实例的新安装目录中。即:

    • 将 Leader 机器上的新活动数据库文件夹复制到其中一个新 Follower 安装目录中。

    • 将 Leader 机器上的新活动数据库文件夹复制到另一个新 Follower 安装目录中。

第 9 步 - 版本切换

从其中一个旧 Follower 实例开始:

  • 停止该实例。

对第二个 Follower 实例重复此过程。这是读取停机的开始!

  • 现在,启动新集群:

    • 启动新的 Leader 实例。

    • 启动两个新的 Follower 实例。

此过程结束了读写的停机时间。

第 10 步 - 验证

验证集群是否健康。可以使用 CALL dbms.cluster.overview() 作为切入点。如果您仍打开着 Neo4j Browser,可能需要刷新页面。

第 11 步 - 备份

  • 对运行中的数据库进行完整备份,包括执行一致性检查以验证已升级的数据库。

第 12 步 - 删除 3.1.x

  • 删除三台服务器上的旧安装文件。

回退方案

以下章节描述了将设置恢复到原始状态的步骤。取决于您决定执行回退的时间点,您将进入以下某个章节并执行其中描述的步骤。

从第 1 步回退

  • 从所有服务器删除新安装文件。

从第 2 步回退

  • 遵循“从第 1 步回退”章节的步骤。

从第 3 步回退

从其中一个旧 Follower 实例开始:

  • 在该实例的旧 neo4j.conf 文件中:

    • 设置 causal_clustering.refuse_to_be_leader=false 或彻底删除该参数,并且

    • causal_clustering.multi_dc_license 还原为最初配置的值。

  • 重启(旧的)Follower 实例。

  • 等待该实例完全启动并正常运行。 > 对第二个 Follower 实例重复此过程。

  • 遵循“从第 1 步回退”章节的步骤。

从第 4、5、6、7 或 8 步回退

  • 启动旧的 Leader。

此步骤标志着写入停机的结束!

  • 遵循“从第 3 步回退”章节的步骤。

从第 9 或 10 步回退

请注意:执行以下操作时,您将丢失已提交到新集群的写入数据!

  • 停止新的 Follower。

  • 停止新的 Leader。

  • 启动旧的 Leader。

  • 遵循“从第 3 步回退”章节的步骤。

© . This site is unofficial and not affiliated with Neo4j, Inc.