В соответствии с периодом синхронизации журнала фиксации cassandra... данные сначала поступают в буфер ОС... затем из буфера ОС, в зависимости от периода синхронизации журнала фиксации, данные буфера синхронизируются с файлом журнала фиксации на диске... и период синхронизации по умолчанию равен 10 секунды.. что, если сервер выйдет из строя в течение этих 10 секунд.. данные будут потеряны? Но клиент получил ответ как УСПЕХ в тот момент, когда данные записываются в буфер журнала фиксации в буфере ОС и в памяти ... но в конечном итоге данные теряются из-за сбоя системы в течение этого 10-секундного окна ... я что-то упустил?
Период синхронизации журнала коммитов
Ответы (2)
Вы ничего не упускаете. Такие базы данных, как Cassandra и Scylla, не только обеспечивают согласованность в обмен на доступность при сбоях, но, подобно традиционным базам данных, таким как Postgres, также жертвуют надежностью в пользу производительности. Вы можете изменить параметр commitlog_sync
на batch
или уменьшить commitlog_sync_period_in_ms
; обратите внимание, что если вы это сделаете, лучше всего хранить журнал фиксации на другом носителе, а не в каталоге данных.
Причина этого заключается в том, что устойчивость может быть достигнута за счет постоянства, а также за счет репликации. Типичный пользователь Cassandra/Scylla обычно имеет RF = 3
и пишет с уровнем согласованности QUORUM
, так что для фактической потери данных вам потребуются скоординированные сбои нескольких машин.
(Отказ от ответственности: я сотрудник ScyllaDB)
Я думаю, что вам не хватает того, что данные записываются в журнал фиксации на диск и в memtable одновременно, и предполагая, что вы используете RF> 1 с CL> 1 (например, кворум), чем даже если конкретный узел вышел из строя, другие реплики все еще будут иметь данные, которые позже можно будет восстановить.
Если вы используете RF > 1 и CL = ONE, также есть вероятность, что если узел выйдет из строя до синхронизации реплики, данные будут потеряны.
Если весь кластер выходит из строя или в случае кластера с одним узлом, ваш клиент действительно может получить SUCCESS ACK обратно, но данные будут потеряны.
Вы можете ознакомиться с документацией по архитектуре Scylla для лучшего понимания:
- http://docs.scylladb.com/architecture/architecture-fault-tolerance/< /а>
- http://docs.scylladb.com/architecture/console_CL_full_demo/