Lucene IndexDeletionPolicy

 

루씬(lucene)은 기본적으로 리플리케이션을 지원하지않고 있다.

하지만, 리플리케이션을 구현하기에 필요한 API들은 만들어져 있다.

org.apache.lucene.index.IndexDeletionPolicy

http://lucene.apache.org/java/3_0_1/api/all/org/apache/lucene/index/IndexDeletionPolicy.html

http://lucene.jugem.jp/?eid=179

 

위 2개의 링크를 보면, IndexDeletionPolicy 에 대한 대략적인 내용을 알 수 있다.

 

처음에 저걸보면서 헷갈렸던게 삭제가 있으면 추가될때도 알려줘야되지 않냐고 생각했는데 문서삭제 시점과 인덱스디렉토리에 반영되는 시점에 대해서 개념을 잘못잡은것이였다.

즉, 루씬에서는 Update라는 개념이 없고 추가될때나 삭제될때 동시에 검색도 가능해야하기때문에 기존의 파일들을 복사하고 삭제 해버린다.

그 시점에 인터페이스로 알려준다는 것. 결국 인덱스 디렉토리에 변경이 되었을때 알려준다는 것이다. 그럼 IndexDeletionPolicy 인터페이스를 활용하여서 무얼할 수 있는지 대충 감이 올것이다.

가장 많이 활용되는 것은 IndexDeletionPolicy를 활용하여 리플리케이션을 만드는 것이다.

Lucene에서는 SnapshotDeletionPolicy 클래스를 살펴보면 된다. 소스를보면 단순히 커밋한 포인트들만 들고있다. 저걸가지고 리플리케이션으로 써먹을 수 있다는 것을 알려준것이다.

활용을 설명해둔 것이기때문에 실제 코드를 보고 싶다는 생각이 들었고 루씬을 활용하여 리플리케이션을 한 사례들이 없느냐?

Solr(http://lucene.apache.org/solr/)에서는 자랑스럽게 “providing distributed search and index replication” 이라고 표기했기에 어떤식으로 활용하는지를 살펴보았다.

Solr내부가 정확히 어떤식으로 돌아가는지는 정확하게 모르겠지만…

 

org.apache.solr.handler.SnapPuller

org.apache.solr.handler.ReplicationHandler

org.apache.solr.handler.SnapShooter

org.apache.solr.handler.IndexDeletionPolicyWrapper

4가지 핵심클래스로 이루어진듯하다.

대충 작동매커니즘을 살펴보면 Http 위에서 동작하기때문에 핸들러형태로 제작한듯하고 SnapPuller가 일정주기로 ReplicationHandler을 호출하고 변화되는 내용이 있으면,

SnapShooter 로 넘겨지고 live replication위해서 별도 쓰레드처리한다.

핵심코드는 아래 소스이고, 복잡하게 얘기했지만 결국은 저기 밑에 있는 변화된 인덱스파일들을 Copy한다는 얘기~ㅎ

 

</div>
<div class="code">void createSnapAsync(final IndexCommit indexCommit, final ReplicationHandler replicationHandler) {
     replicationHandler.core.getDeletionPolicy().saveCommitPoint(indexCommit.getVersion());    new Thread() {
       public void run() {
         createSnapshot(indexCommit, replicationHandler);
       }
     }.start();
  }

void createSnapshot(final IndexCommit indexCommit, ReplicationHandler replicationHandler) {
     NamedList details = new NamedList();
     details.add("startTime", new Date().toString());
     File snapShotDir = null;
     String directoryName = null;
     Lock lock = null;
     try {
       SimpleDateFormat fmt = new SimpleDateFormat(DATE_FMT);
       directoryName = "snapshot." + fmt.format(new Date());
       lock = lockFactory.makeLock(directoryName + ".lock");
       if (lock.isLocked()) return;
       snapShotDir = new File(snapDir, directoryName);
       if (!snapShotDir.mkdir()) {
         LOG.warn("Unable to create snapshot directory: " + snapShotDir.getAbsolutePath());
         return;
       }
       Collection<String> files = indexCommit.getFileNames();
       FileCopier fileCopier = new FileCopier(solrCore.getDeletionPolicy(), indexCommit);
       fileCopier.copyFiles(files, snapShotDir);

details.add("fileCount", files.size());
       details.add("status", "success");
       details.add("snapshotCompletedAt", new Date().toString());
     } catch (Exception e) {
       SnapPuller.delTree(snapShotDir);
       LOG.error("Exception while creating snapshot", e);
       details.add("snapShootException", e.getMessage());
     } finally {
         replicationHandler.core.getDeletionPolicy().releaseCommitPoint(indexCommit.getVersion());
         replicationHandler.snapShootDetails = details;
       if (lock != null) {
         try {
           lock.release();
         } catch (IOException e) {
           LOG.error("Unable to release snapshoot lock: " + directoryName + ".lock");
         }
       }
     }
   }

Lucene IndexDeletionPolicy”에 대한 1개의 생각

  1. ㅎ.. 내용이 반도 이해가 잘 안되네요..;;;;

    그러니까 인덱스 파일에 변화가 있을 때 마다
    백업을 할 수 있다는 것인가요?

    MySql에서의 리플리케이션과 같은 기능이라고 보면 되는건지..^^;

    10년도에 작성하신 글인데 이걸 이제서야 보게 되네요.

    어케든 샘플 코드를 좀 만들어서 돌려보면 이해가 될 것 같은데
    찾아봐야겠네요~ 감사합니다.. ㅎㅎ

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중