Какова емкость базы данных Mnesia?

В некоторых местах указывается период 2 ГБ. В некоторых местах указано, что это зависит от количества узлов.


person user52543    schedule 07.01.2009    source источник


Ответы (3)


Довольно велико, если ваш вопрос: «Какова емкость хранилища базы данных mnesia, состоящей из огромного количества disc_only_copies таблиц» - вы в значительной степени ограничены доступным дисковым пространством.

Более простой вопрос: какова максимальная вместимость одной таблицы мнезии разных типов. ram_copies таблицы ограничены доступной памятью. disc_copies таблицы ограничены их dets серверной частью (Hakan Mattsson on Mnesia) - это ограничение 4Gb данных на данный момент.

Итак, простой ответ заключается в том, что простая таблица disc_copies может хранить до 4 Гб данных, прежде чем они столкнутся с проблемами. (Mnesia на самом деле не дает сбоев, если вы превысите ограничение на размер на диске - часть таблицы ram_copies продолжает работать, поэтому вы можете исправить это, удалив данные или приняв другие меры во время выполнения)

Однако если учесть другие особенности мнезии, то ответ будет более сложным.

  • Таблицы local_content. Если таблица является local_content таблицей, то она может иметь разное содержимое на каждом узле в кластере mnesia, поэтому емкость таблицы составляет 4Gb * <number of nodes>
  • фрагментированные таблицы. Mnesia поддерживает настраиваемое пользователем разбиение таблицы на разделы или сегментирование с использованием фрагментов таблиц. В этом случае вы можете эффективно распределить и перераспределить данные в вашей таблице по ряду примитивных таблиц. Каждая из этих примитивных таблиц может иметь свою собственную конфигурацию - скажем, одна таблица ram_copies и остальные таблицы disk_only_copies. Эти примитивные таблицы имеют такие же ограничения размера, как упоминалось ранее, и теперь эффективная емкость фрагментированной таблицы составляет 4Gb * <number of fragments>. (К сожалению, если вы фрагментируете свою таблицу, вам придется изменить код доступа к таблице, чтобы использовать mnesia:activity/4 вместо mnesia:write и друзей, но если вы спланируете это заранее, это управляемо)
  • внешние копии Если вам нравится жить на переднем крае, вы можете применить mnesiaex исправляет mnesia и сохраняет данные вашей таблицы во внешней системе, например Amazon S3 или Tokyo Cabinet. В этом случае емкость таблицы ограничена внутренним хранилищем.
person archaelus    schedule 07.01.2009
comment
Это потрясающе. Большое спасибо. - person user52543; 08.01.2009
comment
Насколько мне известно, dets может обрабатывать файлы размером 2 ГБ, а не 4 ГБ, что является пределом для disc_copies. Существует экспериментальная 64-разрядная версия dets, которая может обрабатывать файлы гораздо большего размера, но еще никто не использовал ее в продакшене. - person Happi; 10.01.2014
comment
Могу подтвердить, что это 2 ГБ, в настоящее время возникают проблемы на производстве, потому что я рассчитывал на 4 ГБ - будьте осторожны. - person Sam van Herwaarden; 19.07.2021

TL; DR: емкость хранилища базы данных Mnesia ограничена только * доступной оперативной памятью.

* Предполагая, что вы используете типы таблиц ram_copies или disc_copies. Кроме того, если вы храните много данных в disc_copies таблице, они должны быть прочитаны с диска при запуске, что может увеличить время запуска сверх допустимого.


Этот ответ противоречит двум существующим ответам, когда речь идет о таблицах типа disc_copies. Позвольте мне сначала выделить несколько общих моментов:

  • Таблица мнезии типа ram_copies ограничена только доступной оперативной памятью (за исключением 32-битной машины). Данные хранятся в таблице ETS.
  • Таблица мнезии типа disc_only_copies хранится в таблице Dets. Таблицы Dets ограничены 2 ГБ из-за ограничений в формате файла.
  • Очевидный способ обойти это ограничение - создать больше таблиц, возможно, с помощью фрагментации таблиц.
  • Схема также хранится в таблице Dets, поэтому информация, описывающая все существующие таблицы, также ограничена 2 ГБ. Однако вы, скорее всего, столкнетесь с другими ограничениями, прежде чем достигнете этого.
  • Таблица мнезии типа disc_copies хранится и в ОЗУ и на диске, поэтому она ограничена доступной ОЗУ - и, возможно, чем-то еще?

Ниже я попытаюсь показать, что Mnesia не устанавливает никаких ограничений на размер disc_copies таблицы. Однако обратите внимание, что многие программисты на Erlang считают, что disc_copies таблиц ограничены 2 ГБ. Об этом говорится в принятом ответе на этот вопрос, который на момент написания статьи превосходит этот ответ в 7 раз.


disc_copies перемещен из dets в disk_log в 2001 г.

Обычно считается, что disc_copies таблиц поддерживаются таблицами Dets. Насколько я могу судить, так было до Erlang / OTP R7B-4 (выпущенного 30 сентября 2001 г.). Из README:

  -- mnesia -----------------------------------------------------------------

        OTP-3712 - Speed/load improvements disc_copies tables are not 
                   implemented with dets anymore.

См. для более подробной информации, а также более подробную информацию. mnesia_loader.erl.


Источники с поддержкой dets и лимитом 2/4 ГБ

ответ Архелая взят из http://erlang.org/~hakan/mnesia_consuming.txt, в котором объясняется, что disc_copies таблицы находятся в таблицах ets и dets. Однако, глядя на индекс каталога, мы видим, что этот документ датирован 1999 годом:

[TXT] mnesia_consumption.txt  26-Oct-1999 10:57    10k  

В этом есть смысл, потому что это было написано за два года до изменений.

Ответ Рэя Бусена взят из FAQ по Erlang:

11.5 Сколько данных можно хранить в Mnesia?

Dets использует 32-битные целые числа для смещения файлов, поэтому максимально возможная таблица мнезии (на данный момент) составляет 4 Гб.

На практике ваша машина замедлится до ползания, прежде чем вы достигнете этого предела.

В FAQ говорится, что по крайней мере с января 2001 г. (см. самая ранняя копия на Wayback Machine). Это означает, что эта запись в FAQ датируется до перехода на disk_log и долгое время не обновлялась. (В любом случае ограничение на размер таблицы Dets составляет 2 ГБ, а не 4 ГБ.) Я отправил a запрос на вытягивание для FAQ.


Источники, поддерживающие более высокие лимиты

В главе Learn You Some Erlang о Mnesia говорится:

ram_copies
Эта опция позволяет сохранять все данные исключительно в ETS, то есть только в памяти. Память должна быть ограничена теоретическим значением 4 ГБ (а практически около 3 ГБ) для виртуальных машин, скомпилированных на 32-битной основе, но этот предел сдвигается дальше на 64-битных виртуальных машинах при условии, что доступно более 4 ГБ памяти.

disc_only_copies
Этот параметр означает, что данные хранятся только в DETS. Только диск, поэтому объем хранилища ограничен 2 ГБ для DETS.

disc_copies
Этот параметр означает, что данные хранятся как в ETS, так и на диске, то есть как в памяти, так и на жестком диске. Таблицы disc_copies не ограничены лимитами DETS, так как Mnesia использует сложную систему журналов транзакций и контрольных точек, которые позволяют создавать резервные копии таблицы на диске в памяти.

Я не уверен, когда это было написано, но приведенный выше текст существует в самая ранняя копия Wayback Machine, датированная апрелем 2012 года.

В сообщении об эрланговых вопросах под названием «забить Мнезию до смерти (было RE : Использование 4 Гб оперативной памяти с Erlang VM) " от 7 ноября 2005 г. Ульф Вигер пишет:

На машине с 16 ГБ вы можете:

  • запускать 6 миллионов одновременных процессов (с помощью erlang: hibernate я фактически смог запустить 20 миллионов - время создания: 6,3 мкс, время передачи сообщения: 5,3 мкс, и у меня было 1,8 ГБ в запасе).

  • заполните мнезию как минимум 12 ГБ данных, но подумайте, как вы хотите их представить, поскольку 64-битный размер слова немного взрывает ситуацию.

  • ведите таблицу disk_copy размером 10 ГБ в mnesia. Время загрузки и стоимость дампа журнала кажутся приемлемыми (загрузка 10 минут, сброс занимает некоторое время, но довольно хорошо работает в фоновом режиме).

Выводы

Путаница, похоже, связана с отсутствующей или устаревшей информацией из официальных источников:

  • В документации Mnesia не упоминаются ограничения на размер таблицы.
  • В часто задаваемых вопросах Erlang говорится, что Mnesia подлежит ограничению на размер Dets 4 ГБ, но этот ответ был написан до изменения dets на disk_log
  • Единственный другой документ в домене erlang.org - это документ Хокана Маттссона, созданный до изменения dets на disk_log.

LYSE кажется первым «авторитетным» источником, в котором упоминается disc_copies таблиц, не подпадающих под ограничение размера таблицы Dets.

person legoscia    schedule 11.03.2018

Согласно документации, это 4 ГБ. Раздел 11.5

http://erlang.org/faq/mnesia.html

person Ray Booysen    schedule 07.01.2009
comment
Влияет ли это как-нибудь на количество узлов? Будет ли Mnesia распространять / шардировать себя? - person user52543; 07.01.2009
comment
По состоянию на июнь 2017 г. - person amirouche; 25.06.2017