在崩溃或断电后测试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不应同步未创建的文件。 但是,当IndexWriter或使用Lucene的应用程序中存在错误时,它会加剧调试(例如,直接删除不应删除的索引文件)。 在这些情况下,这么长时间后才发现这些0字节的文件很混乱,而不是在IndexWriter尝试对它们进行同步时命中FileNotFoundException

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

硬盘

由于Lucene不依赖文件元数据(例如访问时间和修改时间),因此很容易使用fdatasync (或Java中的FileChannel.force(false) )仅对文件的字节进行fsync。 但是,这是一种优化,目前我们专注于错误。 此外,这可能不会很快,因为如果文件长度已更改,则元数据仍必须由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

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

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

相关文章

Jmeter、postman、python 三大主流技术如何操作数据库?

1、前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性;例如商品搜索功能 自动化测试或性能测试中&a…

利用ASP.NET向服务器上传文件[转]

文件上传技术是一个很实用的技术,有着很广泛的应用,在ASP.NET自身的前一个版本ASP里实现这个功能,就必须使用第三方的组件或者自己开发组件了,现在,用ASP.NET实现起来就简单得多了,我们不需要使用任何组件就…

java中HashMap详解

HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚…

java代码编写的文本特征提取_Test1 java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学 Develop 274万源代码下载- www.pudn.com...

文件名称: Test1下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 35 KB上传时间: 2015-03-02下载次数: 46提 供 者: 常杰详细说明:java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学-Feature extraction of the Java …

c# HashTable (哈希表)

HashTable 哈希表 也是System.Collections集合下的数据结构类 它储存的也是Object类型的对象 但是它在内存中是散列排布的 因为这个特性,非常适合存储大量的数据 在HashTable中一个键只能对应一个值,一个值可以对应多个键(多对一)…

Spring集成–配置Web服务客户端超时

介绍 在Spring Integration的支持下,您的应用程序可以使用出站Web服务网关来调用Web服务。 调用由该网关处理,因此您只需要担心构建请求消息和处理响应。 但是,使用这种方法并不明显,如何配置其他选项,例如设置超时或操…

将txt文件和excel文件导入SQL2000数据库

在做一些web数据库管理系统的时候经常要实现将帐户批量注册的功能,今天就来讲讲如何在C#-web项目中将txt文件和excel文件导入SQL2000数据库。1.数据库准备在SQL2000数据库的实例数据库pubs中建立一个数据表txtInsert,字段很简单:id&#xff0…

Java 8 Friday:Java 8将彻底改变数据库访问

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 对于Java 8系列 ,我们很荣幸主持Iu Ming-Yee Iu博士发表的非常相关的嘉宾帖子。 Iu …

Linux文件权限管理

权限管理 1、权限解读 权限:用户针对文件是否有读、写、执行的权利。 权限划分:读(Read)、写(Write)、执行(eXecute) 权限针对用户的划分:主人(User&#xff…

Sqoop数据迁移工具的使用

文章作者:foochane 原文链接:https://foochane.cn/article/2019063001.html Sqoop数据迁移工具的使用 sqoop简单介绍 sqoop数据到HDFS/HIVE sqoop数据到MySQL 1 sqoop简单介绍 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。用…

java中io.nio.aio_Java中网络IO的实现方式-BIO、NIO、AIO

在网络编程中,接触到最多的就是利用Socket进行网络通信开发。在Java中主要是以下三种实现方式BIO、NIO、AIO。关于这三个概念的辨析以前一直都是好像懂,但是表达的不是很清楚,下面做个总结完全辨析清楚。1. BIO方式首先我用一个较为通俗的语言…

C++中this指针

由类生成对象时&#xff0c;对象中只保存私有数据。 因为由一个类生成的所有对象为其数据服务的方法都是相同的&#xff0c;因此&#xff0c;一个类中的方法是大家所共用的。 而这就牵扯到当对象A调用方法时&#xff0c;如何保证该方法操作的数据是对象A的数据。 #include<i…

jfinal java搭建_Eclipse快速搭建Jfinal web应用 (一)

JFinal简介JFinal 是基于 Java 语言的极速 WEB ORM 框架&#xff0c;其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率&#xff01;为您节约更多时间&#xff0c…

PHP后台处理jQuery Ajax跨域请求问题 — xx was not called解决办法

// 前台代码 $.ajax({url: http://www.ushark.net/home/save_trial_apply,dataType: jsonp,processData: false,data: $(.layui-layer-content #trialFormInfo).serialize(), }) .done(function(data) {layer.msg(申请成功); }) .fail(function(jqXHR, textStatus, errorThrown…

如何使用VisualVM监视服务器上的多个JVM

在上一篇文章中&#xff0c;我向您展示了如何使用单个管理员服务器和多个托管服务器启动WebLogic Server。 这些启动之后&#xff0c;您如何检查它们的健康状况&#xff1f; 您可以使用管理员的/ console网络应用。 但是&#xff0c;所有默认的Oracle / Open JDK 6附带的另一个…

排序算法 JavaScript

一、冒泡排序 算法介绍&#xff1a; 1.比较相邻的两个元素,如果前一个比后一个大&#xff0c;则交换位置。 2.第一轮把最大的元素放到了最后面。 3.由于每次排序最后一个都是最大的&#xff0c;所以之后按照步骤1排序最后一个元素不用比较。 function bubble_sort(arr){var swa…

[你必须知道的.NET] 第一回:恩怨情仇:is和as

发布日期&#xff1a;2007.4.7 作者&#xff1a;Anytao ©2007 Anytao.com 转贴请注明出处&#xff0c;留此信息。 本文将介绍以下内容&#xff1a; • 类型转换 • is/as操作符小议 1. 引言 类型安全是.NET设计之初重点考虑的内容之一&#xff0c;对于程序设计者来说&…

获取当前鼠标的位置以及组件的位置

总结&#xff1a; div如果要触发鼠标事件要加上css样式cusor:pointer。 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

谷歌推大语言模型VideoPoet:文本图片皆可生成视频和音频

Google Research最近发布了一款名为VideoPoet的大型语言模型&#xff08;LLM&#xff09;&#xff0c;旨在解决当前视频生成领域的挑战。该领域近年来涌现出许多视频生成模型&#xff0c;但在生成连贯的大运动时仍存在瓶颈。现有领先模型要么生成较小的运动&#xff0c;要么在生…

PyCon大会Python主题演讲摘要

PyCon 是全国际最大的以 Python 编程言语 为主题的技能大会。大会由 Python 社区组织&#xff0c;每年举行一次。在大会上&#xff0c;来自国际各地的 Python 用户与中心开发者齐聚一堂&#xff0c;共同同享 Python 国际的新鲜事、Python 言语的应用案例、运用技巧等等内容。 I…