lucene索引_在崩溃或断电后测试Lucene的索引耐久性

lucene索引

Lucene有用的事务功能之一是索引持久性 ,它可以确保一旦成功调用IndexWriter.commit ,即使操作系统或JVM崩溃或断电,或者您杀死-KILL JVM进程,重启后索引也将保持完整(未损坏),并将反映崩溃前的最后一次成功提交。

当然,这仅在硬件运行状况良好且IO设备正确实现fsync(在操作系统要求时刷新其写缓存)的情况下才有效。 如果您遇到数据丢失的问题,例如内存,IO或CPU路径中的静默位翻转器,则得益于Lucene 4.8.0和Lucene中提供的新的端到端校验和功能 ( LUCENE-2446 )现在在索引或CheckIndex期间也将检测到该CheckIndex 。 这类似于ZFS文件系统的块级校验和,但并不是每个人都使用ZFS(呵呵),因此Lucene现在在文件系统之上进行自己的校验和验证。

确保通过调用IndexWriterConfig.setCheckIntegrityAtMerge启用合并期间的校验和验证。 将来,我们希望删除该选项,并始终在合并时验证校验和,并且我们已经对LUCENE-5580中的默认存储字段格式和LUCENE-5602中的 (很快)术语向量格式以及设置低级IO API,以便其他编解码器组件也可以使用LUCENE-5583 (适用于Lucene 4.8.0)做到这一点。

FileDescriptor.sync和fsync

在后台,当您调用IndexWriter.commit ,Lucene将收集自上次提交以来所有新写入的文件名,并在每个文件名上调用FileDescriptor.sync以确保所有更改都移至稳定的存储中。

从本质上讲 , fsync是一项复杂的操作,因为操作系统必须从其IO缓冲区高速缓存中清除与指定文件关联的所有脏页,并与基础IO设备一起使用,以确保也清除了它们的写高速缓存,并且还可以正常工作文件系统以确保其完整性得以保留。 您可以单独同步文件的字节或元数据,也可以同步包含文件的目录。
这篇博客文章很好地说明了挑战。

最近,我们一直在仔细研究Lucene的这些部分,所有这些注意都发现了一些令人兴奋的问题!

在LUCENE-5570 (将在Lucene 4.7.2中修复)中,我们发现FSDirectory实现中的fsync实现能够引入新的0字节文件。 通常,这本身并不是问题,因为IndexWriter不应同步未创建的文件。 但是,当使用Lucene的IndexWriter或应用程序中存在错误时(例如,直接删除不应删除的索引文件),则会加剧调试。 在这些情况下,这么长时间后才发现这些0字节的文件会令人困惑,而不是在IndexWriter尝试对它们进行同步时命中FileNotFoundException

在LUCENE-5588 (要在Lucene 4.8.0中修复)中,我们意识到我们还必须同步包含索引的目录,否则在操作系统崩溃或断电时,该目录可能不会链接到新创建的文件,或者您将无法通过文件名查找文件。 这显然很重要,因为Lucene会列出目录以查找所有提交点( segments_N文件),并且当然还会按文件名打开文件。

硬盘

由于Lucene不依赖文件元数据(例如访问时间和修改时间),因此很容易使用fdatasync (或Java中的FileChannel.force(false) )来仅同步文件的字节。 但是,这是一种优化,目前我们专注于错误。 此外,这可能不会更快,因为如果文件长度已更改,则元数据仍必须由fdatasync进行同步,这在Lucene中通常是这样,因为我们仅在写入时才附加到文件(我们删除了Indexoutput.seek在LUCENE-4399中 )。

在LUCENE-5574 (从Lucene 4.7.2开始修复)中,我们发现关闭时接近实时的读取器可以删除文件,即使从中打开的写入器已经关闭。 通常,这本身就不是问题,因为只要使用Lucene的API并且不自己修改索引文件,Lucene就会一次写入(一次不会多次写入同一个文件名)。 但是,如果通过将文件复制到索引中来实现自己的索引复制,并且如果您不先关闭近实时读取器,则关闭它们可能会删除刚复制的文件。

在任何给定的索引编制会话期间,Lucene都会写入并关闭许多文件,合并后会删除许多文件, IndexWriter.commit ,直到以后,当应用程序最终调用IndexWriter.commitIndexWriter才会按顺序重新打开新创建的文件。获取FileDescriptor,以便我们对其进行fsync

这种方法(关闭原始文件,然后再打开以进行同步),而不是从不关闭原始文件并同步您用于写入的相同文件句柄,这种方法可能是冒险的: FileDescriptor.sync的javadocs有点模糊关于这种方法是否安全。 但是,当我们查看Unix / Posix上的fsync和Windows上的FlushFileBuffers的文档时,他们清楚地表明这种做法很好,因为打开文件描述符实际上仅是确定要同步哪个文件的缓冲区所必需的。 很难想象会有一个操作系统单独跟踪哪个打开的文件描述符对文件进行了哪些更改。 但是,出于偏执狂或谨慎起见,我们还在探索LUCENE-3237上可能的补丁程序,以仅同步最初打开的文件。

测试fsync确实有效

在应用程序对IndexWriter.commit的调用与物理定律之间的所有这些复杂层之间,确保了很少的磁体被翻转或少数电子被移动到NAND单元中的微小浮动栅中 ,我们如何才能可靠地测试整个序列抽象实际上在起作用吗?

在Lucene的随机测试框架中,我们有一个称为MockDirectoryWrapper的不错的Directory实现。 它可以做各种令人讨厌的事情,例如引发随机异常,有时会减慢某些文件的打开,关闭和写入速度,拒绝删除仍在打开的文件(例如Windows),在仍然有打开的文件时拒绝关闭等。随着时间的推移,它帮助我们发现了各种有趣的错误。

它关闭时要做的另一件事是通过随机破坏任何未压缩的文件来模拟操作系统崩溃或断电,然后确认索引没有破坏。 这对于捕获Lucene错误很有用,因为我们本应在适当的时候调用fsync失败,但不会捕获FSDirectory类中的sync实现中的错误,例如令人沮丧的LUCENE-3418 (最初出现在Lucene 3.1中,最后出现在在Lucene 3.4中修复)。

2456s3

因此,为了捕获此类错误,我创建了一个基本的测试设置,使用了一个简单的Insteon 开/关设备以及我很久以前创建的与Insteon设备进行交互的自定义​​Python绑定。 我已经在家中各处使用这些设备来控制灯光和电器,因此将其用于Lucene也是我两个热情的完美结合!

该脚本将永远循环,首先更新源代码,进行编译,检查索引是否损坏,然后在设置中进行一些随机化后开始索引运行,最后等待几分钟,然后切断电源。 然后,它恢复电源,等待机器再次响应,然后再次启动。

到目前为止,已经完成了80个电源循环,而且还没有损坏。 好消息!

为了“测试测试人员”,我尝试临时更改fsync使其不执行任何操作,实际上,经过几次迭代,索引已损坏。 因此确实,测试设置似乎“有效”。

目前,该测试在带有ext4文件系统的旋转磁铁硬盘上使用Linux。 这仅仅是一个开始,但是总比没有对Lucene的fsync进行适当的测试要好。 随着时间的流逝,我希望测试操作系统,文件系统,IO硬件等的不同组合。

翻译自: https://www.javacodegeeks.com/2014/04/testing-lucenes-index-durability-after-crash-or-power-loss.html

lucene索引

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤教育] 浙江大学 2021秋 茶叶加工与品质管理学Ⅰ 陈萍 章节答案考试答案 浙江大学[渝粤教育]

教育 -2021秋-茶叶加工与品质管理学Ⅰ-陈萍-章节资料考试资料-浙江大学【】 第一章单元测验 1、【单选题】成品茶按照()分成六大基础茶类。 A、茶叶原料 B、干燥方式 C、杀青程度 D、发酵程度 参考资料【 】 2、【单选题】下列不是描述绿茶干茶色泽的是&…

不缠电线不剥线皮接灯泡的方法

教你个好方法,不缠电线不剥线皮,带电接灯泡 需要准备快速接头,一边用来压接负载线,一边用来带电接火线或零线。 先一个接头卡住火线线压紧,同样的方法压接零线;另一边用另一种接头压紧电线,再…

工业以太网在工业领域的应用特点详解

工业以太网交换机专门为满足灵活多变的工业应用需求而设计,提供一种高性价比工业以太网通讯解决方案。那么,工业以太网在工业领域的应用特点有哪些呢?接下来我们就跟随飞畅科技的小编一起来详细了解下吧! 一、工业以太网技术的概…

如何通过Java单次查找链表的中间元素

您如何一次找到LinkedList的中间元素,这是电话采访中经常问到的Java和非Java程序员的编程问题。 这个问题类似于检查回文或 计算阶乘 ,有时Interviewer还会要求编写代码。 为了回答这个问题,候选人必须熟悉LinkedList的数据结构,…

特斯拉阀:被遗忘的天才之阀

特斯拉阀是特斯拉发明的一个让人疑惑的物品,之所以让人疑惑,是因为它长得很奇怪,它长这样(如视频所示) 按特斯拉的说法,这个东西既能当水管又能做阀门,是一个两用的天才设计。工作原理如下&…

工业POE交换机使用中的常见问题汇总

我们在使用工业POE交换机的过程中,不可避免的会遇到一些问题,我们只有对这些问题有了详细的了解认识之后,才能更好的使用操作工业交换机,在这里,杭州飞畅科技的小编为此专门为大家整理了在使用工业POE交换机过程中的一…

什么是以太?它与以太网有何关系?

以太——最早作为传播光的介质,竟然被证实不存在? 什么是以太?它与以太网有何关系? 以太是亚里士多德设想的一种物质,在他看来物质除水火土气之外,还有一种居于天空上层之外的以太,因此带有一…

三相电机如何判断好坏

三相电机与单相电机测量绝缘电阻方式一样,但测量线圈阻值判断方法不一样。 测量电机线圈阻值,万用表档位选择在电阻200Ω档,用红、黑表笔分别测量电机(U1、V1),(V1,W1)&…

什么是管理型工业以太网交换机?

众所周知,以太网连接设备发展的下一代产品是管理型交换机,相对于集线器和非管理型交换机,管理型交换机拥有更多更复杂的功能,价格也高出许多-通常是一台非管理型交换机的3~4倍。管理型交换机提供了更多的功…

DPU到底是什么?真能做到与CPU、GPU比肩

DPU:第三颗主力芯片 英伟达吹爆的DPU到底是啥?真能做到与CPU、GPU比肩? 2020年,NVIDIA在GTC战略发布中将DPU定义为,继CPU和GPU之后“第三颗主力芯片”,正式拉开DPU大发展的序幕。作为主力芯片新物种&…

使用Hibernate和Spring构建Java Web应用程序

这篇文章将展示如何在Spring环境中使用带有Hibernate ORM的MYSQL DB创建学生注册应用程序。 这是一个简单的应用程序,旨在在注册过程中从用户收集输入详细信息,将这些详细信息保存在MYSQL DB中,并在登录期间对其进行身份验证。 1.使用Maven模…

PCB基板中的贵族,散热问题的终极者

PCB板中的贵族 ——散热问题的终极者 将一个芯片焊接在PCB板上,散热很关键,芯片的散热途径主要有如下三种,对应三种热阻: 1.芯片内部到外壳和引脚的热阻——芯片固定的,无法改变; 2.芯片引脚到PCB板的热…

光纤交换机常见硬件、软件故障问题介绍

现如今,交换机已经普及到了各办公场所,商场,学校,医院等等几乎所有的需求上网的地方,各大光纤交换机厂商也加大了研发速度,使得现今的设备在性能上更加优越,价格更加合理,也促使了交…

将Amazon Cognito与单页面应用程序(Vue.js)集成

在本文中,我们将研究使用OAuth协议通过Amazon Cognito对单页应用程序(使用Vue.js构建)进行身份验证。 在上一篇文章中,我们将服务器端应用程序与Amazon Cognito集成在一起。 搭建单页应用程序 我们将使用vue-cli创建一个空的Vuej…

神奇的压电效应

日常所用的电子打火机、石英表、扬声器、麦克风等都包含着压电晶体。 小时候有没有拿着这个东西电来玩啊?(打火机的内胆)今天我们就来聊聊压电效应。 这是一个打火机,拇指一按,产生压力,然后压电晶体产生…

光纤交换机使用方法及应用方案详解

光纤交换机是一种高速的网络传输中继设备,又叫做光纤通道交换机、SAN交换机,它较普通交换机而言,采用了光纤电缆作为传输介质,光纤传输的优点是速度快、抗干扰能力强。那么,光纤交换机该如何使用呢?接下来我…

太阳能瓦片,古风与科技结合

中国发明的太阳能瓦片,古风与科技的结合,能省全年电费! 今天视频的主角,是一种新型的柔性薄膜太阳能发电瓦—汉瓦。承载着东方古韵与中国浓厚的文化,将现代科技融入传统建筑,用尖端技术和精巧工艺&#xf…

在监控网络项目中该如何选择光纤交换机?

现在,随着网络技术的发展,在安防监控项目中,尤其是在远距离点位的监控中,我们经常会用到光纤收发器、光纤交换机。那么,我们在监控网络中该如何选择光纤交换机呢?接下来就跟随飞畅科技的小编一起来详细看看…

不一定了解的USB4.0

USB已经存在20多年了,从1996年推出USB1.0规范开始,经历USB1.1、2.0、3.0,再到如今的USB4.0,传输速率从1.5Mbps提升到80Gbps。 USB4协议于2019年发布,在硬件接口上,采用了Type-C的硬件接口,使用…

DNA存储技术—让信息保存万年

一个1亿年前的琥珀化石最近被发现了,中间封存着一只蚊子,假设这只蚊子的DNA中存储了1亿年前的地球数据,那么现在的人类将这些数据读取出来之后徐徐展开的是否就是1亿年前恐龙时代的壮美图景? 这是电影《侏罗纪公园》中的场景&…