Mnesia在32位系统下单个表最大只能存储4G的数据,很多情况下这显然系不够的,不过不要紧,Mnesia可以将单个表分拆成多个分块(Fragment),这些块可以分布到不同节点节点不同主机上,被分块的表和其他表一样可以备份复制等等~~
创建和初始化数据库表
首先我们运行三个节点node1@m、node2@m和node3@m并将它们连接起来(详细可以参看Interconnecting Erlang Nodes),然后在node1上初始化一个表,将该表分成三块,分布在上述的三个节点上:
(以下代码省略了部分返回结果)
初始化schema
node1 > Nodes=[node() | nodes()].
node1 > mnesia:create_schema(Nodes).
启动所有节点上的Mnesia
node1 > mnesia:start().
node2 > mnesia:start().
node3 > mnesia:start().
在Node1上创建和初始化数据表
node1 > rd(test,{key,value}).
node1 > FragProps=[
{node_pool,Nodes},
{n_fragments,3},
{n_disc_only_copies,1}].
node1 > mnesia:create_table(test,[
{frag_properties,FragProps},
{attributes,record_info(fields,test)}]).
node1 > Write=fun() ->
[mnesia:write({test,K,K}) || K<-lists:seq(1,1000)]
end.
node1 > mnesia:activity(sync_dirty,Write,[],mnesia_frag).
检查一下数据都写到哪里去了
node1 > Info=fun(Item) -> mnesia:info(test,Item) end.
node1 > mnesia:activity(sync_dirty,Info,[frag_size],mnesia_frag).
[{test,230},{test_frag2,524},{test_frag3,246}]
添加新分块到新节点上
启动新节点node4
$ erl -sname node4
node4 > mnesia:start().
连接并添加新节点
node1 > net_adm:ping('node4@m').
node1 > mnesia:change_config(extra_db_nodes,['node4@m']).
通过mnesia:info()我们发现新节点的类新为ram_copies,这与其他几个节点不兼容
所以要先对node4上的表进行类型转换
node4 > change_table_copy_type(schema,node(),disc_copies).
添加新分块到新节点上,可以向同一节点添加多个分块
node1 > mnesia:change_table_frag(test,{add_frag,['node4@m']}).
node1 > mnesia:change_table_frag(test,{add_frag,['node4@m']}).
node1 > mnesia:change_table_frag(test,{add_frag,['node4@m']}).
node1 > mnesia:activity(sync_dirty,Info,[frag_dist],mnesia_frag).
[{'node1@m',1},
{'node2@m',1},
{'node3@m',1},
{'node4@m',3}]
node1 > mnesia:activity(sync_dirty,Info,[frag_size],mnesia_frag).
[{test,121},
{test_frag2,115},
{test_frag3,246},
{test_frag4,291},
{test_frag5,109},
{test_frag6,118}]
OK,可以看到数据已经自动的分布到各个节点上的分块里了~~
0 意見