Как периодически перепрограммировать CDC Cassandra на диск? - PullRequest
1 голос
/ 08 апреля 2019

Желаемое поведение

Я пытаюсь настроить cassandra cdc таким образом, чтобы коммит-фрагменты периодически сбрасывались в каталог cdc_raw (скажем, каждые 10 секунд).

На основе документации http://abiasforaction.net/apache-cassandra-memtable-flush/ и https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/config/configCDCLogging.html я обнаружил:

memtable_flush_period_in_ms - Это свойство таблицы CQLэто указывает количество миллисекунд, после которых необходимо сбросить memtable.Это свойство указывается при создании таблицы.

и

После сброса памяти на диск CommitLogSegment, содержащий данные для таблиц с поддержкой CDC, перемещается в настроенный каталог cdc_raw.

Собирая их вместе, я бы подумал, что установив memtable_flush_period_in_ms: 10000, Кассандра сбрасывает изменения CDC на диск каждые 10 секунд, и это то, чего я хочу добиться.

Моя конфигурация

Исходя из вышеизложенного и моей конфигурации, я ожидаю, что memtable сбрасывается в каталог cdc_raw каждые 10 секунд.Я использую следующую конфигурацию:

cassandra.yaml:

cdc_enabled: true
commitlog_segment_size_in_mb: 1 
commitlog_total_space_in_mb: 2
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000

таблица конфигурации:

memtable_flush_period_in_ms = 10000
cdc = true

Проблема

memtable не периодически сбрасывается в каталог cdc_raw, но вместо этого сбрасывается в каталог commitlogs при достижении определенного порога размера.

В деталях происходит следующее:

Когда сегмент commitlogsegment достигает 1 МБ, он сбрасывается в каталог commitlog.В каталоге commitlog может быть не более 2 коммитов (см. Конфигурацию commitlog_total_space_in_mb: 2).Когда этот порог достигнут, самый старый файл commitlog в каталоге commitlog перемещается в каталог cdc_raw.

Вопрос

Как периодически записывать изменения Cassandra CDC на диск?

1 Ответ

2 голосов
/ 08 апреля 2019

CDC Apache Cassandra в текущей версии хитрый.

Журнал фиксации является «глобальным», что означает, что изменения в любой таблице сохраняются в том же журнале фиксации.

  • Ваш сегмент журнала фиксации может (и будет) содержать журналы из таблиц, отличных от таблиц с включенным CDC. К ним относятся системные таблицы.
  • Сегмент журнала фиксации удаляется и перемещается в каталог cdc_raw после очистки всех журналов в сегменте журнала фиксации.

Таким образом, даже если вы настраиваете свою таблицу с поддержкой CDC для сброса каждые 10 секунд, журналы из других таблиц все еще находятся в том же сегменте журнала фиксации, что препятствует перемещению журнала фиксации в каталог CDC.

Нет способа изменить поведение, кроме как попытаться ускорить процесс, уменьшив commitlog_segment_size_in_mb (но вы должны быть осторожны, чтобы не уменьшить его до размера, меньшего, чем ваш единичный реквизит записи).

Это поведение улучшено и будет выпущено в следующей основной версии v4.0. Вы можете читать свой CDC так же быстро, как синхронизируется журнал фиксации на диск (поэтому, когда вы используете periodic синхронизация журнала фиксации, вы можете читать свои изменения каждые commit_log_sync_period_in_ms миллисекунды.

Подробнее см. CASSANDRA-12148 .

Кстати, вы устанавливаете commitlog_total_space_in_mb на 2, что я определенно не рекомендую. Сейчас вы видите, что Cassandra очищает каждую таблицу, когда размер вашего журнала фиксации превысил это значение, чтобы освободить место. Если вы не можете восстановить свое место в журнале коммитов, то Кассандра начнет выдавать ошибку и отклоняет записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...