Миграция с Berkeley DB на LevelDB

В 2013 году было выпущено новое ядро ​​биткойнов, и одним из предполагаемых улучшений был переход с Berkeley DB на LevelDB. Согласно примечаниям к выпуску на bitcoin.org :

LevelDB, быстрая нереляционная база данных с открытым исходным кодом от Google, теперь используется для хранения индексов транзакций и блоков. LevelDB работает намного лучше на машинах с медленным вводом-выводом и в целом быстрее .

Аналогичные заявления были сделаны разработчиками ядра биткойна :

LevelDB — переработанная версия собственной системы баз данных Google с открытым исходным кодом — была разработана для обеспечения эффективности и согласованности на массовом оборудовании и превосходит BDB на порядок в некоторых настройках. Предварительные тесты с LevelDB показывают очень хорошие результаты .

Однако в настоящее время в Интернете есть несколько комментариев, критикующих LevelDB. Согласно странице LevelDB в Википедии :

LevelDB широко известен своей ненадежностью, а базы данных, которыми он управляет, подвержены повреждению. Научные исследования прошлых версий LevelDB показали, что в некоторых файловых системах данные, хранящиеся в этих версиях LevelDB, могут стать несогласованными после системного сбоя или сбоя питания. Повреждение LevelDB настолько распространено, что обнаружение повреждения должно быть встроено в приложения, которые его используют.

Таким образом, жалобы на LevelDB таковы:

  • ненадежны, а базы данных подвержены повреждению
  • несколько ошибок из-за фундаментальных недостатков
  • плохое качество кода
  • больше не поддерживается активно (т.е. мертвый проект)

Вопрос 1
Верны ли эти жалобы на LevelDB?

Вопрос 2.
Каков окончательный баланс миграции Bitcoin Core с Berkeley DB на LevelDB? Работает ли LevelDB должным образом? Эта миграция была правильным выбором?

IIRC, Биткойн использует BerkleyDB 4.8 для файлов кошелька и LevelDB для индексов блокчейна. Неофициально я могу сказать вам, что повреждение индекса блокчейна во время сбоев очень распространено, и я обычно советую пострадавшим пользователям повторно загрузить блокчейн.
@NickODell Знаете ли вы, случались ли упомянутые вами сбои до перехода на LevelDB?
Извините, я не знаю.
@NickODell, должен ли я сделать резервную копию моего каталога данных Bitcoin Core (например, chainstate/ и blocks/), чтобы мне не пришлось повторно загружать блокчейн из блока 0 в случае повреждения LevelDB?

Ответы (1)

Как человек, который в то время участвовал в этой миграции, я считаю, что это было правильное решение. LevelDB далек от совершенства, но я не знаю, что еще использовать.

Особенно:

  • BDB намного медленнее для нашего использования (большие атомарные пакетные записи, небольшие случайные чтения).
  • Были также сообщения о повреждении базы данных с помощью BDB в то время, когда он использовался гораздо менее интенсивно, чем LevelDB сейчас.
  • Обновление BDB очень болезненно. У меня сложилось впечатление, что он был разработан для установок, в которых обновление базы данных происходило только под профессиональным контролем. В частности, файлы журнала записи, созданные для обеспечения устойчивости, иногда не читались более поздними версиями. Именно по этой причине релизы Bitcoin Core в течение многих лет придерживались версии BDB 4.8 для кошелька.
  • BDB имеет множество ограничений ресурсов, которые требуют настройки, где неправильно выбранные значения могут привести к общесетевым сбоям (в частности, прочитайте об инциденте в марте 2013 года). В официальной документации об этом говорится Reviewing the Lock subsystem statistics is the best way to determine this value., что я считаю, что это неприемлемо для нашего варианта использования.

Хотя в наши дни о повреждениях баз данных сообщают относительно часто, я считаю, что в основном это аппаратные сбои или проблемы с драйверами. Bitcoin Core, как правило, нагружает диски, память и ЦП гораздо больше, чем большинство программ, что приводит к появлению невидимых в противном случае проблем.

> "[...] о повреждениях базы данных в наши дни сообщается относительно часто [...]" Есть ли активное сообщество LevelDB, которое может предоставить обратную связь/поддержку по этой проблеме?
Я лично никогда не вижу повреждений, но я работаю на относительно новом оборудовании и использую Linux. Но я, вероятно, повторно синхронизирую цепочку в среднем раз в неделю в целях разработки. Это не значит, что я не верю в то, что такие отчеты реальны, но, по крайней мере, в некоторых случаях они появляются из-за ненадежного оборудования или систем хранения — и в этом случае трудно винить программное обеспечение базы данных.