Конфигурация Ignite 2.6-IGFS Speed ​​— выполнять резервное копирование/запись на диск асинхронно?

Я работаю над настройкой производительности моего кластера зажигания по мере горизонтального масштабирования. Мой вариант использования — файлы, сохраненные в IGFS. Медианный размер будет около 2 M, максимальный размер 120G, с 95 процентилем около 1 G. Сильный перекос в сторону меньшего размера.

Моя модель заключается в том, что потеря данных — это нормально, поскольку любой фрагмент данных можно восстановить при снижении производительности. Тем не менее, я не хочу, чтобы мой кластер ignite был поврежден, если участники выйдут из строя, так как повторная выборка всех данных будет очень плохим днем ​​​​для моих пользователей (и, соответственно, для меня).

С другой стороны, я хочу, чтобы сохранения были максимально быстрыми. ТАКИМ ОБРАЗОМ, я придерживаюсь подхода, согласно которому можно удалить данные и потерять некоторое количество данных, если несколько узлов выйдут из строя, если я не потеряю более 10% своих данных в результате сбоя.

У меня есть FileSystemConfiguration с именем «igfs», и я хочу, чтобы она лениво сохранялась в DataStorageConfiguration, также называемой «igfs».

Чтобы иметь некоторую избыточность, я настроил ignite на использование 1 резервной копии с IgniteConfiguration.AtomicConfiguration.backup = 1. Я думаю, это означает, что каждая запись в ignite записывается в один дубликат. Однако я хочу, чтобы это резервное копирование происходило АСИНХРОННО. Я не могу найти способ сделать это для записей IGFS. Есть ли способ?

Кроме того, есть ли способ настроить igfs для отложенной записи на уровень сохраняемости по умолчанию, который основан на диске? Я действительно хочу закончить свои записи с моего клиента и иметь данные только в памяти. Он может сбрасывать на диск в свое время.

<?xml version = .....
<beans ....


<bean id = "ignite.cfg" class = "org.apache.ignite.configuration.IgniteConfiguration">
    <property name = "marshaller">
         <bean class = "org.apache.ignite.internal.binary.BinaryMarshaller" />
    </property>

   <property name = "failureDetectionTimeout" value = "10000" />
   <property name = "clientFailureDetectionTimeout" value = "10000" />
   <property name = "peerClassLoadingEnabled" value = "true" />
   <property name = "metricsLogFrequency" value = "#{120*1000}"/>
   <property name = "atomicConfiguration">
        <bean class = "org.apache.ignite.configuration.AtomicConfiguration">
              <property name = "backups" value = "1" />
        </bean>
   </property>

   <property name = "fileSystemConfiguration" >
        <list>
              <bean class = "org.apache.ignite.configuration.FileSystemConfiguration">
                  <property name = "name" value = "igfs" />
                  <property name = "blockSize" value = "262144" />
                  <property name = "bufferSize" value = "262144" />
                  <property name = "defaultMode" value = "DUAL_ASYNC" />
                  <property name = "dataCacheConfiguration" >
                          <bean class = "org.apache.ignite.configuration.CacheConfiguration">
                                <property name = "onheapCacheEnabled" value = "true" />
                                <property name = "evictionPolicy">
                                      <bean class = "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy">
                                                <property name = "maxMemorySize" value = "#{10L * 1024 * 1024 * 1024}" />
                                      </bean>
                                </property>
                                <property name = "eagerTtl" value = "true" />
                                <property name = "expiryPolicyFactory">
                                     <bean class = "javax.cache.expiry.CreatedExpiryPolicy" factory-method = "factoryOf"?
                                           <constructor-arg>
                                                 <bean class = "javax.cache.expiry.Duration">
                                                      <constructor-arg value = "HOURS"/>
                                                      <constructor-arg value = "15"/>
                                                 </bean>
                                           </constructor-arg>
                                     </bean>
                               </property>
                               <property name = "atomicityMode" value = "ATOMIC" />
                               <property name = "statisticsEnabled" value = "true" />
                          </bean>
                  </property>
             </bean>
        </list>
   </property>
   <property name = "communicationSpi">
       <bean class = "org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
           <property name = "messageQueueLimit" value = "500"
       </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.vm.TcpDiscoveryVmIpFinder">
                              <property name = "addresses">
                                   <list>
                                          <value>IP:47500..47509</value>
                                          <value>IP:47500..47509</value>
                                   </list>
                              </property>
                        </bean>
               </property>
          </bean>
    </property>
    <property name = "dataStorageConfiguration">
           <bean class = "org.apache.ignite.configuration.DataStorageConfiguration">
                   <property name = "dataRegionConfigurations">
                        <list>
                              <bean class = "org.apache.ignite.configuration.DataRegionConfiguration">
                                    <property name = "name" value = "igfs" />
                                    <property name = "persistenceEnabled" value = "true" />
                                    <property name = "metricsEnabled" value = "true" />
                                    <property name = "maxSize" value = "#{35: * 1024 * 1024 * 1024}" />

                              </bean>
                        </list>
                   </property>
                  <property name = "defaultDataRegionConfiguration">
                             <property name = "persistenceEnabled" value = "true" />
                             <property name = "metricsEnabled" value = "true" />
                             <property name = "maxSize" value = "#{35: * 1024 * 1024 * 1024}" />
                  </property>
                  <property name = "systemRegionMaxSize" value = "#{6L * 1024 * 1024 * 1024}" />
          </bean>
    </property>
</bean>

Конец

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Резервное копирование по умолчанию происходит асинхронно. Вам нужно указать writeSynchronizationMode to SYNC на CacheConfiguration, чтобы сделать иначе.

Самое большое ускорение в вашем случае должно быть установлено с walMode на LOG_ONLY на вашем DataStorageConfiguration.

Спасибо! Разница между BACKGROUND и LOG_ONLY для walMode кажется тонкой. Он делает BACKGROUND по-настоящему, если этот IGNITE_WAL_MMAP переопределен как ложный, верно? Но что это делает? Я вижу, что этот флаг включает/отключает отображаемые байтовые буферы, и я 1. не знаю, как изменить настройки, чтобы наблюдать за поведением, и 2. не знаю, какова альтернатива сопоставленным байтовым буферам и какие плюсы/ минусы были бы. Вы знаете?

MeowCode 11.04.2019 20:59

BACKGROUND удаляет гарантии согласованности в случае сбоя процесса, что, вероятно, вам не нужно.

alamar 12.04.2019 10:28

Я только хочу избежать удаления всего хранилища данных моего кеша зажигания, я не против потерять небольшой объем данных. Действительно ли BACKGROUND рискует этим или просто теряет немного данных? Мое оборудование ужасное, и я ожидаю, что все будет часто падать или циклически включаться и выходить из кластера зажигания.

MeowCode 12.04.2019 22:46

Я думаю, что это может повредить все ваше постоянное хранилище, но я не уверен в его режимах отказа. Я не уверен, есть ли что-то для «не против потерять небольшую сумму». Может сторонний магазин + writeBehind?

alamar 14.04.2019 21:04

Другие вопросы по теме