Mnesia - 从另一个节点复制 ram_copy table 到 disc_only_copy table

Mnesia - Replicate ram_copy table to disc_only_copy table from another node

我想做的是:

在节点 A 中创建一个 table ram_copies,该节点位于具有大量 Ram 和 CPU 电源的计算机中

mnesia:create_table(person, [{ram_copies, [node()]},
                        {frag_properties, [{node_pool, [node()]}, {n_fragments, 10}, {n_ram_copies, 1}]},
                        {attributes, record_info(fields, person)},
                        {storage_properties, [{ets, [compressed, {write_concurrency,true}, {read_concurrency,true}]}]}])

节点 A 开始工作 ram_copy table。

在节点 "A" 创建 table 之后的某个未指定时间(可能是 1 秒或 1 小时),在具有大量硬盘但较少硬盘的计算机上创建节点 B RAM 和 CPU 电源,用于在 "a" 节点中复制(结构和数据)RAM table 但 disc_only_copies.

想法是 运行 关键进程使用节点 A 的所有电源,运行 其他节点上的琐碎进程并保持数据同步。

这可能吗?

你好。

是的,有可能。

假设我们有两个节点; node_1 有很多 Discnode_2 有很多 RAM,我们有一个 foo table 在 node_1 中必须是 disc_only_copies 并且在 node_2 中必须是 ram_copies。步骤如下:

节点 1:

$ erl -sname node_1
(node_1@host)1> mnesia:create_schema([node()]). 
(node_1@host)2> mnesia:start(). 
(node_1@host)3> mnesia:add_table_copy(schema, node_2@host, ram_copies).

节点 2:

$ erl -sname node_2
(node_2@host)1> mnesia:start().
(node_2@host)2> mnesia:change_config(extra_db_nodes, [node_1@host]).

就是这样。现在我们可以在 node_1:

中创建 foo table

节点 1:

(node_1@host)4> mnesia:create_table(foo, [
                    {disc_only_copies, [node_1@host]}, 
                    {ram_copies, [node_2@host]}]).

最后我们可以检查它是否在两个节点上创建 mnesia:info/0:

节点 1:

running db nodes   = [node_2@host,node_1@host]
stopped db nodes   = [] 
master node tables = []
remote             = []
ram_copies         = []
disc_copies        = [schema]
disc_only_copies   = [foo]
[{node_1@host,disc_copies},{node_2@host,ram_copies}] = [schema]
[{node_1@host,disc_only_copies},{node_2@host,ram_copies}] = [foo]

节点 2:

running db nodes   = [node_1@host,node_2@host]
stopped db nodes   = [] 
master node tables = []
remote             = []
ram_copies         = [foo,schema]
disc_copies        = []
disc_only_copies   = []
[{node_1@host,disc_copies},{node_2@host,ram_copies}] = [schema]
[{node_1@host,disc_only_copies},{node_2@host,ram_copies}] = [foo]