Мнезия: преимущества и отличия

22

Каковы преимущества Mnesia над основными реализациями баз данных SQL и чем они отличаются?

Могу ли я использовать базу данных для хранения действительно огромных объемов данных без заметного снижения производительности?

Ясир Арсанукаев
источник
4
Я думаю, что этот вопрос требует немного большего внимания. Можете ли вы перечислить критерии, которые вы бы использовали для оценки преимуществ или отличий от других реализаций базы данных? Это действительно похоже на кандидата в статью / список Википедии, а не то, на что можно ответить здесь. Кроме того, учитывая, что Mnesia действительно больше похожа на CouchDB, было бы несправедливо спрашивать, как она сравнивается с «основными» реализациями SQL, не называя тех, с которыми вы хотите сравнить. По сравнению с SQLServer или Oracle это даже не близко к узлу для производительности.
Jcolebrand

Ответы:

31

Извините за опоздание на вечеринку. :) Вот мой ответ, основанный на использовании Mnesia с 1996 года и различных других технологий баз данных с 1988 года.

Mnesia и MySQL действительно разные звери, и какой из них лучший, во многом зависит от того, как вы собираетесь его использовать.

Если ваше приложение написано на Erlang, Mnesia позволяет вам хранить данные в том же пространстве памяти, что и ваше приложение, что означает, что вы можете извлечь один объект данных за несколько микросекунд. Это невозможно в MySQL, так как ваше приложение и база данных будут разделены в памяти. Причина, по которой Mnesia может сделать это и при этом быть надежной, заключается в том, что Erlang реализует «защиту» памяти на уровне языка.

В целом, базы данных SQL, как правило, предпочитают пропускную способность по сравнению с задержкой, а когда дело доходит до задержки, Mnesia + Erlang, как правило, выдающиеся. Вам нужно решить, какой из них наиболее важен для вас. Как сказано в документации (выше), целевыми приложениями Mnesia были приложения для телекоммуникационной коммутации, где требования к времени отклика, например, для настройки вызова, составляли около 20 мс. По сути, это означало, что вы могли читать из базы данных только в том случае, если данные находились в разделяемой памяти, но избегали записи в постоянное хранилище для каждой настройки вызова. OTOH, эти приложения практически не нуждаются в специальной поддержке запросов и не используют очень большие наборы данных. Была проделана определенная работа по расширению пригодности Mnesia для других доменов, но это не является приоритетом для команды разработчиков Erlang / OTP. Mnesia - это то, что есть, и, скорее всего, так и останется.

В приведенной выше ссылке, где Mnesia и MySQL сравниваются по скорости, нужно помнить, что он находится в eJabberd, который работает на одном сервере, если это MySQL, и запускает полностью реплицированную базу данных, если это Mnesia - и большие кластеры eJabberd могут иметь до 10 или более эрланговых узлов (и, следовательно, 10 или более реплик Mnesia). С точки зрения избыточности это довольно смешно и дорого, и Mnesia ни в коем случае не заставляет вас делать это. Это, очевидно, дает быстрое чтение на каждом узле, но запись будет очень дорогой. Несколько сравнений, которые я прочитал, закончились сравнением распределенной Mnesia с MySQL с одним узлом; если избыточность не требуется для MySQL, она не должна требоваться и для Mnesia. Mnesia достаточно гибка, позволяя выбирать шаблоны репликации, а расположение данных прозрачно для приложения.

Mnesia также не ограничивается 2 ГБ на таблицу (хотя есть особый вариант хранения ). Самая большая из известных мне баз данных Mnesia имеет около 600 ГБ данных в (64-битной) ОЗУ + диск - хотя я этого не рекомендую. Что-нибудь до 10-20 ГБ должно быть прекрасно с современным оборудованием, но пропустите disc_only_copies полностью и используйте disc_copies - покупайте больше RAM, если вам нужно. Я бы дважды подумал, прежде чем использовать поддержку шардинга (mnesia_frag) - она ​​работает, но редко стоит того.

Возможно, самое большое различие между Mnesia и MySQL - это сам SQL: Mnesia на самом деле не обладает сопоставимой функциональностью; QLC предлагает некоторую поддержку специальных запросов, но он не находится в той же лиге, что и SQL, и не является уровнем оптимизации запросов. В области инструментов и обеспечения MySQL также превосходит другие, и, если вам нужна аналитика, нет сомнений, какой из них вы должны выбрать (т.е. НЕ Mnesia).

Лучший способ увидеть Mnesia - это расширение языка эрланг. Он предоставляет данные прямо у вас под рукой и отлично подходит для небольших наборов данных, где структура данных и шаблоны доступа хорошо известны. С этой целью использование MySQL примерно так же неудобно, как использование Mnesia для вещей, где MySQL работает лучше всего.

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

user30792
источник
3
Спасибо за ответ. Это лучшее объяснение, которое я читал по мнезии.
Акшат Дживан Шарма
1
Спасибо, что поделились с нами своим опытом, это гораздо ценнее, чем чтение любого блога.
Рахул Гаутам
Отличный ответ, но сейчас я еще больше запутался.
ХИРА ТАКУР
Очень подробный ответ. Так что, если я правильно понимаю Mnesia - было бы идеально для хранилища ключей / значений в памяти вместо Memcached или Redis или аналогичного решения, где вам нужна скорость и нет необходимости в анализе или постоянном хранилище с возможностью «SQL-запроса»? Для всего остального я лучше использую что-то вроде MariaDB / Postgres или Mongo / Cassandra / RIAK? Чтобы уточнить - я изучаю Elixir, а не Erlang (из Ruby / Perl), и пытаюсь найти лучший стек для меня, чтобы заменить Rails / Sinatra на MariaDB & Redis
konung
13

Из документации :

Mnesia - это распределенная система управления базами данных, подходящая для телекоммуникационных приложений и других приложений Erlang, которые требуют непрерывной работы и мягких свойств в реальном времени. Это один из разделов Открытой телекоммуникационной платформы (OTP), которая представляет собой платформу системы управления для построения телекоммуникационных приложений.

В частности, очень высокий уровень отказоустойчивости, который требуется во многих системах без остановок, в сочетании с требованиями к СУБД для работы в том же адресном пространстве, что и приложение, привели нас к внедрению совершенно новой СУБД. называется Мнезия. Mnesia реализована и тесно связана с языком программирования Erlang и обеспечивает функциональность, необходимую для реализации отказоустойчивых телекоммуникационных систем. Mnesia - это многопользовательская распределенная СУБД, специально созданная для промышленных телекоммуникационных приложений, написанная на символическом языке программирования Erlang, который также является целевым языком. Mnesia пытается решить все проблемы управления данными, необходимые для типичных телекоммуникационных систем, и обладает рядом функций, которые обычно не встречаются в традиционных базах данных.

В телекоммуникационных приложениях потребности отличаются от функций, предоставляемых традиционными СУБД. Приложения, в настоящее время реализованные на языке Erlang, нуждаются в сочетании широкого спектра функций, которые обычно не удовлетворяются традиционными СУБД. Mnesia разработана с учетом следующих требований:

Быстрый поиск ключа / значения в реальном времени

Сложные запросы не в реальном времени в основном для эксплуатации и обслуживания

Распределенные данные за счет распределенных приложений

Высокая отказоустойчивость

Динамическая перенастройка

Сложные объекты

Что отличает Mnesia от большинства других СУБД, так это то, что она разработана с учетом типичных проблем управления данными телекоммуникационных приложений. Таким образом, Mnesia сочетает в себе многие концепции, существующие в традиционных базах данных, такие как транзакции и запросы, с концепциями, обнаруженными в системах управления данными для телекоммуникационных приложений, такими как очень быстрые операции в реальном времени, настраиваемая степень отказоустойчивости (посредством репликации) и возможность перенастроить систему, не останавливая и не приостанавливая ее. Mnesia также интересна тем, что тесно связана с языком программирования Erlang, таким образом, почти превращая Erlang в язык программирования баз данных. Это имеет много преимуществ, прежде всего то, что несоответствие импеданса между форматом данных, используемым СУБД, и форматом данных, используемым языком программирования,

Mnesia против MySQL, производительность :

ejabberd потребляет меньше вычислительных ресурсов при использовании некоторой базы данных * SQL, чем при использовании внутренней Mnesia. Вы, вероятно, интересуетесь этой темой, когда у вас много одновременно работающих пользователей (например, более 1000). При небольшом количестве одновременно работающих пользователей потребление ресурсов ejabberd незначительно, поэтому администраторам небольших серверов не нужно настраивать внешний сервер SQL и базу данных.

CouchDB против Mnesia, V. MySQL и другие темы Mnesia :

Одна мысль, которая сразу пришла в голову, заключается в том, что, хотя для меня было совершенно очевидно, как структурировать данные для MySQL, для Mnesia это не так, а для CouchDB я все еще не совсем уверен в лучшем подходе. На данный момент, вот несколько наиболее очевидных моментов:

«Запись» имеет поле «numplays», которое, очевидно, указывает, сколько раз оно было воспроизведено. Это хорошо в MySQL, но если я просто включу это поле в документ для CouchDB, я получу полную повторную редакцию документа в базе данных каждый раз, когда меняется это одно число, что кажется ужасно неэффективным.

Макет с тремя таблицами в MySQL записей, тегов и таблицы ссылок между ними (см. Сценарий, если это не ясно) является (по крайней мере, мне) правильным решением, но есть много возможных способов сделать это. и в Mnesia, и в CouchDB, и я нахожу, что у меня нет интуитивно понятных ответов.

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

Брайан Баллсун-Стэнтон
источник
4

Нет, я бы не сказал, что Mnesia хороша для большого количества данных. Вы можете использовать Ets или Dets в качестве бэкэнда. Если вы выберете Ets, ваша база данных будет только в оперативной памяти и будет очень быстрой, но данные не будут постоянными. И если вы хотите, чтобы ваши данные были постоянными (сохранялись на диске), вам нужно использовать Dets, который имеет ограничение 2 ГБ , поэтому ваша база данных не может содержать более 2 ГБ данных.

Вы можете использовать пользовательский бэкэнд, например, innostore, который используется в базе данных Riak NoSQL.

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

Jonas
источник