Асинхронная транзакция Mnesia

Я хотел бы иметь настройку master-slave узлов Erlang, при которой операции чтения и записи выполняются только на главном узле. Подчиненные узлы сохраняются только как горячие резервы.

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

Мой вопрос: поддерживает ли Mnesia асинхронные транзакции, где блокировки устанавливаются только на главном узле, а операции записи затем распространяются на подчиненные узлы?


person Zed    schedule 13.12.2009    source источник


Ответы (3)


Я думаю, вы будете счастливее, если вы создадите эту репликацию за пределами сайта, используя систему очереди сообщений (возможно, rabbitmq), обновляя реплицированную базу данных самостоятельно из канала очереди сообщений. Каналы WAN с большей вероятностью станут перегруженными или выйдут из строя, и у протоколов очереди сообщений есть способы справиться с этим. Распространение Erlang просто откажется, и вам придется переливать обновления в файл, пока реплика не появится и не сможет ее использовать.

Для лучшей симметрии сделайте очередь отправки в сообщение основным методом обновления базы данных. Таким образом, даже мастер обновляется, получая данные из очереди сообщений. Если требуется ответ, текущий мастер может отправить сообщение обратно отправителю сообщения.

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

person Christian    schedule 13.12.2009
comment
Я также немного исследовал, так как увидел этот вопрос: предложение Кристиана звучит разумно. - person jldupont; 14.12.2009

Возможно, ваше приложение может выиграть от использования липких блокировок. Думаю, это вполне соответствует вашим потребностям, но ... не совсем то, что вам нужно http://www.erlang.org/documentation/doc-5.8.3/lib/mnesia-4.4.17/doc/html/Mnesia_chap4.html#id70700

person pls    schedule 10.04.2011

Интересный вопрос и не менее интересный А!

По сути, то, что вы предлагаете, Кристиан, например, иметь gen_server - сериализацию доступа к БД. Я сделал это первый раз, а потом понял: держись! Mnesia является транзакционным, поэтому кажется немного странным сначала сериализовать доступ, а затем как бы сделать это снова, обновив БД с помощью транзакции.

Однако я все еще немного озадачен, учитывая, что мнезия применяет транзакционную семантику, я склонен воспринимать это как намек на то, что вам не нужно сериализовать доступ самостоятельно, тем более что разработчики мнезии, вероятно, знают систему лучше, чем я;)

Я понимаю, что это не совсем прямой ответ на ваш вопрос, однако я бы сказал, что используйте mnesia + memorynodes + disknodes. Узлы памяти для быстрого переключения и дисковые узлы для восстановления после сбоя / резервного копирования.

HTH, хаави

person haavee    schedule 14.12.2009