Есть ли способ сделать локальные записи и и глобальные чтения (без репликации) использующий mnesia. Например: узел записи к его локальному DB и узлу B читает из A узла DB. Узел B не имеет никаких собственных данных кроме информации о схеме сохраненными локально.
Согласно документации, {local_content, true}
походит на то, что я должен использовать, но я был неудачной попыткой заставить узел B читать узел данные A.
Моя схема и конфигурация таблицы похожи на это:
На nodeA@ip1:
net_adm:ping('nodeB@ip2').
rd(user, {name, nick}).
mnesia:create_schema([node()|nodes()]).
mnesia:start().
mnesia:create_table(user, [ {local_content, true},
{disc_copies, [node()]},
{attributes,record_info(fields, user) }]).
%% insert data and list rows on nodeA
%% WORKS
На nodeB@ip2:
mnesia:start().
%% code to list rows from user table on nodeA
%% throws an ERROR saying table does not exist.
Конфигурация неправильно, или это может быть сделано каким-либо другим способом?
Не думаю, что у вас получится так, как вы упомянули. Другой способ сделать это, вероятно, будет заключаться в вызове rpc к узлу A и получению данных таким образом. Нет смысла использовать mnesia для чтения с узла B, потому что он в любом случае будет просто выполнять RPC.
Итак, узел B должен быть:
rpc:call(nodeA@ip1, mnesia, read, ....).
Надеюсь, это то, что вам [отчасти] нужно.
РЕДАКТИРОВАТЬ: О, и я забыл упомянуть, что вам не нужна схема на обоих узлах, чтобы это работало. Предполагается, что узел B на самом деле не заботится об обмене какими-либо другими данными с узлом A, он просто их читает; Другими словами, просто сохраните всю память на узле A и просто выполняйте вызовы RPC с узла B.
Вам может потребоваться добавить узел B в конфигурационную штуку extra_db_nodes схемы. Вы не должны делать этого, если это дисковая база данных, но в RAM это обязательно, чтобы заставить ее делать то, что вы хотите.
Не уверен в специфике, возможно, я путаю, куда что ставить. Я не слишком опытен с mnesia, но документация указывает, что вы должны сделать это.