什么是recovery?

在elasticsearch中,recovery指的是一个索引的分片分配到另外一个节点的过程,一般在快照恢复、索引复制分片的变更、节点故障或重启时发生,由于master节点保存整个集群相关的状态信息,因此可以判断哪些分片需要再分配及分配到哪个节点,例如:

  • 如果某个主分片在,而复制分片所在的节点挂掉了,那么master需要另行选择一个可用节点,将这个主分片的复制分片分配到可用节点上,然后进行主从分片的数据复制。
  • 如果某个主分片所在的节点挂掉了,复制分片还在,那么master会主导将复制分片升级为主分片,然后再做主从分片数据复制。
  • 如果某个分片的主副分片都挂掉了,则暂时无法恢复,而是要等持有相关数据的节点重新加入集群后,master才能主持数据恢复相关操作。

但是,recovery过程要消耗额外的资源,CPU、内存、节点间的网络带宽等。可能导致集群的服务性能下降,甚至部分功能暂时无法使用,所以,有必要了解在recovery的过程和其相关的配置,来减少不必要的消耗和问题。

减少集群full restart造成的数据来回拷贝

有时候,可能会遇到es集群整体重启的情况,比如硬件升级、不可抗力的意外等,那么再次重启集群会带来一个问题:某些节点优先起来,并优先选举出了主节点,有了主节点,该主节点会立刻主持recovery的过程。

但此时,这个集群数据还不完整(还有其他的节点没有起来),例如A节点的主分片对应的复制分片所在的B节点还没起来,但主节点会将A节点的几个没有复制分片的主分片重新拷贝到可用的C节点上。而当B节点成功起来了,自检时发现在自己节点存储的A节点主分片对应的复制分片已经在C节点上出现了,就会直接删除自己节点中“失效”的数据(A节点的那几个复制分片),这种情况很可能频繁出现在有多个节点的集群中。

而当整个集群恢复后,其各个节点的数据分布,显然是不均衡的(先启动的节点把数据恢复了,后起来的节点内删除了无效的数据),这时,master就会触发Rebalance的过程,将数据在各个节点之间挪动,这个过程又消耗了大量的网络流量。所以,我们需要合理的设置recovery相关参数来优化recovery过程。

  • 在集群启动过程中,一旦有了多少个节点成功启动,就执行recovery过程,这个命令将master节点(有master资格的节点)和data节点都算在内。

gateway.expected_nodes: 3

  • 有几个master节点启动成功,就执行recovery的过程。

gateway.expected_master_nodes: 3

  • 有几个data节点启动成功,就执行recovery的过程。

gateway.expected_data_nodes: 3

当集群在期待的节点数条件满足之前,recovery过程会等待gateway.recover_after_time指定的时间,一旦等待超时,则会根据以下条件判断是否执行recovery的过程:

gateway.recover_after_nodes: 3    # 3个节点(master和data节点都算)启动成功
gateway.recover_after_master_nodes: 3  # 3个有master资格的节点启动成功
gateway.recover_after_data_nodes: 3   # 3个有data资格的节点启动成功

上面三个配置满足一个就会执行recovery的过程。
如果有以下配置的集群:

gateway.expected_data_nodes: 10
gateway.recover_after_time: 5m
gateway.recover_after_data_nodes: 8

此时的集群在5分钟内,有10个data节点都加入集群,或者5分钟后有8个以上的data节点加入集群,都会启动recovery的过程。

减少主副本之间的数据复制

如果不是full restart,而是重启单个节点,也会造成不同节点之间来复制,为了避免这个问题,可以在重启之前,关闭集群的shard allocation

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

当节点重启后,再重新打开:

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

这样,节点重启后,尽可能的从本节点直接恢复数据。但是在es1.6版本之前,既使做了以上措施,仍然会出现大量主副分片之间的数据拷贝,从面上看,这点让人很不理解,主副分片数据是完全一致的,在节点重启后,直接从本节点的副本重恢复数据就好了呀,为什么还要再从主分片再复制一遍呢?原因是在于recovery是简单的对比主副分片的segment file(分段文件)来判断哪些数据一致是可以本地恢复,哪些不一致的需要重新拷贝的。而不同节点的segment file是完全独立运行的,这可能导致主副本merge的深度不完全一致,从而造成及时文档集完全一样,而产生的segment file却不完全一样。

为了解决这个问题,在es1.6版本之后,加入了synced flush(同步刷新)新特性,对于5分钟没有更新过的shard,会自动synced flush一下,其实就是为对应的shard加入一个synced flush id,这样在节点重启后,先对比主副shard的synced flush id,就可以知道两个shard是否完全相同,避免了不必要的segment file拷贝。

需要注意的是synced flush只对冷索引有效,对于热索引(5分钟内有更新的索引)无效,如果重启的节点包含有热索引,那还是免不了大量的拷贝。如果要重启一个包含大量热索引的节点,可以按照以下步骤执行重启过程,可以让recovery过程瞬间完成:

  • 暂停数据写入
  • 关闭集群的shard allocation
  • 手动执行 POST /_flush/synced
  • 重启节点
  • 重新开启集群的shard allocation
  • 等待recovery完成,当集群的health status是green后
  • 重新开启数据写入

特大热索引为何恢复慢

对于冷索引,由于数据不再更新(对于elasticsearch来说,5分钟,很久了),利用synced flush可以快速的从本地恢复数据,而对于热索引,特别是shard很大的热索引,除了synced flush派不上用场,从而需要大量跨节点拷贝segment file以外,translog recovery可能是导致慢的更重要的原因。

我们来研究下这个translog recovery是什么鬼!
当节点重启后,从主分片恢复数据到复制分片需要经历3个阶段:

  • 第一阶段,对于主分片上的segment file做一个快照,然后拷贝到复制分片所在的节点,在数据拷贝期间,不会阻塞索引请求,新增的索引操作会记录到translog中(理解为于临时文件)。
  • 第二阶段,对于translog做一个快照,此快照包含第一阶段新增的索引请求,然后重放快照里的索引操作,这个阶段仍然不会阻塞索引请求,新增索引操作记录到translog中。
  • 第三阶段,为了能达到主副分片完全同步,阻塞新索引请求,然后重放上一阶段新增的translog操作。

由此可见,在recovery过程完成之前,translog是不能被清除掉的。如果shard比较大,第一阶段会耗时很长,会导致此阶段产生的translog很大,重放translog要比简单的文件拷贝耗时更长,因此第二阶段的translog耗时也显著的增加了。等到了第三阶段,需要重放的translog可能会比第二阶段更多。要命的是,第三阶段是会阻塞新索引(写入)请求的,在对写入实时性要求很高的场合,这就会导致性能下降,非常影响用户体验。因此,要加快特大热索引恢复速度,最好是参照上一节中的方式:

  • 暂停数据写入。
  • 手动synced flush。
  • 等待数据恢复完成后。
  • 重新恢复数据写入。

这样就会把数据延迟影响降到最低。

elasticsearch之Recovery相关推荐

  1. 【Elasticsearch】 elasticsearch之Recovery 手动触发索引滚动

    文章目录 1.概述 2.自动滚动测试 3.手动滚动测试 4.结束老索引的生命周期 1.概述 es相关介绍参考Recovery [Elasticsearch] elasticsearch之Recover ...

  2. 【Elasticsearch】 elasticsearch之Recovery

    1.概述 原文:https://www.cnblogs.com/Neeo/articles/10843759.html 参考:https://elasticsearch.cn/article/38 2 ...

  3. Elasticsearch 6.6 官方文档 之「集群」

    文章目录 集群 集群等级分片分配 分片分配设置 分片重新平衡设置 分片平衡探索 基于磁盘的分片分配 分片分配意识 强制感知 分片分配过滤 其他群集设置 元数据 集群分片限制 用户定义的群集元数据 索引 ...

  4. 为什么蚂蚁金服的 ZSearch 比 ElasticSearh 还牛逼?

    点击"开发者技术前线",选择"星标????" 13:21 在看|星标|留言,  真爱 作者介绍 吕梁(花名:十倍),2017年加入蚂蚁金服数据中间件,通用搜索平 ...

  5. 蚂蚁金服 ZSearch 在向量检索上的探索

    图为 ZSearch 基础架构负责人十倍 2019 Elastic Dev Day 现场分享 引言 ElasticSearch(简称 ES)是一个非常受欢迎的分布式全文检索系统,常用于数据分析,搜索, ...

  6. Elasticsearch断电后启动异常(failed recovery, failure RecoveryFailedException)

    断电遇到的elasticsearch6.3问题:重启es集群后索引的部分分片无法正常加载(UNASSIGNED状态). https://github.com/memoryFuhao/elasticse ...

  7. ElasticSearch安装使用 操作索引

    文章目录 1.下载并安装 2.了解es的配置文件**elasticsearch-.yml**(中文配置详解) 3.使用head插件 1.使用谷歌浏览器head插件 2.使用压缩中的head程序 4.使 ...

  8. elasticsearch分布式搜索配置文件详解

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务.它是基于Apache Lucene搜索引擎的类库创 ...

  9. Elasticsearch高并发写入优化的开源协同经历

    导语:在腾讯金融科技数据应用部的全民 BI 项目里,我们每天面对超过 10 亿级的数据写入,提高 ES 写入性能迫在眉睫,在最近的一次优化中,有幸参与到了 Elasticsearch 开源社区中. 本 ...

最新文章

  1. iOS runtime实用篇:让你快速上手一个项目
  2. 2021春季学期-创新设计与实践-Lesson3
  3. ButterKnife--View注入框架
  4. [导入]WAP网站的网关服务器应用形式
  5. jQuery 遍历 - slice() 方法
  6. es算法matlab编程,matlab练习程序(演化策略ES)
  7. 大数据服务社会的一个有益实践
  8. 计算机整个文稿应用回顾主题,《计算机应用基础》精品课程电子教案-PowerPoint 2003...
  9. 2345电脑管家_2345软件管家下载|2345软件管家 2.0 官方正式版
  10. 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)
  11. 1040 最大公约数之和
  12. 又延伸到socket去了。
  13. 论文阅读(4) 游泳水母对被动能量再捕获的广泛利用(2018)
  14. 网站做渗透测试服务的步骤
  15. Nature子刊:大脑在局部区域的结构-功能耦合的遗传度与个体差异
  16. Android线上轻量级APM性能监测方案
  17. 用Photoshop将照片卡通化
  18. IAR下载程序只有提示音,没有任何反应。或报错The configuration does not have debuggable output.(A debug-only project shoul
  19. 写 Python 爬虫的助手
  20. 黑马Vue.Js项目实战(完整)

热门文章

  1. 在服务器上使用第三方独立组件对Word/Excel进行编程
  2. Django 多数据库联用(看着不错还有源码可以下载)
  3. 解决python调用TensorFlow时出现FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecate
  4. 如何配置一套优雅的Lua开发环境
  5. PHP导入Excel和导出Excel
  6. linux输出mac,Linux(Mac)命令ll输出后各个字段的含义
  7. python语句x 3 3执行_Python 3.x 学习笔记--杂
  8. linux ssh 推送文件_WinSCP软件双系统(Win-Linux)文件传输教程
  9. springboot配置热部署
  10. 【若依(ruoyi)】部门查询SQL