Плагин для работы CDC в реальном времени#
Внимание
Данная функциональность находится в статусе Alpha. Это означает, что она может содержать ошибки, которые не были обнаружены во время синтетического тестирования. В процессе эксплуатации могут возникать проблемы в работе. Эта версия может содержать не все запланированные функции и возможности. Разработчики могут добавлять новые функции или улучшать существующие в следующих релизах.
Описание#
Плагин cdc-manager-plugin позволяет сократить задержку репликации CDC, обрабатывая события и доставляя их до CdcConsumer внутри узла DataGrid.
Плагин предоставляет собой реализацию интерфейса CdcManager. Его задача — перехватывать DataRecords, записываемые в WAL-журнал, и сохранять их во внутреннем буфере в виде массива байт. Поток cdc-worker последовательно считывает данные из буфера и преобразует их в CdcEvents для передачи в CdcConsumer.
Внимание
Ограничение размера буфера — 2 ГБ.
Плагин также отслеживает изменения в BinaryMeta, CacheConfiguration. Эти изменения также передаются в соответствующие методы CdcConsumer.
Обратите внимание, что CdcConsumer работает внутри узла. Учитывайте это при его реализации. Если CdcConsumer долго обрабатывает данные, то возникает риск переполнения буфера. В случае переполнения буфера работа CdcManager остановится, и за работу CDC снова будет отвечать утилита ignite-cdc.
Конфигурация#
Для активации плагина дополните IgniteConfiguration один из приведенных способов:
IgniteConfiguration cfg = ...;
CdcManagerPluginConfiguration plgCfg = new CdcManagerPluginConfiguration();
cfg.setPluginProviders(new CdcMangerPluginProvider(plgCfg));
Конфигурация CdcManagerPluginConfiguration имеет следующие опции:
setBuffSize— размер внутреннего буфера, который хранитDataRecordsиз WAL-журнала;setConsumer— реализацияCdcConsumer;setKeepBinary— еслиtrue, то данные передаются вCdcConsumerв бинарном виде.
<property name="pluginProviders">
<list>
<ref bean="server_securityPlugin"/>
<bean class = "com.sbt.ignite.cdc.CdcManagerPluginProvider">
<constructor-arg ref="cdcManager"/>
</bean>
</list>
</property>
...
<bean id = "cdcManager" class = "com.sbt.ignite.cdc.CdcManagerPluginConfiguration">
<property name="bufferSize" value="1073741824"/>
<property name="consumer" ref="cdcStreamer"/>
<property name="keepBinary" value="true"/>
</bean>
Добавьте в файл конфигурации customIgniteConfiguration.xml в класс IgniteConfiguration.
Утилита ignite-cdc должна быть запущена вместе с узлом DataGrid и сконфигурирована аналогичным образом.
Режимы работы CDC#
CDC может работать в двух режимах:
IGNITE_NODE_ACTIVE— плагин обрабатывает события и поставляет данные вCdcConsumerвнутри узла DataGrid;CDC_UTILITY_ACTIVE— утилитаignite-cdcобрабатывает архивные сегменты WAL и поставляет данные вCdcConsumer.
Режим CDC по умолчанию — IGNITE_NODE_ACTIVE. В случае ошибки в CdcConsumer или в случае переполнения буфера, режим CDC переключается в CDC_UTILITY_ACTIVE. Утилита ignite-cdc автоматически перехватывает управление процессом CDC.
Для переключения режима CDC обратно в IGNITE_NODE_ACTIVE:
Остановите узел DataGrid.
Дождитесь, пока утилита
ignite-cdcзавершит обработку всех WAL сегментов в директориисdcWalPath.Остановите утилиту
ignite-cdc.Удалите файл
сdcWalPath/state/cdc-mode.binисdcWalPath/000000000000***.wal(единственный wal-файл в каталоге)Запустите узел DataGrid.
Запустите утилиту
ignite-cdc.
Логирование#
Рекомендуется настроить логирование процесса onlinecdc в отдельный log-файл. Для этого добавьте запись классов com.sbt.ignite.cdc и org.apache.ignite.cdc в уже используемую конфигурацию log4j2.
Пример конфигурации log4j2
<Logger name="com.sbt.ignite.cdc" level="INFO" additivity="false">
<AppenderRef ref="ONLINECDC"/>
</Logger>
<Logger name="org.apache.ignite.cdc" level="INFO" additivity="false">
<AppenderRef ref="ONLINECDC"/>
</Logger>
</Routing>
<Routing name="ONLINECDC">
<Routes pattern="$${sys:nodeId}">
<Route>
<RollingFile name="Rolling-${sys:nodeId}" fileName="/opt/ignite/server/logs/ONLINECDC-${sys:appId}.log"
filePattern="/opt/ignite/server/logs/ONLINECDC-${sys:appId}-${sys:nodeId}-%i-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level][%t][%logger{36}] %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
Метрики#
Плагин предоставляет следующие метрики для мониторинга процесса CDC в рамках узла DataGrid:
CdcManagerMode— текущий режим работы CDC (IGNITE_NODE_ACTIVEилиCDC_UTILITY_ACTIVE);BufferSize— сконфигурированный размер CDC буфера (в байтах);BufferUsedSize— текущий размер данных, накопленных в буфере (в байтах);BufferMaxUsedSize— максимальный размер данных, хранившихся в буффере (в байтах);LastCollectedSegmentIndex— индекс сегмента последней обработанной записи;LastCollectedSegmentOffset— позиция в сегменте последней обработанной записи;CommittedSegmentIndex— индекс сегмента последней подтвержденной записи;CommittedSegmentOffset— позиция в сегменте последней подтвержденной записи;EventsConsumptionTime— время, затраченное на обработку пачки событий вCdcConsumer(в миллисекундах);LastConsumptionTime— временная метка последней обработки пачки событий вCdcConsumer;MetadataUpdateTime— время, затраченное на обработку метаданных вCdcConsumer(в миллисекундах).
Также в узле DataGrid доступны метрики реализации CdcConsumer.