无论才能、知识多么卓著,如果缺乏热情,则无异纸上画饼充饥,无补于事。

ES6.3.2 五节点集群想新增一台机器作冷节点数据备份,担心分片迁移问题,求教?

Elasticsearch | 作者 hapjin | 发布于2019年08月05日 | 阅读数:3433

基本情况:
ES6.3.2版本,5台机器,将2台机器 在elasticsearch.ym 配置node.master=false,仅仅作为数据节点,另外3台既可以选举成master节点,上面也存储着数据。
集群目前有:60多个索引,300多个分片,一切运行良好。为了防止节点临时故障导致创建新的副本分片,将delayed-allocation设置成2小时,索引模板中settings 配置信息如下:
  "settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "1",
"unassigned": {
"node_left": {
"delayed_timeout": "2h"
}
}
}
}
其他都是索引默认的配置了。
 
根据业务需求,其中某些索引只需要搜索最近3个月的数据,采用了索引模板按月生成索引。3个月之前的索引想迁移到一台冷节点上去。参考这篇官方文档hot-warm-architecture进行迁移。
 
我的问题是:由于新增冷节点到集群中(机械硬盘、配置较差),担心其他"正常"索引的分片会不会rebalance到冷节点上去了?因为我只想把 某些"历史"索引迁移到冷节点上,比如下面这个索引:location-201905。而06、07、08它们都是"热数据",不需要迁移。

location.jpg

 
看网上介绍说:
cluster.routing.allocation.disable_allocation参数设置为true,禁止es进行自动索引分片分配
但是我在ES6.3.2版本的官方文档中一直没找到关于 disable_allocation 这个参数的介绍,而是找到这个链接:https://www.elastic.co/guide/e ... .html
它提到了2个参数:cluster.routing.allocation.enable 和 cluster.routing.rebalance.enable
1,是不是把 cluster.routing.rebalance.enable设置成 none, 那么我往现有ES集群新增一台机器,已有的索引(不是新创建的索引)就不会发生 rebalance 导致的分片迁移了?
none参数的解释:No shard balancing of any kind are allowed for any indices.
 
2,cluster.routing.allocation.enable 参数设置成 none,是如何影响以后新建的新索引的分片分配?是不是新创建的索引都不会给它生成分片了?那在何种情况下,设置cluster.routing.allocation.enable=true呢?
 
PS,冷节点 和 热节点 放在同一个集群中,这种方式是合理的吧,而不是分成2个集群(一个集群专门存热数据,另一个集群存冷数据)因为,不太了解分成2个集群后,如何管理2个集群之间的数据同步问题。
已邀请:

bean

赞同来自: hapjin

提下我的思路,仅供参考:
  1. 第一步:关闭集群的重平衡,cluster.routing.allocation.cluster_concurrent_rebalance:0,可参考官方文档https://www.elastic.co/guide/e ... .html。此步骤是为了禁止因为集群新加入一台数据节点而产生的集群间分片平衡。 
  2. 第二步:新加入集群的机器(做冷节点用),打上cold的tag。一种方式是启动进程时打tag, ./bin/elasticsearch -Enode.attr.type=cold;另一种是在配置文件中修改,具体方式可查询官方文档。 
  3. 第三步:所有新写入的索引,都需要在setting中加上"index.routing.allocation.exclude.type": "cold";此时,新写入的索引都无法分配在新加入的cold冷节点上。参数含义可查询官方文档。
  4. 第四步:使用curator工具,定时将”冷数据“迁移到冷节点上。

 
问题:题主是要新增一台机器做冷节点,但索引一般都会有1副本,只有一个冷节点的话。”冷索引“要如何分配?主副分片是不能分配到同一个节点上的。

hapjin

赞同来自:

简单的描述就是:一个ElasticSearch集群中有冷数据、也有热数据。只想把冷数据放到冷节点上(冷节点配置低、是机械硬盘),但是把冷节点加入到集群中,由于ES会自动 rebalance,也会把热数据 rebalance 到冷节点上去。
 
解决方法是 禁用ES的Rebalance功能?然后以后创建新的索引时,靠手工指定新索引的分片分配到哪些节点上去?
 

hapjin

赞同来自:

感谢你提供的这个思路,我大概也是这样操作的。
1,我是先设置了 cluster.routing.rebalance.enable为none,禁用分片迁移。
PUT _cluster/settings
{
"transient": {
"cluster.routing.rebalance.enable":"none"
}
}
当时没注意到这个参数:cluster.routing.allocation.cluster_concurrent_rebalance。看了下解释:


Note that this setting only controls the number of concurrent shard relocations due to imbalances in the cluster. This setting does not limit shard relocations due to allocation filtering or forced awareness.


通过指定 node.attr.type=cold 应该就是"使用 awareness 这个功能"。enabling-awareness
使用cluster.routing.rebalance.enable=none,应该过于 "严格了",假设有:2台cold节点,5台hot节点:
如果5台hot节点其中有一台宕机了,那么 "cluster.routing.rebalance.enable":"none"会不会 导致宕机了的那台节点上的分片不会自动rebalance到其他正常的四台hot节点上去,这个后面可验证一下。不然,就不知道这2个参数的实际区别是什么?
 
2,是的。我是参考hot-warm-architecture-in-elasticsearch-5-x打的tag。
esyml.png

 
3,这个应该可以用索引模板来解决吧。我当时想的是一部分机器elasticsearch.yml配置成node.attr.box_type: hot,将冷节点配置文件配置成:node.attr.box_type: warm。然后定义一个通用的索引模板,保证新创建的索引的分片都分配到 hot 节点上。比如这样:
PUT /_template/common_template
{
PUT /_template/common_template
{
  "template": "*",
  "order": 0,
  "version": 0,
  "settings": {
    "index": {
      "routing": {
        "allocation": {
          "require": {
            "box_type": "hot"
          }
        }
      }
    }
  }
}

 
关于你的问题,感谢提醒,是我描述得有问题。主要是想在集群中区分冷节点和热节点,合理的冷节点的个数应该是要大于1的。
 
 
 

要回复问题请先登录注册