`

控制Elasticsearch分片和副本的分配

阅读更多

ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。
 
    为了进行分片和副本的操作,ES需要确定将这些分片和副本放到集群节点的哪个位置,就是需要确定把每个分片和副本分配到哪台服务器/节点上。

一、显式控制分配


生产情景:

比如生产环境有三个索引分别为 man、woman、katoey
希望达到的效果:
       man索引放置在一些集群节点上   
       woman索引又单独放置到集群的另外一些集群节点上
       katoey索引希望放置在所有放置man索引和woman索引的集群节点上
       
这么做是因为katoey索引比其他两个索引小很多,因此我们可以将它和其他两个索引一起分配。
但是基于ES默认算法的处理方法,我们不能确定分片和副本的存放位置,但是ES允许我们对其做相应的控制!


1、指定节点的参数

epei1.png


    如上图所示,我们将ES集群划分为两个"空间"。当然你也可以叫做区域,随便命名。我们将左边的三台ES节点服务器放置到zone_one的空间上面,将右边的三台ES节点服务器放到zone_two的空间上。
 
配置
    为了做到我们需要的效果,我们需要将如下属性配置到左边三台ES集群节点服务器的elasticsearch.yml配置文件中

node.zone: zone_one

    将如下属性配置到右边的三台ES集群节点服务器elasticsearch.yml配置文件中

node.zone: zone_two


 
索引创建
    当所有节点配置文件属性配置完成后,我们就可以根据空间名称,我们就可以创建索引放到指定的空间。
    首先我们运行如下命令,来创建man索引:

# curl -XPOST "http://ESnode:9200/man'
# curl -XPUT "http://ESnode:9200/man/_settings' -d '{
   "index.routing.allocation.include.zone" : "zone_one"
   }'

    第一条命令是创建man索引;第二条命令是发送到_settings REST端点,用来指定这个索引的其他配置信息。我们将index.routing.allocation.include.zone属性设置为zone_one值,就是我们所希望的把man索引放置到node.zone属性值为zone_one的ES集群节点服务器上。
 
    同样对woman索引我们做类似操作:

# curl -XPOST "http://ESnode:9200/woman'
# curl -XPUT "http://ESnode:9200/woman/_settings' -d '{
   "index.routing.allocation.include.zone" : "zone_two"
   }'

    不同的是,这次指定woman索引放置在node.zone属性值为zone_two的ES集群节点服务器上
 
    最后我们需要将katoey索引放置到上面所有的ES集群节点上面,配置设置命令如下:

# curl -XPOST "http://ESnode:9200/katoey"
# curl -XPUT "http://ESnode:9200/katoey/_settings" -d '{
  "index.routing.allocation.include.zone" : "zone_one,zone_two"
  }'

2、分配时排除节点
    跟我们上面操作为索引指定放置节点位置一样,我们也可以在索引分配的时候排除某些节点。参照之前的例子,我们新建一个people索引,但是不希望people索引放置到zone_one的ES集群节点服务器上,我们可以运行如下命令操作:

# curl -XPOST "http://EScode:9200/people"
# curl -XPUT "http://EScode:9200/people/_settings" -d '{
  "index.routing.allocation.exclude.zone" : "zone_one"
  }'

    请注意,在这里我们使用的是index.routing.allocation.exclude.zone属性而不是index.routing.allocation.include.zone属性。
 
使用IP地址进行分配配置
    除了在节点的配置中添加一些特殊的属性参数外,我们还可以使用IP地址来指定你将分片和副本分配或者不分配到哪些节点上面。为了做到这点,我们应该使用_ip属性,把zone换成_ip就好了。例如我们希望lucky索引分配到IP地址为10.0.1.110和10.0.1.119的节点上,我们可以运行如下命令设置:

# curl -XPOST "http://ESnode:9200/lucky"
# curl -XPUT "http://ESnode:9200/lucky/_settings" -d '{
  "index.routing.allocation.include._ip" "10.0.1.110,10.0.1.119"
  }'

 

二、集群范围内分配


    除了索引层面指定分配活着排除分配之外(上面我们所做的都是这两种情况),我们还可以指定集群中所有索引的分配。例如,我们希望将所有的新索引分配到IP地址为10.0.1.112和10.0.1.114的节点上,我们可以运行如下命令设置:

# curl -XPUT "http://ESnode:9200/_cluster/settings" -d '{
  "transient" : {
   "cluster.routing.allocation.include._ip" "10.0.1.112,10.0.1.114"
   }
  }'

    集群级别的控制后续还会分享transient和persistent属性介绍

三、每个节点上分片和副本数量的控制


    除了指定分片和副本的分配,我们还可以对一个索引指定每个节点上的最大分片数量。例如我们希望ops索引在每个节点上只有一个分片,我们可以运行如下命令:

# curl -XPUT "http://ESnode:9200/ops/_settings" -d '{
  "index.routing.allocation.total_shards_per_node" : 1
  }'

    这个属性也可以直接配置到elasticsearch.ym配置文件中,或者使用上面命令在活动索引上更新。如果配置不当,导致主分片无法分配的话,集群就会处于red状态。

四、手动移动分片和副本


    接下来我们介绍一下节点间手动移动分片和副本。可以使用ElasticSearch提供的_cluster/reroute REST端点进行控制,能够进行下面操作:

  • 将一个分片从一个节点移动到另外一个节点
  • 取消对分片的分配
  • 强制对分片进行分配

 
移动分片
    假设我们有两个节点:es_node_one和es_node_two,ElasticSearch在es_node_one节点上分配了ops索引的两个分片,我们现在希望将第二个分片移动到es_node_two节点上。可以如下操作实现:

# curl -XPOST "http://ESnode:9200/_cluster/reroute' -d  '{
   "commands" : [ {
   "move" : {
   "index" : "ops",
   "shard" : 1,
   "from_node" : "es_node_one",
   "to_node" : "es_node_two"
   }
  }]
  }'

    我们通过move命令的index属性指定移动哪个索引,通过shard属性指定移动哪个分片,最终通过from_node属性指定我们从哪个节点上移动分片,通过to_node属性指定我们希望将分片移动到哪个节点。
 
取消分配
    如果希望取消一个正在进行的分配过程,我们通过运行cancel命令来指定我们希望取消分配的索引、节点以及分片,如下所示:

# curl -XPOST "http://ESnode:9200/_cluster/reroute" -d '{
  "commands" : [ {
  "cancel" : {
  "index" : "ops",
  "shard" : 0,
  "node" : "es_node_one"
  }
  } ]
  }'

    运行上面的命令将会取消es_node_one节上ops索引的第0个分片的分配
 
分配分片
    除了取消和移动分片和副本之外,我们还可以将一个未分配的分片分配到一个指定的节点上。假设ops索引上有一个编号为0的分片尚未分配,并且我们希望ElasticSearch将其分配到es_node_two上,可以运行如下命令操作:

# curl -XPOST "http://ESnode:9200/_cluster/reroute' -d '{
  "commands" : [ {
   "allocate" : {
    "index" : "ops",
    "shard" : 0,
    "node" : "es_node_two"
    }
   } ]
   }'

一次HTTP请求包含多个命令
    我们可以在一次HTTP请求中包含多个命令,例如:

# curl -XPOST "http://ESnode:9200/_cluster/reroute" -d '{
   "commands" : [
     {"move" : {"index" : "ops", "shard" : 1, "from_node" : "es_node_one", "to_node" : "es_node_two"}},
     {"cancel" : {"index" : "ops", "shard" : 0, "node" : "es_node_one"}}
    ]
 }'

 

分享到:
评论

相关推荐

    掌控数据洪流:深度解析 Elasticsearch 分片管理

    - `cluster.routing.allocation.same_shard.host`:控制是否允许同一个分片的主分片和副本分片位于同一个主机上。 ##### 分片热迁移 随着数据量的增长,可能需要将分片从一个节点迁移到另一个节点。Elasticsearch...

    elasticsearch-6.6.0 - 副本.rar

    1. **分布式架构**:Elasticsearch是基于分布式架构设计的,这意味着它可以跨多个节点进行数据分片和复制,提供高可用性和容错性。在Windows系统上部署Elasticsearch,你需要配置集群设置,如节点名称、集群名称等,...

    掌控数据流:如何管理 Elasticsearch 的副本

    在 Elasticsearch 中,数据被分割成多个分片,每个分片又可以拥有一个或多个副本。这种设计确保即使某个节点出现故障,数据依然可以保持高可用性,并且通过并行处理查询请求来提高搜索性能。 - **主分片**:原始...

    ElasticSearch集群搭建.doc

    2. **分片分配策略**:Elasticsearch会根据节点的负载和分片的大小自动进行分片的分配。可以通过`index.routing.allocation.total_shards_per_node`配置限制单个节点上的分片数量。 3. **故障恢复**:如果某个节点...

    elasticsearch-7.10.2.zip

    1. **分片与副本**:Elasticsearch将数据分布在多个节点上,每个节点可以包含多个分片。分片是数据的物理存储单位,而副本则用于提高容错性和读取性能。在7.10.2版本中,分片管理和副本复制更加智能化,确保数据安全...

    ElasticSearch合理分配索引分片原理

    为了提高ElasticSearch的性能,我们需要合理地分配索引和分片。同时,需要注意避免使用非常大的分片,合理地配置主分片和副本的数量,并根据需要调整分片的大小和数量。此外,我们还需要注意管理堆的使用,尽可能...

    Elasticsearch 8.1.2 Linux版本

    5. **分片(Shard)**:为了分散存储和提高查询效率,Elasticsearch将索引分成多个分片。分片可以在不同节点上,使得数据分布更均匀。 6. **副本(Replica)**:每个分片的副本用于提高数据可用性和容错性,当主分片...

    Elasticsearch总结.doc

    2. **主分片和复制分片**:主分片是数据的原始副本,复制分片是主分片的备份,用于提高可用性和容错性。 3. **扩容**:增加节点以扩大集群容量,分片会自动重新分布。 4. **集群容灾**:通过设置复制分片和合理的...

    elasticsearch-7.14.2-windows-x86_64.zip

    7. **副本(Replica)**:每个分片都可以有副本,用于提高数据冗余和故障恢复。 **Elasticsearch 7.14.2 版本特点:** 1. **性能优化**:此版本通常会包含对查询速度、索引速度和内存管理的改进。 2. **安全增强**...

    ElasticSearch权威指南中文版

    分片有主分片和副本分片两种。 7. **副本分片(Replica Shard)**:为了提供冗余和故障恢复,每个主分片可以有多个副本。当主分片出现问题时,副本分片可以接管其职责。 **二、Elasticsearch的主要功能** 1. **...

    Apache Hadoop---Elasticsearch.docx

    当每个主分片及其副本分片都被分配到不同的节点上时,集群状态为绿色,表示数据完整且系统运行正常。如果副本分片未被分配,集群可能会显示黄色,表示存在数据丢失风险。如果主分片未被分配,集群将显示红色,表示...

    CentOS7下Elasticsearch高可用集群方案-完整部署记录(个人珍藏版)

    4. **分片与副本**:Elasticsearch将数据分割为多个分片,每个分片可以有零个或多个副本。设置合理的分片和副本数量以平衡数据分布和容错能力。默认情况下,每个索引有5个主分片和1个副本,可以根据数据量和预期负载...

    最完整的Elasticsearch 基础教程

    - Replicas:每个分片可以有副本,确保高可用性,当主分片出现问题时,副本分片可以接管。 3. **安装与配置** - 下载并解压Elasticsearch,根据系统环境配置相关参数,如内存分配、网络设置等。 - 启动服务,...

    ElasticSearch----Elasticsearch服务器开发2.0.zip

    Elasticsearch基于分片(Shards)和副本(Replicas)的分布式架构,使其能轻松处理大规模数据。分片是数据的物理存储单位,而副本则是为了提高数据可用性和容错性。通过合理配置分片和副本数量,可以实现水平扩展,...

    elasticsearch-6.7.0.zip

    1. **分布式架构**:Elasticsearch通过分片和副本机制实现了分布式存储,可以轻松扩展到多台服务器,提供高可用性和容错性。每个文档会被分配到多个分片,副本分片则用于备份,当主分片出现问题时,副本分片可以接管...

    Elasticsearch权威指南(中文).pdf

    5. **Shard路由**:合理分配数据和查询请求,避免热点分片。 **六、监控与运维** 1. **健康检查**:通过`/_cluster/health`接口查看集群状态。 2. **指标监控**:监控CPU、内存、磁盘、网络等系统资源。 3. **日志...

    【中华石杉】Elasticsearch顶尖高手系列-核心知识篇 + 高手进阶篇all

    1. **数据存储与索引**:Elasticsearch以分布式的方式存储数据,通过分片(Shard)和副本(Replica)机制确保数据的高可用性和可扩展性。每个文档都会被分配到一个主分片和零个或多个副本分片,以实现数据冗余和故障...

    最新版windows elasticsearch-8.1.1-windows-x86_64.zip

    - 为提高性能,建议配置足够大的堆内存,并合理分配分片和副本数量。 - 定期执行索引重建和优化,以更新分析器设置并整理碎片。 - 监控磁盘空间,避免空间不足导致的问题。 - 使用HTTPS进行通信,确保数据传输的...

    Elasticsearch集成Hadoop最佳实践

    - **分片与副本**: 分片是 Elasticsearch 数据分布的基础,副本则提供了容错和负载均衡。根据集群规模和预期流量合理设置分片和副本数量。 - **倒排索引优化**: 考虑到查询性能,对高频率查询的字段使用更高效的倒...

    集群的力量:深入理解 Elasticsearch 的集群机制

    Elasticsearch 通过副本机制和分片重新分配机制来提供容错性。即使某些节点发生故障,集群仍然能够继续提供服务,确保数据的完整性。 ##### 5.1 设置副本分片数量 可以通过索引设置来指定每个索引的副本分片数量,...

Global site tag (gtag.js) - Google Analytics