Lucene二阶段提交

IndexWirter继承了TwoPhaseCommit接口,实现三个方法:prepareCommit,commit与rollback

  • prepareCommit,完成二阶段提交第一阶段的工作,它会尽可能多的完成更新工作,但又避免完成真实的提交。你可以轻松地利用rollback废弃掉当前阶段完成的所有工作。 事实上本次commit所产生的段文件,已写入存储。
  • commit方法是完成第二阶段的工作,它只作很少的工作,只有该方满返回,调用者才能确认索引相应操作已完成,并持久化到存储。跟踪代码直至SegmentIfnos的finishCommit方法,可见commit成功的情况下,只做了两件事情,一是在segments_N未填入4byte的校验合,还有就是close写入流完成fsync。新的commit,只有在校验和正确的情况下对IndexReader可见
  • rollback:废弃掉上次commit以来的所有变更操作

二阶段提交只是一种选择, 在通常情况下, 只需要定时调用commit()方法做hardcommit即可. 如果有分布式需求做版本控制等, 可能会需要二阶段提交

Lucene自身并未实现事务日志,但在更高层上可以方便实地现。例发,Solr与ElasticSearch就实现了事务日志。

几种情况:

a. 不使用commit(), 不会生成segment文件, 不可读; 如果达到flush的阈值会进行写tim tip,doc,pay等文件(是持久化写),但不会有segment文件生成, 换言之,flush也会产生磁盘io,但是其事务不会提交, 不会被其他indexreader读取到

b. 使用preparecommit(), 会生成segment文件, 不可读

c. 使用close(), 会生成segment文件, 可读

d. 使用close(), 并且设置config.setCommitOnClose(false), 不会生成segment文件, 不可读

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/89190502