Hibernate Search +infinispan +jgroups проблема с блокировкой серверной части ведомого устройства

Я новичок в поиске в спящем режиме. Мы решили перевести пользователя в режим гибернации для поиска моего приложения. В качестве бэкенда выбираем jgroups. Вот мой файл конфигурации.

<?xml version="1.0" encoding="UTF-8"?>
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:7.0 
http://www.infinispan.org/schemas/infinispan-config-7.0.xsd
                    urn:infinispan:config:store:jdbc:7.0 http://www.infinispan.org/schemas/infinispan-cachestore-jdbc-config-7.0.xsd"
xmlns="urn:infinispan:config:7.0"
xmlns:jdbc="urn:infinispan:config:store:jdbc:7.0">

<!-- *************************** -->
<!-- System-wide global settings -->
<!-- *************************** -->
<jgroups>
    <!-- Note that the JGroups transport uses sensible defaults if no configuration
        property is defined. See the JGroupsTransport javadocs for more flags.
        jgroups-udp.xml is the default stack bundled in the Infinispan core jar: integration
        and tuning are tested by Infinispan. -->
  <stack-file name="default-jgroups-tcp" path="proform-jgroups.xml" />
</jgroups>

<cache-container name="HibernateSearch" default-cache="default" statistics="false" shutdown-hook="DONT_REGISTER">

    <transport stack="default-jgroups-tcp" cluster="venkatcluster"/>

    <!-- Duplicate domains are allowed so that multiple deployments with default configuration
        of Hibernate Search applications work - if possible it would be better to use JNDI to share
        the CacheManager across applications -->
    <jmx duplicate-domains="true" />

     <!-- *************************************** -->
     <!--  Cache to store Lucene's file metadata  -->
     <!-- *************************************** -->
     <replicated-cache name="LuceneIndexesMetadata" mode="SYNC" remote-timeout="25000">
        <transaction mode="NONE"/>
        <state-transfer enabled="true" timeout="480000" await-initial-transfer="true" />
        <indexing index="NONE" />
        <eviction max-entries="-1" strategy="NONE"/>
        <expiration max-idle="-1"/>
        <persistence passivation="false">
            <jdbc:string-keyed-jdbc-store preload="true" fetch-state="true" read-only="false" purge="false">
                <property name="key2StringMapper">org.infinispan.lucene.LuceneKey2StringMapper</property>
                <jdbc:connection-pool connection-url="jdbc:mysql://localhost:3306/entityindex" driver="com.mysql.jdbc.Driver" password="pf_user1!" username="pf_user"></jdbc:connection-pool>
                <jdbc:string-keyed-table drop-on-exit="false" create-on-start="true" prefix="ISPN_STRING_TABLE">
                    <jdbc:id-column name="ID" type="VARCHAR(255)"/>
                    <jdbc:data-column name="DATA" type="BLOB"/>
                    <jdbc:timestamp-column name="TIMESTAMP" type="BIGINT"/>
                </jdbc:string-keyed-table>
            </jdbc:string-keyed-jdbc-store>
        </persistence>
     </replicated-cache>

     <!-- **************************** -->
     <!--  Cache to store Lucene data  -->
     <!-- **************************** -->
     <distributed-cache name="LuceneIndexesData" mode="SYNC" remote-timeout="25000">
        <transaction mode="NONE"/>
        <state-transfer enabled="true" timeout="480000" await-initial-transfer="true" />
        <indexing index="NONE" />
        <eviction max-entries="-1" strategy="NONE"/>
        <expiration max-idle="-1"/>
        <persistence passivation="false">
            <jdbc:string-keyed-jdbc-store preload="true" fetch-state="true" read-only="false" purge="false">
                <property name="key2StringMapper">org.infinispan.lucene.LuceneKey2StringMapper</property>
                <jdbc:connection-pool connection-url="jdbc:mysql://localhost:3306/entityindex" driver="com.mysql.jdbc.Driver" password="pf_user1!" username="pf_user"></jdbc:connection-pool>
                <jdbc:string-keyed-table drop-on-exit="false" create-on-start="true" prefix="ISPN_STRING_TABLE">
                    <jdbc:id-column name="ID" type="VARCHAR(255)"/>
                    <jdbc:data-column name="DATA" type="BLOB"/>
                    <jdbc:timestamp-column name="TIMESTAMP" type="BIGINT"/>
                </jdbc:string-keyed-table>
            </jdbc:string-keyed-jdbc-store>
        </persistence>
     </distributed-cache>

     <!-- ***************************** -->
     <!--  Cache to store Lucene locks  -->
     <!-- ***************************** -->
    <replicated-cache name="LuceneIndexesLocking" mode="SYNC" remote-timeout="25000">
        <transaction mode="NONE"/>
        <state-transfer enabled="true" timeout="480000" await-initial-transfer="true" />
        <indexing index="NONE" />
        <eviction max-entries="-1" strategy="NONE"/>
        <expiration max-idle="-1"/>
        <persistence passivation="false">
            <jdbc:string-keyed-jdbc-store preload="true" fetch-state="true" read-only="false" purge="false">
                <property name="key2StringMapper">org.infinispan.lucene.LuceneKey2StringMapper</property>
                <jdbc:connection-pool connection-url="jdbc:mysql://localhost:3306/entityindex" driver="com.mysql.jdbc.Driver" password="pf_user1!" username="pf_user"></jdbc:connection-pool>
                <jdbc:string-keyed-table drop-on-exit="false" create-on-start="true" prefix="ISPN_STRING_TABLE">
                    <jdbc:id-column name="ID" type="VARCHAR(255)"/>
                    <jdbc:data-column name="DATA" type="BLOB"/>
                    <jdbc:timestamp-column name="TIMESTAMP" type="BIGINT"/>
                </jdbc:string-keyed-table>
            </jdbc:string-keyed-jdbc-store>
        </persistence>
    </replicated-cache>

</cache-container>

This is my jgroups-file:

   <config xmlns="urn:org:jgroups"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:org:jgroups 
   http://www.jgroups.org/schema/JGroups-3.6.xsd">
   <TCP bind_addr="${jgroups.tcp.address:127.0.0.1}"
    bind_port="${jgroups.tcp.port:7801}"
    enable_diagnostics="false"
    thread_naming_pattern="pl"
    send_buf_size="640k"
    sock_conn_timeout="300"

    thread_pool.min_threads="${jgroups.thread_pool.min_threads:2}"
    thread_pool.max_threads="${jgroups.thread_pool.max_threads:30}"
    thread_pool.keep_alive_time="60000"
    thread_pool.queue_enabled="false"  
    internal_thread_pool.min_threads= 
    "${jgroups.internal_thread_pool.min_threads:5}"


   internal_thread_pool.max_threads=
   "${jgroups.internal_thread_pool.max_threads:20}"
    internal_thread_pool.keep_alive_time="60000"
    internal_thread_pool.queue_enabled="true"
    internal_thread_pool.queue_max_size="500"

    oob_thread_pool.min_threads="${jgroups.oob_thread_pool.min_threads:20}"
    oob_thread_pool.max_threads="${jgroups.oob_thread_pool.max_threads:200}"
    oob_thread_pool.keep_alive_time="60000"
    oob_thread_pool.queue_enabled="false"
  />
  <S3_PING access_key=""
        secret_access_key=""
        location="mybucket"

 />
  <MERGE3 min_interval="10000"
        max_interval="30000"
  />
 <FD_SOCK />
 <FD_ALL timeout="60000"
       interval="15000"
       timeout_check_interval="5000"
 />
  <VERIFY_SUSPECT timeout="5000" />
 <pbcast.NAKACK2 use_mcast_xmit="false"
               xmit_interval="1000"
               xmit_table_num_rows="50"
               xmit_table_msgs_per_row="1024"
               xmit_table_max_compaction_time="30000"
               max_msg_batch_size="100"
               resend_last_seqno="true"
 />
 <UNICAST3 xmit_interval="500"
         xmit_table_num_rows="50"
         xmit_table_msgs_per_row="1024"
         xmit_table_max_compaction_time="30000"
         max_msg_batch_size="100"
         conn_expiry_timeout="0"
 />
 <pbcast.STABLE stability_delay="500"
              desired_avg_gossip="5000"
              max_bytes="1M"
 />
 <pbcast.GMS print_local_addr="false"
           join_timeout="15000"
 />
 <MFC max_credits="2m"
    min_threshold="0.40"
 />
 <FRAG2 />
</config>

Это мой файл flush-tcp:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:org:jgroups"
    xsi:schemaLocation="urn:org:jgroups 
 http://www.jgroups.org/schema/jgroups.xsd">
 <TCP bind_port="7801"/>
 <S3_PING access_key=""
        secret_access_key=""
        location=""

 />
<MERGE3/>
<FD_SOCK/>
<FD/>
<VERIFY_SUSPECT/>
<pbcast.NAKACK2 use_mcast_xmit="false"/>
<UNICAST3/>
<pbcast.STABLE/>
<pbcast.GMS/>
<MFC/>
<FRAG2/>
<pbcast.STATE_TRANSFER/>
<pbcast.FLUSH timeout="0"/>
</config>

Это настройки гибернации:

 propertyMap.put("hibernate.search.default.directory_provider", 
 "infinispan");
 propertyMap.put("hibernate.search.lucene_version", 
 KeywordUtil.LUCENE_4_10_4);
 propertyMap.put("hibernate.search.infinispan.configuration_resourcename",
 "hibernate-search-infinispan-config.xml");
 propertyMap.put("hibernate.search.default.​worker.execution","sync");
 propertyMap.put("hibernate.search.default.​worker.backend","jgroups");
 propertyMap.put("hibernate.search.services.jgroups.configurationFile",
 "flush-tcp.xml");
 propertyMap.put("hibernate.search.default.exclusive_index_use","true");

Изначально мы запускаем кластер с одной нодой с вышеуказанной конфигурацией. В зависимости от нагрузки мы будем добавлять узлы в кластер. Это наша архитектура. Предположим, что в 10-00 мы запустили кластер. только узел станет главным узлом. и все в порядке. В 10-10 утра мы добавили еще одну ноду в кластер с небольшим изменением конфигурации. Вот изменение

 propertyMap.put("hibernate.search.default.exclusive_index_use","false");

Я создал индекс через второй узел. Потом вылезает ошибка блокировки. вот ошибка.

 org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: 
 org.infinispan.lucene.locking.BaseLuceneLock@46578a74

Проблема: Теоретически второй узел должен стать подчиненным и никогда не должен блокировать индекс. Он должен указать главный узел для создания индекса через канал jgroups. Но этого не происходит. Может ли кто-нибудь из вас помочь мне в этом. Наша производственная система находится в беде. Пожалуйста помоги мне с этим.


person user1273969    schedule 03.08.2017    source источник


Ответы (1)


Проблема: Теоретически второй узел должен стать подчиненным и никогда не должен блокировать индекс. Он должен указать главный узел для создания индекса через канал jgroups.

Здесь может быть две проблемы.

1. Использование разных значений для exclusive_index_use

Возможно, кто-то еще может подтвердить, но если ваш новый узел не имеет дело только с совершенно отдельной постоянной единицей с совершенно другими индексами, я сомневаюсь, что это хорошая идея использовать другое значение для exclusive_index_use на разных узлах.

exclusive_index_use заключается не в том, чтобы не получать блокировки, а в том, чтобы снимать их как можно скорее (после каждого набора изменений). Если другие ваши узлы работают в эксклюзивном узле, они никогда не снимут блокировки, и ваш новый узел будет ждать блокировки по тайм-ауту.

Также обратите внимание, что отключение exclusive_index_use — это верный способ снизить производительность записи, поскольку для этого требуется постоянно закрывать и открывать модули записи индекса. Используйте с осторожностью.

И, наконец, как вы указали, только один узел должен записывать в индекс в любой момент времени (мастер JGroups), поэтому в вашем случае отключение exclusive_index_use не требуется. Должна быть другая проблема...

2. Выбор ведущего/ведомого

Если я правильно помню, стратегия выбора мастера/узла по умолчанию выбирает нового мастера при добавлении нового узла. Кроме того, мы исправили несколько ошибок, связанных с динамическим главным выбором в последней версии Hibernate Search (еще не выпущенной), так что вы можете столкнуться с одной из них.

Вы можете попробовать использовать бэкенд jgroupsMaster на первом узле и jgroupsSlave на втором узле. Больше не будет никаких автоматических главных выборов, поэтому вы потеряете возможность поддерживать обслуживание, когда главный узел выйдет из строя, но, насколько я понимаю, вашей главной задачей является масштабирование, поэтому это может дать вам временное решение.

На главном узле:

propertyMap.put("hibernate.search.default.​worker.backend","jgroupsMaster");

На ведомом узле:

propertyMap.put("hibernate.search.default.​worker.backend","jgroupsSlave");

ВНИМАНИЕ: вам потребуется полный перезапуск! Сохранение текущего бэкенда jgroups на главном сервере при добавлении другого узла с бэкендом jgroupsSlave приведет к проблемам!

Вам также могут понадобиться некоторые изменения в конфигурации вашего каталога Infinispan, но я не знаком с этим каталогом. Вы можете проверить документацию: https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#jgroups-backend

person yrodiere    schedule 04.08.2017
comment
Я попробовал ваше второе предложение. Даже с такими условиями master-slave я получаю блокировки. Я не уверен, что является причиной блокировки. Пожалуйста, дайте мне знать ваши еще некоторые мысли. - person user1273969; 04.08.2017