экспериментальный статус бэкэнда JGroups Master/Slave для поиска в спящем режиме и infinispan

Мы используем hibernate-search для полнотекстового индексирования наших сущностей в wildfly 8.2 (используя библиотеки hibernate/hibernate-search и infinspan, включенные в wildfly 8.2). Запуск в качестве автономного узла или в домене с выделенным мастером поиска в спящем режиме и org.hibernate.search.store.impl.FSDirectoryProvider работает нормально в течение нескольких лет (и версии jboss).

Теперь мы хотели бы развернуть эту систему в кластерной среде высокой доступности с wildfly 8.2, работающим за прокси-сервером с балансировкой нагрузки. Мы хотим иметь динамически масштабируемый кластер без точки отказа в смысле мастера домена или мастера гибернации-поиска и настроили для этого автономные узлы без домена. Чтобы выбрать мастер HS, мы используем бэкэнд jgroups, а для репликации данных поиска в спящем режиме мы используем поставщика infinispan с file-store для сохранения данных между перезапусками.

Я настроил и запустил его довольно быстро и был очень взволнован, так как он кажется надежным и масштабируемым сценарием, но я несколько не решаюсь запустить эту конфигурацию в производство, поскольку бэкэнд jgroups был назван «экспериментальным» (и на некоторых форумах «чрезвычайно экспериментальный»). Каково текущее состояние бэкенда? Используют ли люди его в настоящее время в производстве? Что мы можем сделать, чтобы свести к минимуму риск, используя эту конфигурацию?

Кроме того, есть ли у кого-нибудь опыт использования infinispan вместе с hibernate-search в этом созвездии? Большинство настроек, касающихся replicated-cache, были просто повторно использованы из существующих примеров, если у кого-нибудь есть советы или рекомендации относительно этих настроек, например, будет ли он масштабироваться с индексами ~ 50 ГБ? Я был бы очень благодарен за любые отзывы или опыт с подобными сценариями.

Конфигурация в основном была собрана с использованием справочного материала отсюда:

Подробные шаги, которые мы предприняли, приведены ниже.

  • За основу мы взяли и расширили standalone-ha-full.xml
  • настроить jgroups для использования стека TCP
  • запустите TCPPING вместо MPing (мы планируем запустить его в облачном контексте, где многоадресная рассылка/udp вызывает проблемы — мы можем перейти на JDBCPing, чтобы сделать его более гибким в какой-то момент).
  • мы запускаем со следующими системными свойствами для каждого узла (конечно, имя/порт меняется для каждого узла)

Свойства системы:

<system-properties>        
   <property name="jboss.node.name" value="node2" />  
   <property name="jboss.socket.binding.port-offset" value="889" />  
   <!-- Automatic master election via JGroups, requires Infinispan directory provider -->
   <property name="hibernate.search.default.worker.backend" value="jgroups"/>
   <!-- Enable cluster-replicated index, but the default configuration does not enable any 
   form of permanent persistence for the index, we do this with cache-container/file-store below  -->
   <property name="hibernate.search.default.directory_provider" value="infinispan" />
   <property name="hibernate.search.infinispan.chunk_size" value="300000000" />
   <property name="hibernate.search.reader.strategy" value="shared" />
   <property name="hibernate.search.worker.execution" value="sync" />
   <property name="hibernate.search.default.optimizer.operation_limit.max"    value="10000"/>
   <property name="hibernate.search.default.optimizer.transaction_limit.max"    value="1000"/>
   <!-- Use CacheManager defined in WildFly configuration file, e.g., standalone.xml -->
   <property name="hibernate.search.infinispan.cachemanager_jndiname" value="java:jboss/infinispan/container/hibernate-search"/>
</system-properties>     

Мы определили следующие <cache-container> для infinispan:

<!-- BEGIN HIBERNATE INFINISPAN CACHE -->
<cache-container name="hibernate-search" jndi-name="java:jboss/infinispan/container/hibernate-search" start="EAGER">
    <transport lock-timeout="330000"/>
    <replicated-cache name="LuceneIndexesMetadata" start="EAGER" mode="SYNC" remote-timeout="330000">
        <locking striping="false" acquire-timeout="330000" concurrency-level="500"/>
        <transaction mode="NONE"/>
        <eviction strategy="NONE" max-entries="-1"/>
        <expiration max-idle="-1"/>
        <state-transfer enabled="true" timeout="480000"/>
        <file-store preload="true" purge="false" passivation="false" relative-to="jboss.home.dir" path="..\namespaces\mc\infinispan-file-store">
            <write-behind/>
        </file-store>
        <indexing index="NONE"/>
    </replicated-cache>
    <replicated-cache name="LuceneIndexesData" start="EAGER" mode="SYNC" remote-timeout="25000">
        <locking striping="false" acquire-timeout="330000" concurrency-level="500"/>
        <transaction mode="NONE"/>
        <eviction strategy="NONE" max-entries="-1"/>
        <expiration max-idle="-1"/>
        <state-transfer enabled="true" timeout="480000"/>
       <file-store preload="true" purge="false" passivation="false" relative-to="jboss.home.dir" path="..\namespaces\mc\infinispan-file-store">
            <write-behind/>
        </file-store>
        <indexing index="NONE"/>
    </replicated-cache>
    <replicated-cache name="LuceneIndexesLocking" start="EAGER" mode="SYNC" remote-timeout="25000">
        <locking striping="false" acquire-timeout="330000" concurrency-level="500"/>
        <transaction mode="NONE"/>
        <eviction strategy="NONE" max-entries="-1"/>
        <expiration max-idle="-1"/>
        <state-transfer enabled="true" timeout="480000"/>
        <indexing index="NONE"/>
    </replicated-cache>
</cache-container>
<!-- END HIBERNATE INFINISPAN CACHE -->

Насколько я понимаю (и, похоже, это работает на практике с моими тестами), infinispan сериализует свои данные в настроенный <file-store>, а затем данные сохраняются между перезапусками узла. Даже некоторые катастрофические тесты (например, kill -9 <jboss-pid>) показали чистое восстановление индекса, когда узел возвращается. В течение автономного периода другой узел становится ведущим, и кластер работает бесперебойно.


person sprockets    schedule 22.06.2015    source источник
comment
Индексы ~ 50 ГБ означают, что вам потребуется куча JVM объемом 100+ ГБ для реплицированного кеша. Если вы не используете Azul Zing, скажите своим пользователям выпить кофе во время GC и убедитесь, что протоколы JGroups FDx правильно обрабатывают минутную паузу.   -  person Radim Vansa    schedule 23.06.2015
comment
А вот с файловым хранилищем - с реплицированными кэшами вполне нормально, так как все данные и так на каждой ноде. Но вам нужно стереть его во время перезапуска, иначе этот узел может предоставлять устаревшие данные.   -  person Radim Vansa    schedule 23.06.2015
comment
Спасибо за ответ. Привлекательность нашего текущего подхода, основанного на каталогах (копируется на каждый узел), заключается в том, что индекс довольно большой, но не обязательно должен находиться в памяти. Будет ли предпочтительнее другая реализация хранилища кеша для уменьшения объема данных, постоянно хранящихся в jvm? infinispan.org/cache-store-implementations   -  person sprockets    schedule 23.06.2015
comment
Хорошо, я не понял в первом комментарии, что индекс будет в основном на диске, а не в памяти. Извините за это - в этом случае это может сработать, но обработка сбоев требует некоторых административных действий - стирание данных хранилища кеша на разбитом узле. Но это ограничение распространяется на все хранилища кэша без общего доступа.   -  person Radim Vansa    schedule 23.06.2015
comment
Хранилище файлов должно хранить набор ключей кэша в памяти, тогда как значения могут быть вытеснены на диск. Существует реализация LevelDBStore, которой не нужно хранить ключи в памяти в обмен на более низкую производительность, и SoftIndexFileStore, которая может быть несколько быстрее, чем LevelDB, но является экспериментальной.   -  person Radim Vansa    schedule 23.06.2015
comment
Набор ключей очень мал для каталога Lucene, даже для огромных индексов. Таким образом, тип CacheStore не имеет значения, но производительность кэшсторов может быть ограничением. Лучше выбрать быстрый.   -  person Sanne    schedule 24.06.2015
comment
Спасибо, Санне, нас интересовал размер ключа для HS. так является ли FileStore хорошим подходом? лучше leveldb возможно? В любом случае, есть ли способ безопасного резервного копирования/восстановления индексов в случае сбоя - восстановление индекса может занять некоторое время (дни), которое мы стараемся свести к минимуму...   -  person sprockets    schedule 24.06.2015