Период синхронизации журнала коммитов

В соответствии с периодом синхронизации журнала фиксации cassandra... данные сначала поступают в буфер ОС... затем из буфера ОС, в зависимости от периода синхронизации журнала фиксации, данные буфера синхронизируются с файлом журнала фиксации на диске... и период синхронизации по умолчанию равен 10 секунды.. что, если сервер выйдет из строя в течение этих 10 секунд.. данные будут потеряны? Но клиент получил ответ как УСПЕХ в тот момент, когда данные записываются в буфер журнала фиксации в буфере ОС и в памяти ... но в конечном итоге данные теряются из-за сбоя системы в течение этого 10-секундного окна ... я что-то упустил?


person Rupesh Mukherjee    schedule 07.11.2017    source источник


Ответы (2)


Вы ничего не упускаете. Такие базы данных, как Cassandra и Scylla, не только обеспечивают согласованность в обмен на доступность при сбоях, но, подобно традиционным базам данных, таким как Postgres, также жертвуют надежностью в пользу производительности. Вы можете изменить параметр commitlog_sync на batch или уменьшить commitlog_sync_period_in_ms; обратите внимание, что если вы это сделаете, лучше всего хранить журнал фиксации на другом носителе, а не в каталоге данных.

Причина этого заключается в том, что устойчивость может быть достигнута за счет постоянства, а также за счет репликации. Типичный пользователь Cassandra/Scylla обычно имеет RF = 3 и пишет с уровнем согласованности QUORUM, так что для фактической потери данных вам потребуются скоординированные сбои нескольких машин.

person Duarte Nunes    schedule 08.11.2017

(Отказ от ответственности: я сотрудник ScyllaDB)

Я думаю, что вам не хватает того, что данные записываются в журнал фиксации на диск и в memtable одновременно, и предполагая, что вы используете RF> 1 с CL> 1 (например, кворум), чем даже если конкретный узел вышел из строя, другие реплики все еще будут иметь данные, которые позже можно будет восстановить.

Если вы используете RF > 1 и CL = ONE, также есть вероятность, что если узел выйдет из строя до синхронизации реплики, данные будут потеряны.

Если весь кластер выходит из строя или в случае кластера с одним узлом, ваш клиент действительно может получить SUCCESS ACK обратно, но данные будут потеряны.

Вы можете ознакомиться с документацией по архитектуре Scylla для лучшего понимания:

person TomerSan    schedule 08.11.2017
comment
Это неправильно, в случае кластера с одним узлом или кластера с rf = 1 пользователь получает неправильный статус, он добивается успеха, но на самом деле произошел сбой, и данные потеряны... - person Rupesh Mukherjee; 08.11.2017
comment
Я предполагал RF›1 и написал это явно. Я добавил больше информации. - person TomerSan; 08.11.2017
comment
@RupeshMukherjee в случае rf = 1 постоянный сбой узла приведет к безвозвратной потере данных, что, конечно, намного серьезнее, чем потеря данных за 10 секунд. Вот почему вы не должны использовать rf=1 при любом реальном развертывании Cassandra (если только ваши данные не являются временными). - person Nadav Har'El; 09.11.2017
comment
@nyh - да, это правильно, для отработки отказа всегда нужен RF›1. Но я просто думаю с точки зрения единого развертывания ... (скажем, в dev). Это не будет частичной потерей данных, так как после восстановления сервера ваши постоянные данные (таблица SS) вернутся, но эти 10-секундные данные безвозвратно потерян ... Но в любом случае, спасибо, ребята .. я хотел понять концепцию, которая теперь ясна .. - person Rupesh Mukherjee; 10.11.2017