OpenSearch 滚动升级指南

滚动升级也称为节点替换升级。它逐个停止节点并原地升级,或逐个替换为运行新版本的主机。原文说明,这种方式可在运行中的集群上进行,通常以极少停机完成,过程中可以继续索引和查询数据;实际可用性取决于集群容量、仲裁与健康状态。

本文是跨平台的高层流程。具体命令、脚本和配置实践见滚动升级实验。

升级前的准备

变更集群前,备份配置文件,并为集群状态和索引创建快照,存入远程仓库。

OpenSearch 节点不能原地降级。需要回退时,须重新安装并从快照恢复。滚动升级只支持相邻主版本,例如 1.x 到 2.x,不能直接从 1.x 到 3.x。升级到 3.x.x 时,源集群至少要达到 2.19.0。应按实际目标版本核对兼容条件;本文对应核对时的 latest 文档。

跨集群复制

使用跨集群复制时:

  • 单向复制:先升级 follower 集群,再升级 leader 集群。
  • 双向复制:暂停一个方向,升级两个集群。对仍工作的方向,先升级 follower,再升级 leader;两边升级后恢复暂停的复制。

执行升级

下列请求和响应均为原文示例。GET、PUT、POST 采用原文的 API/控制台表示法,不能直接当作操作系统命令执行;响应中的主机名、版本和计数不是当前实际集群状态。

1. 确认集群健康

先解决索引与分片分配问题。green 表示主分片和副本分片均已分配。查询集群健康:

GET "/_cluster/health?pretty"

原文示例响应:

{
    "cluster_name":"opensearch-dev-cluster",
    "status":"green",
    "timed_out":false,
    "number_of_nodes":4,
    "number_of_data_nodes":4,
    "active_primary_shards":1,
    "active_shards":4,
    "relocating_shards":0,
    "initializing_shards":0,
    "unassigned_shards":0,
    "delayed_unassigned_shards":0,
    "number_of_pending_tasks":0,
    "number_of_in_flight_fetch":0,
    "task_max_waiting_in_queue_millis":0,
    "active_shards_percent_as_number":100.0
}

2. 暂停副本分配

节点离线期间,将分片分配限制为主分片,避免创建副本及相应的 Lucene 索引段迁移。原文称此步骤为“禁用分片复制”;其具体设置是 cluster.routing.allocation.enable: primaries:

PUT "/_cluster/settings?pretty"
{
    "persistent": {
        "cluster.routing.allocation.enable": "primaries"
    }
}

示例响应:

{
  "acknowledged" : true,
  "persistent" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "enable" : "primaries"
        }
      }
    }
  },
  "transient" : { }
}

3. 刷新事务日志

执行 flush,把事务日志中的记录提交至 Lucene 索引:

POST "/_flush?pretty"

示例响应:

{
  "_shards" : {
    "total" : 4,
    "successful" : 4,
    "failed" : 0
  }
}

4. 选择节点升级顺序

依次升级数据节点、摄取/机器学习/协调节点,最后升级有资格成为集群管理器的节点。

管理器节点放在最后,是因为新版本节点可以加入仍由旧版本管理器运行的集群;旧版本节点不能加入全部管理器均已使用新版本的集群。

5. 确认当前集群管理器

_cat/nodes 请求仅显示名称、版本、节点角色和 master 列。OpenSearch 1.x 使用“master”术语,2.x 及以后采用“cluster_manager”;原文请求仍保留该列名:

GET "/_cat/nodes?v&h=name,version,node.role,master" | column -t

示例响应中,星号标记管理器:

name        version  node.role  master
os-node-01  7.10.2   dimr       -
os-node-04  7.10.2   dimr       -
os-node-03  7.10.2   dimr       -
os-node-02  7.10.2   dimr       *

6. 停止目标节点

停止正在升级的节点。如果使用 Docker,删除旧容器时必须保留关联的数据卷,新容器要挂载同一个卷。删除卷会导致数据丢失。

7. 确认节点离开集群

GET "/_cat/nodes?v&h=name,version,node.role,master" | column -t

示例响应:

name        version  node.role  master
os-node-02  7.10.2   dimr       *
os-node-04  7.10.2   dimr       -
os-node-03  7.10.2   dimr       -

示例中的 os-node-01 已经停止并删除容器,因此不再出现在列表中。

8. 升级节点

  • Docker:部署目标版本的新容器,挂载旧容器所用的数据卷。
  • Debian或 RPM:根据包管理方式使用 rpm、yum 或 dpkg 安装并启动服务。原文说明这类安装保留路径和文件,无需进一步配置。
  • Tarball:备份 jvm.options、opensearch.yml、证书及 data;解压新包;把原 data 复制到新 data,否则会丢失数据;复制旧配置至 config/opensearch.yml 和 config/jvm.options;把 opensearch.yml 引用的 TLS 证书复制到 ./config/;然后启动 OpenSearch。

本高层文档没有提供可套用到全部操作系统的安装命令,具体包、插件和配置兼容性应另行核对。

9. 确认新节点重新加入

GET "/_cat/nodes?v&h=name,version,node.role,master" | column -t

示例响应:

name        version  node.role  master
os-node-02  7.10.2   dimr       *
os-node-04  7.10.2   dimr       -
os-node-01  7.10.2   dimr       -
os-node-03  7.10.2   dimr       -

原文示例中新节点对集群报告 7.10.2,这是旧客户端版本检测兼容设置 compatibility.override_main_response_version 的结果,并不代表该数字就是当前安装版本。可以通过 Nodes API进一步核对,替换 <nodeName>:

GET "/_nodes/{nodeName}?pretty=true" | jq -r '.nodes | .[] | "\(.name) v\(.version)"'

示例响应:

os-node-01 v1.3.7

10. 恢复副本分配

PUT "/_cluster/settings?pretty"
{
    "persistent": {
        "cluster.routing.allocation.enable": "all"
    }
}

示例响应:

{
  "acknowledged" : true,
  "persistent" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "enable" : "all"
        }
      }
    }
  },
  "transient" : { }
}

11. 再次确认集群健康

GET "/_cluster/health?pretty"

示例响应:

{
  "cluster_name" : "opensearch-dev-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 4,
  "discovered_master" : true,
  "active_primary_shards" : 1,
  "active_shards" : 4,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

12. 逐个处理剩余节点

对每个节点重复步骤 2—11,始终把有资格担任集群管理器的节点放在最后。每次健康恢复后,再处理下一个节点。

最后一个节点替换后,查询节点列表,确认所有节点均已重新加入并使用目标版本:

GET "/_cat/nodes?v&h=name,version,node.role,master" | column -t

示例响应:

name        version  node.role  master
os-node-04  1.3.7    dimr       -
os-node-02  1.3.7    dimr       *
os-node-01  1.3.7    dimr       -
os-node-03  1.3.7    dimr       -

13. 完成升级

上述检查通过后,原文将升级视为完成,随后可以使用新版本功能和修复。本稿没有执行升级,也没有把示例输出作为某个真实集群升级成功的证据。

滚动重启

滚动重启沿用上述流程,但不替换节点二进制或容器版本。它逐个重启节点,用于应用配置、刷新证书或系统维护。

  1. 检查集群健康:状态须为绿色,所有分片均已分配,对应升级步骤 1。
  2. 限制分片分配:避免节点离线期间重新分配分片,对应步骤 2。
  3. 刷新事务日志:把最近操作提交到 Lucene,减少恢复时间,对应步骤 3。
  4. 确定下一个重启节点:当前集群管理器最后处理,对应步骤 4。
  5. 确认当前管理器:通过 _cat/nodes 查询当前活跃管理器,对应步骤 5。
  6. 平稳停止单个节点,保留关联的数据卷,对应步骤 6。
  7. 确认该节点已经离开集群:在 _cat/nodes 结果中不再出现,对应步骤 7。
  8. 重启同一个节点,让它重新加入;使用原二进制、版本与相应配置,不执行升级步骤 8 中的版本替换。
  9. 检查节点已重新加入并处于健康状态,对应步骤 9。
  10. 恢复完整分片分配与迁移能力,对应步骤 10。
  11. 等待集群健康为绿色,确认稳定后再处理下一个节点,对应步骤 11。
  12. 对其余节点逐个重复;有资格成为集群管理器的节点最后重启,对应步骤 12。

保持仲裁并逐个重启,是原文维护可用性与数据连续性的前提;不能把文档中的“零停机”当作脱离具体拓扑和运行条件的保证。

相关文档


来源:OpenSearch Project 文档贡献者,原文,核对日期 2026-10-03。文档与代码采用 Apache License 2.0,仓库许可。本版译为中文,明确原文的版本示例、分配设置和可用性条件;全部代码与响应保留原样。许可全文随本地材料提供。NOTICE:Copyright OpenSearch contributors.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容