Поисковый запрос Ignite не возвращает результатов после перезапуска кластера с включенной сохраняемостью

#kubernetes #ignite #gridgain

#kubernetes #ignite #gridgain

Вопрос:

Мы используем GridGain Community edition: 8.8.10 и создали Ignite Cluster в Kubernetes с помощью оператора Apache Ignite. Мы также включили встроенное сохранение.

https://ignite.apache.org/docs/latest/installation/kubernetes/gke-deployment

В среде разработки мы выключаем наш кластер ночью и запускаем его в утренние часы. Когда появляется кластер, он содержит данные, которые были сохранены ранее. Если мы выполняем поиск в кэше с помощью key, он возвращает результат, но если мы используем API запросов для частичного поиска, он не возвращает результатов. Мы проверили размер кэша, и он соответствует размеру записи источника данных. Кроме того, после поиска в кэше с использованием ключа кэша эта запись становится доступной в результатах поиска запроса.

Если мы отключим один из узлов кластера Ignite или клиентских узлов. Поиск текста все еще работает. TextSearch не работает только тогда, когда все узлы кластера уменьшены, а затем увеличены с использованием существующего диска.

Требуется ли какая-либо конфигурация для включения поиска запросов после холодного перезапуска кластера Ignite ?

 <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="metricsLogFrequency" value="300000"/>
        <property name="peerClassLoadingEnabled" value="true"/>
        <property name="clientMode" value="true"/>
        <property name="sqlConfiguration">
            <bean class="org.apache.ignite.configuration.SqlConfiguration">
                <property name="sqlGlobalMemoryQuota" value="300M"/>
                <property name="sqlQueryMemoryQuota" value="30M"/>
                <property name="sqlOffloadingEnabled" value="true"/>
            </bean>
        </property>
        <property name="workDirectory" value="/gridgain/work"/>

        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <!-- set the size of wal segments to 128MB -->
                <property name="walSegmentSize" value="#{128 * 1024 * 1024}"/>
                <!-- Set the page size to 8 KB -->
                <property name="pageSize" value="#{8 * 1024}"/>
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="name" value="Default_Region"/>
                        <!-- Memory region of 20 MB initial size. -->
                        <property name="initialSize" value="#{20 * 1024 * 1024}"/>
                        <!-- Memory region of 8 GB max size. -->
                        <property name="maxSize" value="#{8L * 1024 * 1024 * 1024}"/>
                        <!-- Enabling eviction for this memory region. -->
                        <property name="pageEvictionMode" value="RANDOM_2_LRU"/>
                        <property name="persistenceEnabled" value="true"/>
                        <property name="warmUpConfiguration">
                            <bean class="org.apache.ignite.configuration.LoadAllWarmUpConfiguration"/>
                        </property>
                        <!-- Increasing the buffer size to 1 GB. -->
                        <property name="checkpointPageBufferSize" value="#{1024L * 1024 * 1024}"/>
                    </bean>
                </property>
                <property name="walPath" value="/gridgain/wal"/>
                <property name="walArchivePath" value="/gridgain/wal"/>
            </bean>
        </property>
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.kubernetes.TcpDiscoveryKubernetesIpFinder">
                        <property name="namespace" value="cache"/>
                        <property name="serviceName" value="cache-service"/>
                    </bean>
                </property>
                <property name="NetworkTimeout" value="30000"/>
            </bean>
        </property>
        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="slowClientQueueLimit" value="2000"/>
            </bean>
        </property>
        <property name="cacheConfiguration" ref="igniteCacheDefinition"/>
    </bean>
 

Комментарии:

1. какой запрос вы используете? Это SQL? Не могли бы вы, пожалуйста, показать свой объект запроса (или DDL), который у вас есть?

2. Мы используем текстовый поиск с использованием аннотации @QueryTextField

Ответ №1:

Apache Ignite использует Apache Lucene (в настоящее время это 7.4.0) для текстовых запросов под капотом. В целом индексы на основе Lucene используют различные реализации org.apache.lucene.store.Каталог. В Apache Ignite это пользовательский. В свою очередь, он использует GridLuceneOutputStream на основе оперативной памяти. По сути, это означает, что Ignite native persistence на данный момент не работает для таких типов индексов.

UPD: в случае настроенных резервных копий для секционированного кэша он должен работать как обычный индекс. Например, если вы добавите дополнительный узел в базовую топологию, вы увидите, что происходит перебалансировка. Перебалансировка использует обычные операции кеширования для вставки записей. Индекс Lucene будет построен на новом узле. Напротив, если вы удалите узел из кластера, у вас все равно останется полная копия данных, включая текстовые индексы.

Комментарии:

1. Большое спасибо за вашу помощь. Итак, как это работает в случае перезапуска одного из узлов Ignite. Мы используем секционированный кэш с резервной копией (1)

2. Я не видел этот дополнительный вопрос, я скоро обновлю свой ответ.