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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elastic:Elasticsearch 的分片管理策略

作者:刘晓国


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


将 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/


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
8天前
|
存储 索引
Elasticsearch分片和副本
【11月更文挑战第4天】
25 7
|
1月前
|
存储 缓存 监控
深入解析:Elasticsearch集群性能调优策略与最佳实践
【10月更文挑战第8天】Elasticsearch 是一个分布式的、基于 RESTful 风格的搜索和数据分析引擎,它能够快速地存储、搜索和分析大量数据。随着企业对实时数据处理需求的增长,Elasticsearch 被广泛应用于日志分析、全文搜索、安全信息和事件管理(SIEM)等领域。然而,为了确保 Elasticsearch 集群能够高效运行并满足业务需求,需要进行一系列的性能调优工作。
89 3
|
1月前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
52 4
|
3月前
|
存储 负载均衡 监控
Elasticsearch 集群分片
【8月更文挑战第24天】
85 12
|
5月前
|
索引 NoSQL 关系型数据库
【后端面经】【NoSQL】ElasticSearch - 1 -2 Translog + Elasticsearch索引与分片 + 面试准备
【6月更文挑战第15天】Elasticsearch利用Translog确保数据安全,类比MySQL的redo log,它在内存缓冲后记录Translog,每隔5秒持久化磁盘,提供高效且顺序的写入。尽管如此,仍可能最多丢失5秒数据。索引由分片组成,每个分片有主从结构,分布于不同节点以降低故障影响。当主分片失败,主节点会选择新主分片。面试中可讨论公司如何使用Elasticsearch、其性能、索引设计、可用性策略及解决过的挑战。常见问题涉及Elasticsearch的应用场景、问题解决及写入流程。
49 1
【后端面经】【NoSQL】ElasticSearch - 1 -2 Translog + Elasticsearch索引与分片 + 面试准备
|
5月前
|
存储 数据库 开发者
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
|
6月前
|
运维 架构师 搜索推荐
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
84 4
|
6月前
|
存储 缓存 搜索推荐
深入理解Elasticsearch倒排索引原理与优化策略
总之,Elasticsearch的倒排索引是其高效全文搜索的核心。为了提高性能和可伸缩性,Elasticsearch采用了多种优化策略,包括压缩、分片、合并、位集合和近实时搜索等。这些策略使Elasticsearch成为处理大规模文本数据的强大工具。
618 0
|
6月前
|
存储 SQL 运维
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
253 0
|
6月前
|
存储 安全 数据处理
Elastic 中国开发者大会2023最新干货——Elasticsearch 7、8 新功能一网打尽
Elastic 中国开发者大会2023最新干货——Elasticsearch 7、8 新功能一网打尽
69 0

相关产品

  • 检索分析服务 Elasticsearch版
  • 下一篇
    无影云桌面