滚动升级
滚动升级,有时也称为“节点替换升级”,可以在运行中的集群上执行,几乎不中断服务。节点会单独停止并原地升级。或者,节点可以一次停止一个,然后由运行新版本的主机替换。在此过程中,您可以继续对集群中的数据进行索引和查询。
本文档提供了滚动升级过程的高级、与平台无关的概述。有关命令、脚本和配置文件的具体示例,请参阅附录。
升级准备
在对 OpenSearch 集群进行任何更改之前,请查阅升级 OpenSearch,了解有关备份配置文件以及创建集群状态和索引快照的建议。
重要提示:OpenSearch 节点无法降级。如果需要回滚升级,则需要全新安装 OpenSearch 并从快照中恢复集群。在开始升级过程之前,请务必创建快照并将其存储在远程仓库中。
执行升级
- 在开始之前,请验证 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 }
- 禁用分片复制,以防止在节点离线时创建分片副本。这会停止集群中节点上 Lucene 索引段的移动。您可以通过查询
_cluster/settings
API 端点来禁用分片复制PUT "/_cluster/settings?pretty" { "persistent": { "cluster.routing.allocation.enable": "primaries" } }
响应应类似于以下示例
{ "acknowledged" : true, "persistent" : { "cluster" : { "routing" : { "allocation" : { "enable" : "primaries" } } } }, "transient" : { } }
- 对集群执行刷新操作,将事务日志条目提交到 Lucene 索引
POST "/_flush?pretty"
响应应类似于以下示例
{ "_shards" : { "total" : 4, "successful" : 4, "failed" : 0 } }
- 检查您的集群并确定要升级的第一个节点。符合条件的集群管理器节点应最后升级,因为 OpenSearch 节点可以加入运行旧版本管理器节点的集群,但不能加入所有管理器节点都运行新版本的集群。
- 查询
_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 *
- 停止您要升级的节点。删除容器时,不要删除与该容器关联的数据卷。新的 OpenSearch 容器将使用现有数据卷。删除数据卷将导致数据丢失。
- 通过查询
_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
不再列出,因为该容器已停止并删除。 - 部署一个运行所需 OpenSearch 版本的新容器,并将其映射到您删除的容器所用的同一数据卷。
- 在新节点上运行 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
- 重新启用分片复制
PUT "/_cluster/settings?pretty" { "persistent": { "cluster.routing.allocation.enable": "all" } }
响应应类似于以下示例
{ "acknowledged" : true, "persistent" : { "cluster" : { "routing" : { "allocation" : { "enable" : "all" } } } }, "transient" : { } }
- 确认集群健康
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 }
- 对集群中的每个节点重复步骤 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 -
- 升级现已完成,您可以开始享受最新的功能和修复!
滚动重启
滚动重启遵循与滚动升级相同的分步过程,但实际节点升级除外。在滚动重启期间,节点会一次重启一个——通常是为了应用配置更改、刷新证书或执行系统级维护——而不会中断集群可用性。
要执行滚动重启,请遵循滚动升级中概述的步骤,但排除涉及升级 OpenSearch 二进制文件或容器镜像的步骤
-
检查集群健康
确保集群状态为绿色且所有分片均已分配。
(滚动升级步骤 1) -
禁用分片分配
防止 OpenSearch 在节点离线时尝试重新分配分片。
(滚动升级步骤 2) -
刷新事务日志
将最近的操作提交到 Lucene 以减少恢复时间。
(滚动升级步骤 3) -
检查并确定要重启的下一个节点
确保您最后重启当前的集群管理器节点。
(滚动升级步骤 4) -
检查哪个节点是当前集群管理器
使用_cat/nodes
API 确定哪个节点是当前活跃的集群管理器。
(滚动升级步骤 5) -
停止节点
优雅地关闭节点。不要删除关联的数据卷。
(滚动升级步骤 6) -
确认节点已离开集群
使用_cat/nodes
验证它是否不再列出。
(滚动升级步骤 7) -
重启节点
启动同一节点(相同的二进制文件/版本/配置),让它重新加入集群。
(滚动升级步骤 8 — 不升级二进制文件) -
验证重启的节点已重新加入
检查_cat/nodes
以确认节点存在且健康。
(滚动升级步骤 9) -
重新启用分片分配
恢复完整的分片移动能力。
(滚动升级步骤 10) -
确认集群健康状态为绿色
在重启下一个节点之前验证稳定性。
(滚动升级步骤 11) -
对所有其他节点重复此过程
一次重启一个节点。如果某个节点有资格担任集群管理器角色,则最后重启它。
(滚动升级步骤 12 — 再次,没有升级步骤)
通过保留仲裁并按顺序重启节点,滚动重启可确保零停机时间和完整的数据连续性。