LINUX.ORG.RU

журналирование: mongodb и postgresql

 ,


0

5

копаю тут mongodb и нашел что там есть настройка storage.journal.commitIntervalMs которая настраивает сохранять журнал каждые 50ms - https://docs.mongodb.com/manual/core/journaling/

отсюда вопрос это что-же получается возможна ситуация когда клиент сохраняет в mongodb ключ, она ему отвечает что сохранила, он продолжает что-то делать будучи уверенным что ключ сохранен, а в это время не дожидаясь очередного сохранения на диск журнала все падает и ключ мы теряем?

далее у update мы видем некий writeConcern - https://docs.mongodb.com/manual/reference/write-concern/ где есть ключ j:true который вроде как заставляет сохранять журнал.

это решает эту проблему?

и тут я вспомнил что у postgresql есть параметр wal_writer_delay = 200ms, что-же получается и у postgresql может быть такая ботва что клиент думает что строка сохранена а все накрылось до сброса журнала на диск???

просвятите плиз!

★★

В постгресе коммит транзакции означает, что она записана на диск, поэтому если твоё оборудование не обманывает, то всё будет нормально. wal_writer_delay это просто задержка при записи WAL-лога.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

как я понимаю через WAL проходит все, не только транзакции но и обычные INSERT и получается все накроется если электричество рубанется раньше чем журнал запишется

quester ★★
() автор топика

я ведь правильно понимаю что сначала происходит запись в журнал, потом собственно создание ключа/строки и все это не сброшено на диск до тех пор пока не придет время сбрасывать на диск журнал, хотя ответ клиенту о успешной записи уже отослан?

quester ★★
() автор топика
Ответ на: комментарий от quester

Если бы я дизайнил подобную систему, то в таком режиме работы я бы не отвечал клиенту пока не сбросились на диск накопленые за 50мс данные. Это был бы удар по latency одной операции (без урона параллелизму), но ведь это такой режим и клиент выбирал бы что он хочет

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

Господи, дожили, люди гадают на конфигах. А не пойти ли тебе в документацию?

В postgresql, например, есть специальная опция synchronous_commit. Во включённом состоянии (по умолчанию), клиенту будет сообщено о успешном завершении транзакции только после того как данные будут записаны на диск. А если её выключить, то да, можно потерять сколько-то последних коммитов, но база останется при этом в консистентном состоянии.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

отдельный не обернутый в транзакцию insert или update при это считается коммитом даже при том что отключен автокоммит, так?

quester ★★
() автор топика
Ответ на: комментарий от quester

В pg ничего не бывает вне транзакций. Если отключен автокоммит, транзакция просто откатится.

slovazap ★★★★★
()

writeСoncern гарантирует что столько нод, сколько указано приняли запрос. с j=true - гарантирует, что записали в журнал. что бьет по скорости, само-собой (оно и без j=true по скорости бьет, впрочем).
в последних версиях монги да, пишется сначала в журнал, потом уже в базу (WAL). в старых было наоборот.
но в целом, монга тебе ничего никогда не гарантирует. зато быстро.

iSage ★★★★
()

wal_writer_delay это настройка для тех к кого выключен synchronous_commit. По умолчанию он включён и запись в WAL производится в момент commit.

maxcom ★★★★★
()

WiredTiger syncs the buffered journal records to disk according to the following intervals or conditions:

Журнал - это промежуточный буфер. Если записалось - значит как минимум там, и потом домержится в базу. Так все базы работают.

writeConcern - для гарантий что данные разъехались по репликам. Чтобы не было коллизий на мерже, если с кластером что-то приключится.

Vit ★★★★★
()
Ответ на: комментарий от quester

В реальности ты можешь настроить репликацию и отключить журналирование. Но с одним сервером отключать журналирование это полная дурь, тогда реально будешь данные за 50мс терять.

Vit ★★★★★
()
Ответ на: комментарий от i-rinat

Может, не стоит вместо БД с ACID использовать MongoDB?

MongoDB - шардирование из коробки, но отсутствие транзакций и изоляции

Postgresql - транзакции и изоляция, но шардировать нужно руками изобретая велосипед (в соседней теме я его изобретаю миграция данных / виртуальных шардов)

MongoDB к счастью CAS (compare and set/swap) можно сделать чтобы исключит гонку при чтении/изменении - без этого я бы ее вообще не рассматривал

quester ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.