Я работаю над настройкой производительности моего кластера зажигания по мере горизонтального масштабирования. Мой вариант использования — файлы, сохраненные в 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>
Конец
Резервное копирование по умолчанию происходит асинхронно. Вам нужно указать writeSynchronizationMode
to SYNC
на CacheConfiguration
, чтобы сделать иначе.
Самое большое ускорение в вашем случае должно быть установлено с walMode
на LOG_ONLY
на вашем DataStorageConfiguration
.
BACKGROUND удаляет гарантии согласованности в случае сбоя процесса, что, вероятно, вам не нужно.
Я только хочу избежать удаления всего хранилища данных моего кеша зажигания, я не против потерять небольшой объем данных. Действительно ли BACKGROUND рискует этим или просто теряет немного данных? Мое оборудование ужасное, и я ожидаю, что все будет часто падать или циклически включаться и выходить из кластера зажигания.
Я думаю, что это может повредить все ваше постоянное хранилище, но я не уверен в его режимах отказа. Я не уверен, есть ли что-то для «не против потерять небольшую сумму». Может сторонний магазин + writeBehind?
Спасибо! Разница между BACKGROUND и LOG_ONLY для walMode кажется тонкой. Он делает BACKGROUND по-настоящему, если этот IGNITE_WAL_MMAP переопределен как ложный, верно? Но что это делает? Я вижу, что этот флаг включает/отключает отображаемые байтовые буферы, и я 1. не знаю, как изменить настройки, чтобы наблюдать за поведением, и 2. не знаю, какова альтернатива сопоставленным байтовым буферам и какие плюсы/ минусы были бы. Вы знаете?