Elasticsearch:shard 分配感知

您可以将自定义节点属性用作感知属性,以使Elasticsearch在分配分片时考虑物理硬件配置。 如果Elasticsearch知道哪些节点在同一台物理服务器上,在同一机架中或在同一区域中,则它可以分发主分片及其副本分片,以最大程度地减少发生故障时丢失所有分片副本的风险。

通过cluster.routing.allocation.awareness.attributes设置启用分片分配感知后,分片仅分配给已为指定感知属性设置值的节点。 如果您使用多个感知属性,那么Elasticsearch在分配分片时会分别考虑每个属性。

可以在elasticsearch.yml中配置分配感知设置,并使用cluster-update-settings API动态更新。

默认情况下,Elasticsearch使用adaptive replica selection来路由搜索或GET请求。 但是,由于存在分配感知属性,Elasticsearch将更喜欢在相同位置(具有相同的感知属性值)使用分片来处理这些请求。 可以通过在群集的每个节点上指定export ES_JAVA_OPTS =“ $ ES_JAVA_OPTS -Des.search.ignore_awareness_attributes = true”系统属性来禁用此行为。

 

不均衡的 shard 分布

假设您的硬件分布于两个不同的物理机架中:

 

在上面我们可以看到:我们的my_index的shard分布于两个不同的物理机架中rack1及rack2。在上面我们可以看出来P0及R0分布于rack1中,而P1和R1分布于rack2中。假如有一种情况我们的rack1或者rack2由于某种事故从而导致它们其中的一个不可用,那么我们的my_index将导致不可用。这是因为分片0或分片1将不存在。

 

为了避免这种情况我们可以让我们的Elasticsearch知道我们的硬件的物理分配。这个在Elasticsearch中称之为shard allocation awareness。这种解决方案非常实用于当我们的Elasticsearch的多个node分享同样的资源:disk,host mache,netowork switch,rack等。

我们可以通过下面的两个步骤来进行配置:

  1. 对我们的node打上标签
  2. 更新我们的cluster配置

Step1:对node打上标签

我们可以使用node.attr来对我们的node进行打上标签。

  • node的属性可以是你任何喜欢的名字及值
  • 你也可以在命令行中使用-E命令行参数来定义,比如
    ./bin/elasticsearch -Enode.attr.rack_id=rack1
  • 或者直接在elasticsearch.yml中来定义

Step2: 对cluster进行配置

我们必须告诉Elasticsearch我们使用哪个属性或哪些属性用于我们的Shard allocation awareness。我们可以通过使用cluster.routing.allocation.awareness这个cluster级的配置来告诉我们的Elasticsearch:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.awareness.attributes": "my_rack_id"
  }
}

均衡的 Shard 分布

经过上面的step1及step2的配置后,现在,您可以确保所有分片至少有一个副本将存在于每个索引的每个机架中。

如果在rack1或rack2其中的一个rack在损坏的情况下,我们可以确保我们的数据访问是不间断的。当然如果两个机架同时都被损坏,那么我们也无能为力了。

 

参考:

【1】 https://www.elastic.co/guide/en/elasticsearch/reference/current/allocation-awareness.html

 

展开阅读全文
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值