2015-01-08 1 views
1

У меня есть следующая топология: Infinispan cluster in Invalidation mode, puts выполняется на одном узле, а get выполняется на других. Когда кластер состоит только из двух узлов, все работает хорошо: когда ключ/значение вставлено в один узел, другой, когда его спрашивают в первый раз, запрашивает этот узел и извлекает из него значение. Если ключ обновляется/удаляется, отправляется сообщение о недействительности.Infinispan кластер в режиме Invalidation - get (key) возвращает NULL, хотя некоторые узлы имеют значение

Проблемы возникают, когда в кластере находится более двух узлов: после того, как ключ вставлен в один узел, когда другой запрашивает этот ключ и его значение, он несколько раз возвращает значение и несколько раз возвращает значение NULL ,

Это имеет смысл с определенной точки зрения, поскольку узел запрашивает своих соседей, а некоторые из них имеют значение, а другие - нет. Независимо от того, какие ответы сначала, определит, должен ли ответ быть NULL или реальным значением.

Хотя это имеет смысл, это поведение делает этот режим работы совершенно бесполезным, что заставляет меня думать, что, возможно, я что-то пропустил. Вот моя конфигурация:

<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" xmlns="urn:infinispan:config:7.0"> 
    <jgroups> 
     <stack-file name="tcp" path="jgroups-tcp.xml" /> 
    </jgroups> 
    <cache-container name="SampleCacheManager" statistics="true" default-cache="invalidatedWithClusterCacheLoaderCache" shutdown-hook="DEFAULT"> 
    <transport stack="tcp" cluster="clustered" node-name="NodeA"/> 
    <serialization marshaller="org.infinispan.marshall.core.VersionAwareMarshaller"   version="1.0"> 
    </serialization> 
    <jmx domain="org.infinispan" />  
    <invalidation-cache name="invalidatedWithClusterCacheLoaderCache" mode="SYNC" remote-timeout="20000" > 
     <persistence> 
       <cluster-loader remote-timeout="20000" preload="false" ></cluster-loader> 
     </persistence> 
    </invalidation-cache> 
    </cache-container> 
</infinispan> 

JGroups-tcp.xml:

<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.4.xsd"> 
    <TCP bind_port="7800" port_range="10" 
     recv_buf_size="20000000" 
     send_buf_size="640000" 
     loopback="false" 
     max_bundle_size="64k" 
     bundler_type="sender-sends-with-timer" 
     enable_diagnostics="true" 
     thread_naming_pattern="cl" 

     timer_type="new" 
     timer.min_threads="4" 
     timer.max_threads="10" 
     timer.keep_alive_time="3000" 
     timer.queue_max_size="1000" 
     timer.wheel_size="200" 
     timer.tick_time="50" 

     thread_pool.enabled="true" 
     thread_pool.min_threads="2" 
     thread_pool.max_threads="8" 
     thread_pool.keep_alive_time="5000" 
     thread_pool.queue_enabled="true" 
     thread_pool.queue_max_size="100000" 
     thread_pool.rejection_policy="discard" 

     oob_thread_pool.enabled="true" 
     oob_thread_pool.min_threads="1" 
     oob_thread_pool.max_threads="8" 
     oob_thread_pool.keep_alive_time="5000" 
     oob_thread_pool.queue_enabled="false" 
     oob_thread_pool.queue_max_size="100" 
     oob_thread_pool.rejection_policy="discard"/> 

    <MPING bind_addr="${jgroups.bind_addr:127.0.0.1}" break_on_coord_rsp="true" 
      mcast_addr="${jgroups.mping.mcast_addr:228.2.4.6}" 
      mcast_port="${jgroups.mping.mcast_port:43366}" 
      ip_ttl="${jgroups.udp.ip_ttl:2}" 
      num_initial_members="2" timeout="2000"/> 

    <MERGE3/> 

    <FD_SOCK/> 
    <FD_ALL interval="2000" timeout="5000" /> 
    <VERIFY_SUSPECT timeout="500" /> 
    <BARRIER /> 
    <pbcast.NAKACK use_mcast_xmit="false" 
        retransmit_timeout="100,300,600,1200" 
        discard_delivered_msgs="true" /> 
    <UNICAST3 conn_expiry_timeout="0"/> 

    <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000" 
        max_bytes="10m"/> 
    <pbcast.GMS print_local_addr="true" join_timeout="5000" 
       max_bundling_time="30" 
       view_bundling="true"/> 
    <MFC max_credits="2M" 
     min_threshold="0.4"/> 
    <FRAG2 frag_size="60000" /> 
    <pbcast.STATE_TRANSFER /> 
</config> 

Резюмируя мой вопрос: как он должен работать таким образом, или это неправильно в моем случае?

ответ

1

Кэш недействительности не извлекает удаленные значения. Это описано здесь [1]. Он будет извлекать значения локально в памяти.

Удаленный поиск выполняется с помощью вашего кластер-загрузчика, настроенного в конфигурации сохранения. Это потребует от всех остальных узлов кластера значение. Я изменил один из существующих тестов Infinispan, чтобы иметь более 2 кэшей, и, как вы испытали, в удаленном поиске произошла ошибка. Похоже, что загрузчик кэша возвращает значение null, если узел без значения возвращается до того, у кого есть значение (он принимает первый ответ).

Я зарегистрировал [2], чтобы изучить это.

[1] http://infinispan.org/docs/7.0.x/user_guide/user_guide.html#_invalidation_mode [2] https://issues.jboss.org/browse/ISPN-5134

+0

Спасибо за быстрый и тщательный ответ. – Kikosha

+0

Скажите, есть ли способ установить предпочтение определенного узла для получения значения выше, чем значение другого? – Kikosha

Смежные вопросы