Link Search Menu Expand Document Documentation Menu

滚动升级

滚动升级,有时也称为“节点替换升级”,可以在运行中的集群上执行,几乎不中断服务。节点会单独停止并原地升级。或者,节点可以一次停止一个,然后由运行新版本的主机替换。在此过程中,您可以继续对集群中的数据进行索引和查询。

本文档提供了滚动升级过程的高级、与平台无关的概述。有关命令、脚本和配置文件的具体示例,请参阅附录

升级准备

在对 OpenSearch 集群进行任何更改之前,请查阅升级 OpenSearch,了解有关备份配置文件以及创建集群状态和索引快照的建议。

重要提示:OpenSearch 节点无法降级。如果需要回滚升级,则需要全新安装 OpenSearch 并从快照中恢复集群。在开始升级过程之前,请务必创建快照并将其存储在远程仓库中。

执行升级

  1. 在开始之前,请验证 OpenSearch 集群的健康状况。您应该在升级前解决任何索引或分片分配问题,以确保数据得到保留。状态为绿色表示所有主分片和副本分片都已分配。有关更多信息,请参阅集群健康。以下命令查询 _cluster/health API 端点
    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/settings API 端点来禁用分片复制
    PUT "/_cluster/settings?pretty"
    {
        "persistent": {
            "cluster.routing.allocation.enable": "primaries"
        }
    }
    

    响应应类似于以下示例

    {
      "acknowledged" : true,
      "persistent" : {
        "cluster" : {
          "routing" : {
            "allocation" : {
              "enable" : "primaries"
            }
          }
        }
      },
      "transient" : { }
    }
    
  3. 对集群执行刷新操作,将事务日志条目提交到 Lucene 索引
    POST "/_flush?pretty"
    

    响应应类似于以下示例

    {
      "_shards" : {
        "total" : 4,
        "successful" : 4,
        "failed" : 0
      }
    }
    
  4. 检查您的集群并确定要升级的第一个节点。符合条件的集群管理器节点应最后升级,因为 OpenSearch 节点可以加入运行旧版本管理器节点的集群,但不能加入所有管理器节点都运行新版本的集群。
  5. 查询 _cat/nodes 端点以确定哪个节点已提升为集群管理器。以下命令包含额外的查询参数,仅请求名称、版本、node.role 和 master 头。请注意,OpenSearch 1.x 版本使用“master”一词,该词在 OpenSearch 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. 停止您要升级的节点。删除容器时,不要删除与该容器关联的数据卷。新的 OpenSearch 容器将使用现有数据卷。删除数据卷将导致数据丢失
  7. 通过查询 _cat/nodes API 端点,确认相关节点已从集群中移除
    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. 部署一个运行所需 OpenSearch 版本的新容器,并将其映射到您删除的容器所用的同一数据卷。
  9. 在新节点上运行 OpenSearch 后,查询 _cat/nodes 端点以确认它已加入集群
    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       -
    

    在示例输出中,新的 OpenSearch 节点向集群报告运行版本为 7.10.2。这是 compatibility.override_main_response_version 的结果,该参数用于连接检查版本的旧版客户端集群。您可以通过调用 /_nodes API 端点(如以下命令所示)手动确认节点版本。将 <nodeName> 替换为您的节点名称。有关更多信息,请参阅节点 API

    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。请记住,符合条件的集群管理器节点应最后升级。替换最后一个节点后,查询 _cat/nodes 端点以确认所有节点都已加入集群。集群现已引导至新版本的 OpenSearch。您可以通过查询 _cat/nodes API 端点来验证集群版本
    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. 升级现已完成,您可以开始享受最新的功能和修复!

滚动重启

滚动重启遵循与滚动升级相同的分步过程,但实际节点升级除外。在滚动重启期间,节点会一次重启一个——通常是为了应用配置更改、刷新证书或执行系统级维护——而不会中断集群可用性。

要执行滚动重启,请遵循滚动升级中概述的步骤,但排除涉及升级 OpenSearch 二进制文件或容器镜像的步骤

  1. 检查集群健康
    确保集群状态为绿色且所有分片均已分配。
    (滚动升级步骤 1)

  2. 禁用分片分配
    防止 OpenSearch 在节点离线时尝试重新分配分片。
    (滚动升级步骤 2)

  3. 刷新事务日志
    将最近的操作提交到 Lucene 以减少恢复时间。
    (滚动升级步骤 3)

  4. 检查并确定要重启的下一个节点
    确保您最后重启当前的集群管理器节点。
    (滚动升级步骤 4)

  5. 检查哪个节点是当前集群管理器
    使用 _cat/nodes API 确定哪个节点是当前活跃的集群管理器。
    (滚动升级步骤 5)

  6. 停止节点
    优雅地关闭节点。不要删除关联的数据卷。
    (滚动升级步骤 6)

  7. 确认节点已离开集群
    使用 _cat/nodes 验证它是否不再列出。
    (滚动升级步骤 7)

  8. 重启节点
    启动同一节点(相同的二进制文件/版本/配置),让它重新加入集群。
    (滚动升级步骤 8 — 不升级二进制文件)

  9. 验证重启的节点已重新加入
    检查 _cat/nodes 以确认节点存在且健康。
    (滚动升级步骤 9)

  10. 重新启用分片分配
    恢复完整的分片移动能力。
    (滚动升级步骤 10)

  11. 确认集群健康状态为绿色
    在重启下一个节点之前验证稳定性。
    (滚动升级步骤 11)

  12. 对所有其他节点重复此过程
    一次重启一个节点。如果某个节点有资格担任集群管理器角色,则最后重启它。
    (滚动升级步骤 12 — 再次,没有升级步骤)

通过保留仲裁并按顺序重启节点,滚动重启可确保零停机时间和完整的数据连续性。

剩余 350 字符

有问题?

想做贡献?