我有一个mnesia表,有三个字段,i,a和b,使用记录创建
-record(rec, {i, a,b}).
Run Code Online (Sandbox Code Playgroud)
现在我在表中插入一行:
mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=2, b=3}, write) end ).
Run Code Online (Sandbox Code Playgroud)
现在,如果我想要更新此行,并且仅将a的值更改为10,同时使i和b保持相同的值,我该怎么办?是否有像" UPDATE T SET a=10 WHERE i=1" 这样的SQL等价物?
如果我做这样的事情:
mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=10}, write) end )
Run Code Online (Sandbox Code Playgroud)
该行存储为:
{rec,1,10,undefined}
Run Code Online (Sandbox Code Playgroud) 我有一个mnesia表,其字段为f1,f2,f3.现在,如果我选择字段值为V1的所有行,我会使用mnesia:select和匹配规范或简单mnesia:match_object.现在我需要选择具有V1,V2,V3 ...或Vn(任意长度的列表)的所有行作为字段f1的值.在SQL中我会做类似的事情
SELECT * FROM tablename WHERE f3 IN (V1, V2, V3, ... , Vn)
Run Code Online (Sandbox Code Playgroud)
我怎么在mnesia这样做?
当我收到这样的消息时,像这样:
** WARNING ** Mnesia is overloaded: {dump_log, write_threshold}
Run Code Online (Sandbox Code Playgroud)
什么是知道哪个表被密集使用的方法?我需要做什么样的调试?
谢谢.
在我最近询问有关mnesia碎片的问题的解决方案之后,我仍然面临许多挑战.请考虑以下场景(我要问的问题基于以下内容):
您有一个数据驱动的企业应用程序,该应用程序应该
在企业内高度可用.如果内部信息源因任何原因而关闭,
企业应用程序必须切换到从异地(远程)恢复中心 获取数据
.您决定将数据库复制到企业内的两个节点
(称为DB侧A和DB侧B).这两个
硬件在单独的硬件上运行,但与快速以太网或光纤链路相连.
从逻辑上讲,您可以在这
两个Mnesia DB 之间创建某种隧道或安全通信.两个(A和B)应该具有相同的数据副本并且
始终保持同步.现在,同时,恢复中心也必须具有相同的数据副本并且
始终同步,以防因本地数据访问因攻击
或硬件故障而中断.因此,相同的数据库架构必须在3个复制
位点(A面,B面和恢复中心).
现在,在企业内,应用程序中间件能够在数据库站点之间切换数据请求.如果A已关闭,那么在应用程序未实现的情况下,请求将重新路由到数据库B,依此类推.中间件层可以配置为执行负载平衡(请求多路复用)或使用故障转移技术灵活.
进一步分析:
At Database/Schema creation time, all involved Nodes must be up and running
Mnesia. To achieve this, you create say: 'db_side_A@domain.com',
'db_side_B@domain.com' and finally, 'db_recovery_center@domain.com'
现在,在创建表时,您可能希望将mnesia表分段.所以你决定以下参数:
n_disc_only_copies =:= number of nodes involved in the pool =:= 3 Reason: You are following the …
ets:select vs mnesia:select哪个更好用.并且在插入和删除的情况下我们应该使用这两个中的一个.我正在研究ejabberd.Any指针?
我正在考虑使用Erlang,Mnesia和Yaws开发一个网络搜索引擎.是否有可能使用这些软件制作功能强大且速度最快的网络搜索引擎?它需要做什么以及我该如何开始?
有没有办法使用mnesia 进行本地写入和全局读取(无需复制).例如:节点A写入其本地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
Run Code Online (Sandbox Code Playgroud)
在nodeB @ ip2上:
mnesia:start().
%% code to list rows from user table on nodeA
%% throws an ERROR saying table does not exist.
Run Code Online (Sandbox Code Playgroud)
配置是错误的还是可以通过其他方式完成?
它是将所有数据复制到每个节点还是将数据片段存储在每个节点上,然后在运行时从不同节点获取所需的每个片段?或者这是如何工作的?
如果您使用MySQL而不是Mnesia,群集是否仍能正常工作?
关于RabbitMQ v3.1.5集群的几个问题.我有一个包含2个节点的集群,rabbitmq.config在两个节点上都是这样的:
[
{rabbit, [
{cluster_nodes, {['rabbit@rmq01', 'rabbit@rmq02'], ram}},
{tcp_listeners, [5674]}
]}
].
Run Code Online (Sandbox Code Playgroud)
我已经看到了这样的问题,现在我再次看到它:当有时所有集群都关闭时,如果第二个节点(rmq02)在第一个节点(rmq01)之前启动,它'忘记'关于rmq01:
[root@rmq2 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rmq2' ...
[{nodes,[{disc,['rabbit@rmq2']}]},
{running_nodes,['rabbit@rmq2']},
{partitions,[]}]
...done.
Run Code Online (Sandbox Code Playgroud)
在此第一个节点(rmq01)无法启动之后,由于rmq2不同意群集:
{"init terminating in do_boot",{rabbit,failure_during_boot,{error,{inconsistent_cluster,"Node 'rabbit@rmq1' thinks it's clustered with node 'rabbit@rmq2', but 'rabbit@rmq2' disagrees"}}}}
Run Code Online (Sandbox Code Playgroud)
我试图将rmq01添加到rmq02,但似乎我必须在此之前使用stop_app:
[root@rmq2 rabbitmq]# rabbitmqctl join_cluster rabbit@rmq1
Clustering node 'rabbit@rmq2' with 'rabbit@rmq1' ...
Error: mnesia_unexpectedly_running
Run Code Online (Sandbox Code Playgroud)
在这里,我看到rmq02忘记了rmq01:
[root@rmq2 ~]# cat /var/lib/rabbitmq/mnesia/rabbit\@rmq2/cluster_nodes.config
{['rabbit@rmq2'],['rabbit@rmq2']}.
Run Code Online (Sandbox Code Playgroud)
同时在rmq01(正确的配置):
[root@rmq1 ~]# cat /var/lib/rabbitmq/mnesia/rabbit\@rmq1/cluster_nodes.config
{['rabbit@rmq1','rabbit@rmq2'],['rabbit@rmq1']}.
Run Code Online (Sandbox Code Playgroud)
问题:
我正在尝试使用Elixir编写程序来访问mnesia.我在亚马逊linux中运行iex shell.我尝试使用连接另一个节点
Node.connect(:'hello@abc.com')
Run Code Online (Sandbox Code Playgroud)
返回true,然后我想在这个远程节点上运行mnesia命令,我发出
:mneisa.info
Run Code Online (Sandbox Code Playgroud)
但是,它只返回本地节点的mnesia信息.如何访问连接的远程节点的mnesia数据库?
我试过rpc_call,它有效.但它是否有更直接的方法从远程节点mnesia获取数据.