Подтвердить что ты не робот

Резервное копирование индекса Lucene

Какова наилучшая практика резервного копирования индекса lucene без использования индекса в автономном режиме (горячее резервное копирование)?

4b9b3361

Ответ 1

Вам не нужно останавливать свой IndexWriter, чтобы сделать резервную копию индекса.

Просто используйте SnapshotDeletionPolicy, который позволяет "защитить" данную точку фиксации (и все файлы, которые она включает), от удаления. Затем скопируйте файлы в этой точке фиксации в свою резервную копию и, наконец, отпустите фиксацию.

Хорошо, если для резервного копирования требуется некоторое время - пока вы не освобождаете точку фиксации с помощью SnapshotDeletionPolicy, IndexWriter не будет удалять файлы (даже если, например, они были объединены вместе).

Это дает вам согласованную резервную копию, которая представляет собой представление момента времени индекса без блокировки текущей индексации.

Я написал об этом в Lucene in Action (2-е издание), и там выдержки из книги, доступной (бесплатно) из http://www.manning.com/hatcher3, "Горячие резервные копии с Lucene", который описывает это более подробно.

Ответ 2

Этот ответ зависит от (а) от того, насколько велик ваш индекс и (б) какой ОС вы используете. Он подходит для больших индексов, размещенных в операционных системах Unix, и основан на стратегии репликации Solr 1.3.

Как только файл будет создан, Lucene не изменит его, он удалит его только. Таким образом, вы можете использовать стратегию жесткой ссылки для создания резервной копии. Этот подход будет:

  • остановить индексирование (и выполнить фиксацию?), чтобы вы могли быть уверены, что не будете делать снимок mid write
  • создать копию жестких ссылок ваших индексных файлов (с помощью cp -lr)
  • индексирование перезапуска

cp -lr копирует только структуру каталогов, а не файлы, поэтому даже индекс 100Gb должен копировать менее чем за секунду.

Ответ 3

По-моему, этого было бы достаточно, чтобы остановить любую текущую операцию индексирования и просто взять файловую копию ваших индексных файлов. Также посмотрите на snapshooter script из Solr, который можно найти в apache-solr-1.4.1/src/scripts, который по существу делает:

cp -lr indexLocation backupLocation

Другим вариантом может быть просмотр Directory.copy(..) подпрограммного подхода (например, использование того же каталога, что и конструктор параметр IndexWriter. Вас также может заинтересовать Snapshooter.java, который соответствует эквиваленту script.

Ответ 4

Создайте новый индекс с отдельным IndexWriter и используйте addIndexesNoOptimize(), чтобы слить текущий индекс в новый. Это очень медленно, но позволяет сохранить исходный индекс при выполнении резервного копирования.

Однако вы не можете писать в индекс при слиянии. Таким образом, даже если он подключен к сети, и вы можете запросить индекс, вы не сможете записать его во время резервного копирования.