#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. Я не видел этот дополнительный вопрос, я скоро обновлю свой ответ.