【Elastic Engineering】Elastic:Elasticsearch 的分片管理策略

简介: Elastic:Elasticsearch 的分片管理策略

作者:刘晓国

在本教程中,我们介绍了一些与 Elasticsearchimage.png中的分片管理相关的常见问题,其解决方案以及一些最佳实践。 在某些用例中,我们结合了特殊的技巧来完成任务。


将 Shard 从一个节点移动到另一个节点


当处理任何大小的集群时,这是最常见的用例之一。 一个典型的场景是,如果在一个节点上共存了太多分片,它们将全部用于查询或索引。


这种情况表示节点/群集健康的潜在风险。 因此,将分片从一个节点移动到另一个节点是一个好习惯。 Elasticsearch 可能不会自动处理这种情况,这意味着我们需要手动进行干预。 如何做到这一点?


Elasticsearch 提供了一个集群级 API,该 API 允许将碎片从一个节点移动到另一个节点。 让我们在下面查看使用此 API 的示例:


重要的是要注意,在处理任何重新路由命令之后,Elasticsearch 将正常执行重新平衡(尊重诸如 cluster.routing.rebalance.enable 之类的设置的值),以便保持平衡状态。例如,如果请求的分配包括将分片从节点1移动到节点2,则这可能导致分片从节点2移动回到节点1来保持平衡。


可以使用 cluster.routing.allocation.enable 设置将集群设置为禁用分配。如果禁用了分配,则将执行的唯一分配是使用 reroute 命令指定的显式分配,以及由于重新平衡而导致的后续分配。


通过使用 ?dry_run URI 查询参数,或通过在请求正文中传递 “dry_run”: true,可以在 “dry run” 模式下运行重新路由命令。这将计算将命令应用于当前群集状态的结果,并在应用命令(和重新平衡)后返回结果群集状态,但实际上不会执行所请求的更改。


我们可以使用 reroute API 来实现把一个 shard 从一个节点移动到另外一个节点。下面是一个例子:

POST /_cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "test",
        "shard": 0,
        "from_node": "node1",
        "to_node": "node2"
      }
    },
    {
      "allocate_replica": {
        "index": "test",
        "shard": 1,
        "node": "node3"
      }
    }
  ]
}

在上面,我们强制把索引 test 的 shard 0 从node1 移到 node2。我们同时也强制分配索引 test 的 shard 1到node3中。


停用节点


另一个用例是从活动集群中停用节点。 这种情况下的主要挑战之一是在不导致群集停机或重启的情况下停用节点。 幸运的是,Elasticsearch 提供了一个选项,可以在不丢失数据或不会造成停机的情况下,优雅地删除/停用节点。 让我们看看如何实现它:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._ip": "IP of the node"
  }
}

上面的 API 使集群停止分配任何东西到指定节点并排除它。 同时,来自该节点的数据将被移植到非排除节点。 数据传输将在后台进行,完成后将导致从群集中完全删除该节点。


停用某个节点时,其他节点中可用的磁盘空间应大于要传输的数据大小。 否则,群集状态可能会变为红色或黄色,这可能会导致停机。


拥有其他选项来标识要停用的节点通常会很有帮助。 在上面的示例中,我们用节点的 “ip” 标识了该节点。 我们还可以使用集群中唯一的 “node ID” 和 “node name” 进行相同的操作。


按节点ID排除


PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._id": "unique id of the node"
  }
}


按名称排除节点


PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": "name of the node"
  }
}

我们如何查看节点的停用是否结束? 为此,我们有两个规定:


方法一


我们使用如下的方法:

GET _cluster/health?pretty

显示的结果是:

{
  "cluster_name" : "elasticsearch",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 26,
  "active_shards" : 26,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 19,
  "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" : 57.77777777777777
}

在上面 relocating_shards 显示的数值为0,表明目前没有 shard 被重新转移。


方法二


使用以下 API 检查的专有的节点的状态:

GET _cat/nodes?v

通过上面的 API 我们得到 node 的名字:

ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1           42          50   2    1.94                  dilm      *      liuxg-2.local

然后使用如下的 API:

GET _nodes/liuxg-2.local/stats/indices

在上面的  liuxg-2.local  为我们的 node 的名字。显示的结果为:

  "nodes" : {
    "Zs0Uy-9mTDOifm5Ef8U6FA" : {
      "timestamp" : 1581585326681,
      "name" : "liuxg-2.local",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "roles" : [
        "ingest",
        "master",
        "data",
        "ml"
      ],
      "attributes" : {
        "ml.machine_memory" : "34359738368",
        "xpack.installed" : "true",
        "ml.max_open_jobs" : "20"
      },
      "indices" : {
        "docs" : {
          "count" : 0,
          "deleted" : 8
        },
   ...

如果上述的 indices.docs.count 的值为 0,就表示转移已经完成。


重命名索引


另一个用例是重命名索引。 可以根据使用情况以多种方式完成此操作。


Aliasing


如果我们希望在不丢失任何数据的情况下重命名索引,则最常用的方法是别名。


例如,我们想将索引 “testindex” 重命名为 “testindex-1”。 我们可以为索引 “testindex” 提供别名 “testindex-1”,以便所有引用 “testindex-1” 的请求现在都将路由到 “testindex”。 可以按照以下步骤完成:

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "testindex",
        "alias": "testindex-1"
      }
    }
  ]
}

这种方法使我们可以在停机时间为零的情况下重命名索引。


Reindex API


有时,别名并不是重命名的最佳选择。 在这种情况下,我们剩下称为重新索引的选项。 它将所有文档从目标索引重新索引到目标索引。 为了有效地做到这一点,需要检查两件事:


机器上是否还有足够的空间。

目标索引是否存在正确的映射。

如果满足以上两个条件,我们可以使用如下所示的 reindex API:

POST _reindex
{
  "source": {
    "index": "testindex"
  },
  "dest": {
    "index": "testindex-1"
  }
}


有用链接:


1) In depth guide to running Elasticsearch in production: https://facinating.tech/2020/02/22/in-depth-guide-to-running-elasticsearch-in-production/


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
7月前
|
JavaScript API 开发工具
阿里云/本地部署OpenClaw 开发Skill插件指南:从入门到发布的全流程实操手册
OpenClaw的强大扩展性源于其开放的插件生态,2026年,插件市场已覆盖办公自动化、数据处理、多端交互等数千个场景,但个性化需求仍需自定义开发。无论是补充现有功能短板,还是实现特定业务流程自动化,插件开发都能让OpenClaw完全适配个人或团队的工作流。
1681 4
|
机器学习/深度学习 人工智能 编解码
AI人像特效之「一键生成N次元虚拟形象」
为了零成本低门槛地提供极致酷炫的人像玩法,我们提出了一套人像风格化通用框架「AI Maleonn」AI 版神笔马良,用于一键生成风格百变的人物虚拟形象,在风格上涵盖手绘、3D、日漫、艺术特效、铅笔画等多种风格,同时可以支持面向小样本的专属风格定制,利用少量目标风格图即可实现快速迁移拓展;在处理维度上,不仅适用于生成头部效果,更支持全图精细化纹理转换,兼容多人场景;在模型鲁棒性上,有效克服了多角度姿态、面部遮挡等各类复杂场景,整体稳定性大大提升。
|
7月前
|
人工智能 自然语言处理 前端开发
从需求到上线:AI生成网站的底层原理讲解
本文揭秘AI生成网站的底层逻辑:从需求语义解析、系统结构化建模,到前后端代码自动生成与一键部署,揭示其如何将一句话转化为可运行系统。核心在于提升抽象层级——从写代码转向表达需求。
|
弹性计算 前端开发 NoSQL
2025最新阿里云服务器配置选择攻略:CPU、内存、带宽与系统盘全解析
本文详解2025年阿里云服务器ECS配置选择策略,涵盖CPU、内存、带宽与系统盘推荐,助你根据业务需求精准选型,提升性能与性价比。
|
存储 机器学习/深度学习 安全
阿里云计算型实例解析:c7/c8y/c8i/c9i性能对比与场景化选型指南参考
在阿里云目前的活动中,属于计算型的热门云服务器实例规格主要有计算型c7、计算型c8y、计算型c8i和计算型c9i。这些实例规格既有七代和八代实例规格,也有最新推出的九代实例规格。本文将对这些实例规格进行详细对比,并提供场景化选型指南参考。
|
机器学习/深度学习 人工智能 搜索推荐
拔俗戒毒所青少年AI心理疏导系统:用技术叩开“心门”的科学路径
针对青少年戒毒心理疏导难题,我们研发AI心理陪伴系统,融合语音、微表情与生理信号多模态识别技术,精准捕捉情绪;通过大模型生成个性化干预策略,动态评估疏导效果,实现“数据驱动”的人机协同疏导新模式,助力迷途少年回归正轨。
634 0
|
运维 关系型数据库 数据库
应用官方 Docker 镜像已成熟,团队为何转向 Websoft9 而不再依赖 Bitnami
随着云原生发展,部署工具从 Bitnami 转向 Websoft9。后者基于官方镜像,提供多应用编排与统一运维,提升部署效率与维护能力,适合多系统协同场景。
应用官方 Docker 镜像已成熟,团队为何转向 Websoft9 而不再依赖 Bitnami
|
人工智能 监控 关系型数据库
阿里云开发者的共性痛点 ——「自建 GPT + 云服务」方案?
某工业客户在阿里云上构建AI故障分析系统时,遭遇云资源适配难、运维重、数据割裂三大瓶颈。试用「向量引擎」后,3行代码对接阿里云生态,冷启动50ms,自动适配CDN/负载均衡,请求延迟降60%;多可用区部署,RTO<30秒,稳定性达99.99%;直连OSS/RDS,实现GPT+私有数据闭环,延迟<1秒;支持等保三级与日志审计,数据零驻留,合规安全;联动阿里云计费,月成本直降70%。平台深度融入阿里云架构,让企业级AI应用一周落地,省时省力更省钱。
510 0
|
存储 缓存 算法
硬盘性能提升100倍的秘密:看懂顺序I/O的魔力
本文介绍了I/O缓存的核心原理与实现机制,涵盖局部性原理、Page Cache工作机制及其写回策略,以及顺序I/O的性能优势。通过理解时间与空间局部性如何提升缓存效率,Page Cache如何利用内存优化磁盘I/O,以及顺序I/O相比随机I/O在不同存储介质上的性能差异,帮助读者深入理解系统I/O优化的关键技术。
394 0

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版