Продолжаю сообщать о новостях и советоваться, точнее пытаюсь
В ReOpenLDAP, как и в исходном OpenLDAP, до последнего времени не было какого-либо средства контроля LMDB-базы.
При этом НЕ важно что вероятность таких ошибок мала, и также НЕ столь важно что стало из причиной: программные ошибки в LMDB, slapd, драйвере диска или прошивки системы хранения.
Важно, что без средства контроля их не возможно своевременно обнаружить, а только "когда всё упало".
Дискуссии о необходимости контроля быстро заканчивают, как только становиться понятно что последствия придётся компенсировать за счет собственной зарплаты...
На днях возможность такого контроля была добавлена -
теперь есть утилита mdb_chk.
Это решает массу проблем, но не достаточно для промышленной эксплуатации с учетом всех особенностей LMDB.
В LMDB есть три недочета, или проблемы если угодно:
- при включении writemap (без которого не обойтись при нагрузке по записи) база может быть повреждена, см.
https://github.com/ReOpen/ReOpenLDAP/issues/1 - нет какого-либо контроля целостности отдельных содержания страниц, например контрольной суммы.
- нет надежного способа проверить консистентность базы (mdb_chk проверяет только целостность структуры, но не потерю изменений или искажение данных).
Самая актуальная проблема пожалуй первая, но устранение любой из трех ведет к потере совместимости с оригинальной версией LMDB из OpenLDAP.
--
Первая проблема будет устранена расширением списка атрибутов meta-страниц. Будет добавлен атрибут "datasync", ненулевое значение которого будет означать что мета-страница была зафиксирована правильным надежным образом - после записи всех страниц с данными. В противоположность этому, при быстрой фиксацией транзакций с последующей асинхронной дозаписью данных, datasync будет устанавливаться в ноль, а при повторной быстрой фиксации будет использоваться та же мета-страница. Полноценная "правильная" фиксация будет выполняться при формировании контрольных точек (параметр checkpoint для mdb) и при штатном (не аварийном) закрытии базы.
Далее, при открытии базы будут преимущественно выбираться безопасно зафиксированные страницы, с ненулевым datasync. Таким образом, после крушения всей системы (например при внезапном выключении питания), база данных будет открываться с точки гарантирующей консистентность всех данных. А мета-страницы "быстрой" фиксации будут использоваться фактически только во время работы нескольких процессов с одной базой.
Предположительно, файлы LMDB-базы созданные новой версией будут совместимы с оригинальной версией LMDB. Но при этом наша новая версия будет воспринимать старые файлы только как не небезопасные.
--
Вторая проблема будет устранена добавлением в заголовок каждой страницы контрольной сумму данных. К сожалению, это точно поломает совместимость с оригинальной версией LMDB, так как измениться формат заголовка и размер полезных данных страницы.
--
С третьей проблемой сложнее. У нас есть хорошее инженерное понимание как следует её устранять (см.
http://en.wikipedia.org/wiki/Merkle_tree, кстати, git действует именно так). Но объем изменений программного кода при этом будет (предположительно) кардинальным. Поэтому пока представляется не рациональным "лечить" LMDB. Возможно что проще будет переписать как было задумано (см.
https://github.com/ReOpen/ReOpenLDAP/issues/7)
--
Как обычно, конструктивная критика, пожелания и соображения - всё приветствуется.