使用 dmesg 来查看一些硬件或驱动程序的信息或问题。

elasticsearch 重启后数据平衡问题

Elasticsearch | 作者 juin | 发布于2018年09月29日 | 阅读数:10654

环境:elasticsearch 6.1
           Nodes: 4(master+data)
          Indices: 3352
          Memory: 51GB / 123GB
         Total Shards: 33379
         Documents: 1,456,904,986
         Data: 492GB
数据:除了xpack 监控索引有写入,其他索引全部没有写入,可以说是冷数据
 
场景:对某个节点的 searchguard 源码做了一些调整,替换它一个jar 包,然后重启该节点
 
重启之前操作:
#关闭集群分片自动分配

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "routing": {
        "allocation.enable": "none"
      }
    }
  }
}

#设置刷新时间
PUT */_settings
{
"refresh_interval": -1
}
然后替换了jar 包 重启了节点,
重启后操作:
#打开集群分片自动分配

PUT _cluster/settings
{
"persistent": {
"cluster": {
"routing": {
"allocation.enable": "all"
}
}
}
}



问题来了
按照正常来讲,我的数据并没有写入,在重启后绝大部分数据应该在该节点的磁盘中直接提取,但是现实是该节点重启后完全在其他节点拿数据,这个难道是因为在重启之前没有执行/_flush/synced????这是我的第一个问题
 
好,反正数据量不大,一两百个G的数据恢复起来应该也很快的,结果从上午9点开始到现在还没有恢复到一半

火星图片20180929145239.png

 
我在想是不是应该多给些资源,然后给了以下配置
#增加重新分配的最大负载

PUT /_cluster/settings
{
"persistent" : {
"indices.recovery.max_bytes_per_sec" : "600mb"
}
}

#允许在节点上发生多少并发传出分片恢复

PUT /_cluster/settings
{
"persistent" : {
"cluster": {
"routing": {
"allocation.cluster_concurrent_rebalance": 500
}
}
}
}


PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.node_concurrent_outgoing_recoveries": 500
}
}


PUT _cluster/settings
{
"transient": {
"cluster": {
"routing": {
"allocation.node_initial_primaries_recoveries": 18
}
}
}
}


以为会快些,其实一点影响也没有,还是很慢

aaasss.png



ccccccc.png


 
想问我是哪里搞错了吗
 
已邀请:

kennywu76 - Wood

赞同来自: juin

关闭结点前你更改的集群设置是关闭 rebalance,不知道是贴错了还是实际执行就是这样的。 如果只是关闭rebalance,重启结点后,failed掉的shard会立即开始在他结点之间开始复制,对恢复速度有些影响。
 
GET  /_cat/recovery?active_only=true 确认下高耗时的recovery是哪种类型,是否的确在拷贝文件,还是做translog recovery。
 
从你贴的监控图表看,集群状态监控数据有很多间歇性的断点,也就是说集群的结点状态数据经常获取超时, 比较怀疑master有大量的pending tasks在排队等待处理,可以用GET /_cat/pending_tasks 确认下。 
 
如果pending tasks很多,更改集群设置的操作有可能会超时没生效,所以GET一下集群的settings看更改是否生效。
 
还有6.1这个版本存在translog flush的一些bug,比如:
https://github.com/elastic/ela ... 28350
 
6.2.4以后的版本做了这个修复:
https://github.com/elastic/ela ... 29125
 
如果正在执行的恢复存在长时间的translog recovery,可以看下恢复的目标结点上是否大量的translog文件生成, 以防触发了上面的bug.
 
 
 
 

juin - 大数据开发

赞同来自:

https://elasticsearch.cn/article/38
 
找到wood 大叔写的一篇分享
核心是:
暂停数据写入程序
关闭集群shard allocation
手动执行POST /_flush/synced
重启结点
重新开启集群shard allocation 
等待recovery完成,集群health status变成green
重新开启数据写入程序
 
也是提到了_flush/synced手动synced flush,第一个问题的原因 应该就是这个了吧
...

zhangrui90 - z

赞同来自:

你这个是恢复不了,你看 shard activity 那里都是空白的

juin - 大数据开发

赞同来自:

vcz.png

这是集群设置
现在有个节点重启后无法加入集群,一直就是
2017-12-07T15:50:42,782][WARN ][o.e.n.Node               ] [es-node-209] timed out while waiting for initial discovery state - timeout: 30s
[2017-12-07T15:50:42,807][INFO ][o.e.h.n.Netty4HttpServerTransport] [[es-node-209] publish_address {x.x.x.x:9200}, bound_addresses {[::]:9200}
[2017-12-07T15:50:42,807][INFO ][o.e.n.Node ] [[es-node-209] started
[2017-12-07T15:51:15,953][INFO ][o.e.d.z.ZenDiscovery ] [[es-node-209] failed to send join request to master [{elastic-master-2}{3MYOSUphRnSa0dGIB8cjFQ}{lfaoDLVQSlKRZPUumEYclA}{x.x.x.x}{{x.x.x.x:9300}], reason [ElasticsearchTimeou
tException[java.util.concurrent.TimeoutException: Timeout waiting for task.]; nested: TimeoutException[Timeout waiting for task.]; ]
然后集群各节点都能收到加入集群的请求

nnnnn.png

 

要回复问题请先登录注册