2016-11-01 1 views
2

Я бы хотел использовать кластер Ignite для нагрева кеша PARTITIONED из существующей базы данных. Существующая база данных не разбивается на разделы и не сканируется, поэтому я хотел бы выполнить одно сканирование, когда кеш создается кластером. По завершении задания результатом будет кеш, содержащий все данные из существующей базы данных, разделенные и равномерно распределенные по кластеру.Как инициировать нагрев при создании кеша?

Как реализовать задание, выполняемое при создании кеша Ignite?

ответ

2

Ignite интегрируется с базовыми магазинами через CacheStore [1] реализации. Обратитесь к [2] за информацией о вашем конкретном случае использования.

[1] https://apacheignite.readme.io/docs/persistent-store

[2] https://apacheignite.readme.io/docs/data-loading

+0

Спасибо @Valentin. При использовании 'CacheStore', откуда следует вызывать' IgniteCache.loadCache'? При использовании 'IgniteDataStreamer', откуда следует вызывать' addData'? Похоже, что сервис не работает, потому что нет гарантии, что 'execute' будет вызываться только один раз для жизни кластера. Альтернативно, 'EVT_CACHE_STARTED', кажется, публикуется локально на каждом узле, поэтому события сетки не будут работать. Вообще говоря, вопрос заключается в том, где реализовать логику «один раз в кэш», например, кеширование. –

+1

Вы можете создать клиентский узел, вызвать 'IgniteCache.loadCache' и остановить клиента, когда процесс будет завершен. То же самое касается «IgniteDataStreamer», обычно это клиентский узел, который загружает данные из БД и передает его в серверные узлы. –

1

Вы можете создать Service, который работает сразу на старте кластера, а затем отменяет себя. Он может использовать кеш для хранения состояния, поэтому он не будет запускаться, если он будет развернут в кластере во второй раз.

Следующая аннотация Сервис работает executeOnce один раз в кластере в первый раз он развернут после запуска кластера:

abstract class ExecuteOnceService extends Service { 

    val ExecuteOnceCacheName = "_execute_once_service" 

    val config = new CacheConfiguration[String, java.lang.Boolean](ExecuteOnceCacheName) 
    .setCacheMode(CacheMode.PARTITIONED) 
    .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL) 

    @IgniteInstanceResource 
    var ignite: Ignite = _ 

    override def execute(ctx: ServiceContext): Unit = { 
    val cache = ignite.getOrCreateCache(config) 
    val executed = cache.getAndPutIfAbsent(ctx.name(), java.lang.Boolean.TRUE) 
    if (executed != java.lang.Boolean.TRUE) executeOnce(ctx) 
    ignite.services().cancel(ctx.name()) 
    } 

    def executeOnce(ctx: ServiceContext): Unit 

} 
+0

@valentin Thx для вашего ответа. Считаете ли вы, что это разумный подход? – darin