我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Elasticsearch Recovery索引分片分配的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Elasticsearch Recovery索引分片分配的方法

本篇内容主要讲解“Elasticsearch Recovery索引分片分配的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Elasticsearch Recovery索引分片分配的方法”吧!

基础知识点

在Eleasticsearch中recovery指的就是一个索引的分片分配到另外一个节点的过程;一般在快照恢复、索引副本数变更、节点故障、节点重启时发生。由于master保存整个集群的状态信息,因此可以判断出哪些shard需要做再分配,以及分配到哪个结点,例如:

如果某个shard主分片在,副分片所在结点挂了,那么选择另外一个可用结点,将副分片分配(allocate)上去,然后进行主从分片的复制。

如果某个shard的主分片所在结点挂了,副分片还在,那么将副分片升级为主分片,然后做主从分片复制。

如果某个shard的主副分片所在结点都挂了,则暂时无法恢复,等待持有相关数据的结点重新加入集群后,从该结点上恢复主分片,再选择另外的结点复制副分片。  

正常情况下,我们可以通过ES的health的API接口,查看整个集群的健康状态和整个集群数据的完整性:

Elasticsearch Recovery索引分片分配的方法

状态及含义如下:

green: 所有的shard主副分片都是正常的;

yellow: 所有shard的主分片都完好,部分副分片没有或者不完整,数据完整性依然完好;

red: 某些shard的主副分片都没有了,对应的索引数据不完整。  

recovery过程要消耗额外的资源,CPU、内存、结点之间的网络带宽等等。 这些额外的资源消耗,有可能会导致集群的服务性能下降,或者一部分功能暂时不可用。了解一些recovery的过程和相关的配置参数,对于减小recovery带来的资源消耗,加快集群恢复过程都是很有帮助的。

减少集群Full Restart造成的数据来回拷贝

ES集群可能会有整体重启的情况,比如需要升级硬件、升级操作系统或者升级ES大版本。重启所有结点可能带来的一个问题: 某些结点可能先于其他结点加入集群, 先加入集群的结点可能已经可以选举好master,并立即启动了recovery的过程,由于这个时候整个集群数据还不完整,master会指示一些结点之间相互开始复制数据。 那些晚到的结点,一旦发现本地的数据已经被复制到其他结点,则直接删除掉本地“失效”的数据。 当整个集群恢复完毕后,数据分布不均衡,显然是不均衡的,master会触发rebalance过程,将数据在节点之间挪动。整个过程无谓消耗了大量的网络流量;合理设置recovery相关参数则可以防范这种问题的发生。

gateway.expected_nodesgateway.expected_master_nodesgateway.expected_data_nodes

以上三个参数是说集群里一旦有多少个节点就立即开始recovery过程。 不同之处在于,第一个参数指的是master或者data都算在内,而后面两个参数则分指master和data node。

在期待的节点数条件满足之前, recovery过程会等待gateway.recover_after_time (默认5分钟) 这么长时间,一旦等待超时,则会根据以下条件判断是否启动:

gateway.expected_nodesgateway.expected_master_nodesgateway.expected_data_nodes

举例来说,对于一个有10个data node的集群,如果有以下的设置:

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

那么集群5分钟以内10个data node都加入了,或者5分钟以后8个以上的data node加入了,都会立即启动recovery过程。

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

如果不是full restart,而是重启单个data node,仍然会造成数据在不同结点之间来回复制。为避免这个问题,可以在重启之前,先关闭集群的shard allocation:

Elasticsearch Recovery索引分片分配的方法

然后在节点重启完成加入集群后,再重新打开:

Elasticsearch Recovery索引分片分配的方法

这样在节点重启完成后,尽量多的从本地直接恢复数据。

但是在ES1.6版本之前,即使做了以上措施,仍然会发现有大量主副本之间的数据拷贝。从表面去看,这点很让人不能理解。

主副本数据完全一致,ES应该直接从副本本地恢复数据就好了,为什么要重新从主片再复制一遍呢? 原因在于recovery是简单对比主副本的segment file来判断哪些数据一致可以本地恢复,哪些不一致需要远端拷贝的。

而不同节点的segment merge是完全独立运行的,可能导致主副本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几乎可以瞬间完成:

  1. 暂停数据写入程序

  2. 关闭集群shard allocation

  3. 手动执行POST /_flush/synced

  4. 重启节点

  5. 重新开启集群shard allocation 

  6. 等待recovery完成,集群health status变成green

  7. 重新开启数据写入程序  

特大热索引为何恢复慢

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

从主片恢复数据到副片需要经历3个阶段:

  1. 对主片上的segment file做一个快照,然后拷贝到复制片分配到的结点。数据拷贝期间,不会阻塞索引请求,新增索引操作记录到translog里。

  2. 对translog做一个快照,此快照包含第一阶段新增的索引请求,然后重放快照里的索引操作。此阶段仍然不阻塞索引请求,新增索引操作记录到translog里。

  3. 为了能达到主副片完全同步,阻塞掉新索引请求,然后重放阶段二新增的translog操作。  

可见,在recovery完成之前,translog是不能够被清除掉的(禁用掉正常运作期间后台的flush操作)。

如果shard比较大,第一阶段耗时很长,会导致此阶段产生的translog很大。重放translog比起简单的文件拷贝耗时要长得多,因此第二阶段的translog耗时也会显著增加。

等到第三阶段,需要重放的translog可能会比第二阶段还要多。 而第三阶段是会阻塞新索引写入的,在对写入实时性要求很高的场合,就会非常影响用户体验。

因此,要加快大的热索引恢复速度,最好的方式是遵从上一节提到的方法: 暂停新数据写入,手动sync flush,等待数据恢复完成后,重新开启数据写入,这样可以将数据延迟影响可以降到最低。

万一遇到Recovery慢,想知道进度怎么办呢? CAT Recovery API可以显示详细的recovery各个阶段的状态。 这个API怎么用就不在这里赘述了,参考:  CAT Recovery。

其他Recovery相关的专家级设置

还有其他一些专家级的设置(参见:   recovery)可以影响recovery的速度,但提升速度的代价是更多的资源消耗,因此在生产集群上调整这些参数需要结合实际情况谨慎调整,一旦影响应用要立即调整回来。

对于搜索并发量要求高,延迟要求低的场合,默认设置一般就不要去动了。

对于日志实时分析类对于搜索延迟要求不高,但对于数据写入延迟期望比较低的场合,可以适当调大indices.recovery.max_bytes_per_sec,提升recovery速度,减少数据写入被阻塞的时长。

最后要说的一点是ES的版本迭代很快,对于Recovery的机制也在不断的优化中。 其中有一些版本甚至引入了一些bug,比如在ES1.4.x有严重的translog recovery bug,导致大的索引trans log recovery几乎无法完成 。

因此实际使用中如果遇到问题,最好在Github的issue list里搜索一下,看是否使用的版本有其他人反映同样的问题。

到此,相信大家对“Elasticsearch Recovery索引分片分配的方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Elasticsearch Recovery索引分片分配的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Elasticsearch Recovery索引分片分配的方法

本篇内容主要讲解“Elasticsearch Recovery索引分片分配的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Elasticsearch Recovery索引分片分配的方法”吧!
2023-06-30

Elasticsearch索引的分片分配Recovery怎么使用

本篇内容主要讲解“Elasticsearch索引的分片分配Recovery怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Elasticsearch索引的分片分配Recovery怎么使用”
2023-06-30

ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析

这篇文章主要介绍了ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析文章都
2023-07-05

搜索一文入门ElasticSearch(节点分片CRUD倒排索引分词)

这篇文章主要为大家介绍了搜索一文入门ElasticSearch(节点分片CRUD倒排索引分词)的基础详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-23

深入理解Elasticsearch的分布式索引机制(Elasticsearch分布式索引如何工作?)

Elasticsearch的分布式索引机制是一种高可用、可扩展且容错的数据管理方式。它使用分片将索引细分,并创建副本以提高数据可用性。主分片处理写入,副本分片处理读取。分片分配策略用于确定分片存储位置。路由机制确保文档始终路由到相同的分片,优化查询性能。合并有助于维护分片大小,提高性能并减少存储开销。通过分布式索引机制,Elasticsearch实现了高可用性、可伸缩性、故障容错性、并行处理和优化查询性能。
深入理解Elasticsearch的分布式索引机制(Elasticsearch分布式索引如何工作?)
2024-04-02

MYSQL之索引配置方法分类

1.注意事项1.创建索引时会将数据重新进行排序2.创建索引会占用磁盘空间,所以索引不是越多越好3.在同一列上避免创建多种索引4.避免在数据很长的字段上创建索引,如果要创建就创建前缀索引2.前缀索引# 根据前四个字符创建前缀索引mysql> alter tabl
MYSQL之索引配置方法分类
2021-03-26

mongodb唯一索引创建分片的方法是什么

在MongoDB中,可以使用以下方法来为唯一索引创建分片:创建一个分片索引:使用`sh.shardCollection()`方法将集合分片。这将对集合中的所有文档创建索引,并将其分布到不同的分片上。sh.shardCollection("
2023-10-26

Elasticsearch分布式搜索中的数据分片与路由机制(Elasticsearch如何进行数据分片与路由以实现分布式搜索?)

Elasticsearch通过分片将大型索引分割为较小的块,并通过路由机制确定每个文档存储的分片。分片提高了可扩展性、容错性和查询性能,而路由确保文档正确存储和检索。分片数量和副本分片数量根据索引大小和预期负载而异。通过优化分片和路由策略,组织可以最大化Elasticsearch的性能和可靠性。
Elasticsearch分布式搜索中的数据分片与路由机制(Elasticsearch如何进行数据分片与路由以实现分布式搜索?)
2024-04-02

Elasticsearch文档索引的增删改查方法

这篇文章主要介绍“Elasticsearch文档索引的增删改查方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Elasticsearch文档索引的增删改查方法”文章能帮助大家解决问题。接口幂等性0
2023-06-30

Elasticsearch分布式搜索引擎的API使用与最佳实践(如何高效使用Elasticsearch分布式搜索引擎的API?)

Elasticsearch分布式搜索引擎API使用与最佳实践:索引设计:规范化数据并定义映射以优化索引和搜索。查询优化:使用过滤器缩小搜索范围,利用聚合进行数据分析。API使用:批量操作提高效率,异步搜索提升用户体验。其他最佳实践:使用筛选器代替查询,预计算字段,分片感知路由。这些最佳实践帮助最大化ElasticsearchAPI性能,构建高效的应用程序。
Elasticsearch分布式搜索引擎的API使用与最佳实践(如何高效使用Elasticsearch分布式搜索引擎的API?)
2024-04-02

Elasticsearch分布式搜索引擎的架构原理与优势分析(Elasticsearch如何构建高效分布式搜索架构?)

Elasticsearch是一种分布式搜索引擎,采用分片、副本和集群架构。其原理涉及在分布式节点上存储和处理数据,使用分布式一致性机制保证数据完整性。Elasticsearch架构的优势包括可扩展性、故障容错、高可用性、高性能和数据一致性。它还支持跨数据中心复制、动态负载均衡和节点自我管理功能。
Elasticsearch分布式搜索引擎的架构原理与优势分析(Elasticsearch如何构建高效分布式搜索架构?)
2024-04-02

Elasticsearch分布式搜索引擎在日志分析中的应用(如何利用Elasticsearch实现分布式日志分析?)

Elasticsearch分布式搜索引擎在日志分析中具有广泛应用,可高效处理海量日志数据。其分布式架构支持横向扩展,并采用反向索引结构,实现快速搜索。Logstash和Filebeat数据收集器将日志从不同来源收集到Elasticsearch集群中。Elasticsearch提供了强大的查询语言和强大的可视化功能,可以通过Kibana创建仪表盘和图表,以便分析和可视化日志数据。Elasticsearch还支持机器学习算法,用于检测异常和识别模式。在安全威胁检测、性能监控、故障排除和合规审计等方面有着广泛的
Elasticsearch分布式搜索引擎在日志分析中的应用(如何利用Elasticsearch实现分布式日志分析?)
2024-04-02

Elasticsearch分布式搜索中的滚动更新与索引重建(Elasticsearch如何进行滚动更新和索引重建?)

滚动更新和索引重建是Elasticsearch管理分布式搜索集群中的索引更改的两种策略。滚动更新涉及逐步更新索引分片,在更新过程中保持集群可用。它适用于需要无停机时间、可扩展性和可靠性的场景。索引重建涉及一次性创建和重建新索引。它更简单、更快,并确保数据一致性。但是,它会导致停机时间和数据丢失风险。选择最合适的策略取决于特定用例的需求,例如停机时间、可扩展性、可靠性、简单性、性能和数据一致性。
Elasticsearch分布式搜索中的滚动更新与索引重建(Elasticsearch如何进行滚动更新和索引重建?)
2024-04-02

Python入门_浅谈字符串的分片与索引、字符串的方法

这篇文章主要介绍了字符串的分片与索引、字符串的方法。 字符串的分片与索引: 字符串可以用过string[X]来分片与索引。分片,简言之,就是从字符串总拿出一部分,储存在另一个地方。 看下面这个例子,string[0]代表第一个字符,stri
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录