Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Однако, если вы рассматриваете другие функции mnesia, тогда ответ более сложный.

  • local_content. Если table - таблица local_content, то он может иметь различное содержимое на каждом node в кластере mnesia, поэтому емкость таблицы 4Gb * <number of nodes>
  • фрагментированные таблицы. Mnesia поддерживает настраиваемое пользователем разбиение таблиц или окантовку с использованием фрагментов таблицы. В этом случае вы можете эффективно распространять и распространять данные в своей таблице по нескольким примитивным таблицам. Эти примитивные таблицы могут иметь собственную конфигурацию - скажем, одну таблицу ram_copies и остальные таблицы disc_only_copies. Эти примитивные таблицы имеют те же ограничения по размеру, что упоминалось ранее, и теперь эффективная способность фрагментированной таблицы 4Gb * <number of fragments>. (К сожалению, если вы фрагментируете таблицу, вам нужно изменить код доступа к таблице, чтобы использовать mnesia:activity/4 вместо mnesia:write и друзей, но если вы планируете это заранее, то это будет управляемо).
  • внешние копии Если вам нравится жить на крайнем краю кровотечения, вы можете применить mnesiaex патчи к mnesia и хранить ваши данные таблицы во внешней системе, например Amazon S3 или Токийский кабинет. В этом случае емкость таблицы ограничена встроенным хранилищем.

Ответ 2

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

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

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


disc_copies перенесены из dets в disk_log в 2001 году

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

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

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

Посмотрите на diff для более подробной информации, в частности, mnesia_lib.erl и mnesia_loader.erl.


Источники, поддерживающие dets и лимит 2/4 ГБ

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

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

Имеет смысл сказать это так, как было написано за два года до изменения.

Ответ Ray Boosen основан на часто задаваемых вопросах по Erlang:

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

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

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

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


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

В главе "Изучай себя на эрлангском языке" о Мнезии говорится:

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

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

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

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

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

На компьютере объемом 16 ГБ вы можете:

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

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

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

Выводы

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

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

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