Replicating a distributed database

adam aduston@REDACTED
Fri Dec 11 06:05:28 CET 2009


Ah, okay, got it. I somehow missed the node_pool option. I can do
that, then use add_table_copy with each fragment individually to
replicate them.

Very honored to hear back from a member of the core mnesia team, btw.
Thank you.

Adam

On Dec 8, 2:22 am, Håkan Mattsson <ha...@REDACTED> wrote:
> On Tue, Dec 8, 2009 at 12:09 AM, adam <adus...@REDACTED> wrote:
> > It's interesting: I can't find an answer to this question anywhere. We
> > have a table that has fragments evenly distributed between nodes A and
> > B. We want to replicate these fragments to nodes C and D, which are on
> > separate machines. I believe that the Mnesia API provides no way of
> > accomplishing this without unseemly workarounds. Am I wrong?
>
> > If I start an Mnesia cluster on nodes A, B, C, and D, then as soon as
> > I create a fragmented table, Mnesia distributes the fragments evenly
> > between nodes A, B, C, and D, so there's a lot of work required with
> > add_table_copy to get the fragments in the right place. It appears
> > that mnesia ignores the disc_only_copies option when creating a
> > fragmented table, only paying attention to n_disc_only_copies in the
> > frag_properties option, so I believe there's no nice way to order
> > mnesia to put fragments on nodes A and B only.
>
> > I can start an Mnesia cluster on nodes A and B, create the fragmented
> > tables, then add nodes C and D and use add_table_copy. This appears to
> > give correct results but is kind of an ugly solution.
>
> > Am I missing some obvious way to accomplish this?
>
> Yes, use the node_pool option. It defaults to all nodes in the schema, but you
> can use it to control which nodes that initially will be used for the fragmented
> table.
>
> For example, this will create a table with 100 fragments distributed
> over the nodes
> a and b regardless of how many nodes that are known in the schema:
>
> mnesia:create_table(f, [{frag_properties, [{n_fragments, 100},
> {n_disc_copies, 2},
>
> {node_pool, [a@REDACTED, b@REDACTED]}]}]).
>
> Take a look at the Mnesia info before and after the call below.
>
> /Håkan
> ---
> Håkan Mattsson (0705-199 251)
>
> (a@REDACTED)10> mnesia:info().
> ---> Processes holding locks <---
> ---> Processes waiting for locks <---
> ---> Participant transactions <---
> ---> Coordinator transactions <---
> ---> Uncertain transactions <---
> ---> Active tables <---
> schema         : with 1        records occupying 432      words of mem
> ===> System info in version "4.4.12", debug level = none <===
> opt_disc. Directory "/home/hakan/Mnesia.a@REDACTED" is used.
> use fallback at restart = false
> running db nodes   = [d@REDACTED,b@REDACTED,c@REDACTED,a@REDACTED]
> stopped db nodes   = []
> master node tables = []
> remote             = []
> ram_copies         = []
> disc_copies        = [schema]
> disc_only_copies   = []
> [{a@REDACTED,disc_copies},
>  {b@REDACTED,disc_copies},
>  {c@REDACTED,disc_copies},
>  {d@REDACTED,disc_copies}] = [schema]
> 2 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
> 0 held locks, 0 in queue; 0 local transactions, 0 remote
> 0 transactions waits for other nodes: []
> ok
> (a@REDACTED)12> mnesia:create_table(f, [{frag_properties, [{n_fragments,
> 100}, {n_disc_copies, 2}, {node_pool, [a@REDACTED, b@REDACTED]}]}]).
> {atomic,ok}
> (a@REDACTED)13> mnesia:info(). ---> Processes holding locks <---
> ---> Processes waiting for locks <---
> ---> Participant transactions <---
> ---> Coordinator transactions <---
> ---> Uncertain transactions <---
> ---> Active tables <---
> f              : with 0        records occupying 316      words of mem
> f_frag2        : with 0        records occupying 316      words of mem
> f_frag3        : with 0        records occupying 316      words of mem
> f_frag4        : with 0        records occupying 316      words of mem
> f_frag5        : with 0        records occupying 316      words of mem
> f_frag6        : with 0        records occupying 316      words of mem
> f_frag7        : with 0        records occupying 316      words of mem
> f_frag8        : with 0        records occupying 316      words of mem
> f_frag9        : with 0        records occupying 316      words of mem
> f_frag10       : with 0        records occupying 316      words of mem
> f_frag11       : with 0        records occupying 316      words of mem
> f_frag12       : with 0        records occupying 316      words of mem
> f_frag13       : with 0        records occupying 316      words of mem
> f_frag14       : with 0        records occupying 316      words of mem
> f_frag15       : with 0        records occupying 316      words of mem
> f_frag16       : with 0        records occupying 316      words of mem
> f_frag17       : with 0        records occupying 316      words of mem
> f_frag18       : with 0        records occupying 316      words of mem
> f_frag19       : with 0        records occupying 316      words of mem
> f_frag20       : with 0        records occupying 316      words of mem
> f_frag21       : with 0        records occupying 316      words of mem
> f_frag22       : with 0        records occupying 316      words of mem
> f_frag23       : with 0        records occupying 316      words of mem
> f_frag24       : with 0        records occupying 316      words of mem
> f_frag25       : with 0        records occupying 316      words of mem
> f_frag26       : with 0        records occupying 316      words of mem
> f_frag27       : with 0        records occupying 316      words of mem
> f_frag28       : with 0        records occupying 316      words of mem
> f_frag29       : with 0        records occupying 316      words of mem
> f_frag30       : with 0        records occupying 316      words of mem
> f_frag31       : with 0        records occupying 316      words of mem
> f_frag32       : with 0        records occupying 316      words of mem
> f_frag33       : with 0        records occupying 316      words of mem
> f_frag34       : with 0        records occupying 316      words of mem
> f_frag35       : with 0        records occupying 316      words of mem
> f_frag36       : with 0        records occupying 316      words of mem
> f_frag37       : with 0        records occupying 316      words of mem
> f_frag38       : with 0        records occupying 316      words of mem
> f_frag39       : with 0        records occupying 316      words of mem
> f_frag40       : with 0        records occupying 316      words of mem
> f_frag41       : with 0        records occupying 316      words of mem
> f_frag42       : with 0        records occupying 316      words of mem
> f_frag43       : with 0        records occupying 316      words of mem
> f_frag44       : with 0        records occupying 316      words of mem
> f_frag45       : with 0        records occupying 316      words of mem
> f_frag46       : with 0        records occupying 316      words of mem
> f_frag47       : with 0        records occupying 316      words of mem
> f_frag48       : with 0        records occupying 316      words of mem
> f_frag49       : with 0        records occupying 316      words of mem
> f_frag50       : with 0        records occupying 316      words of mem
> f_frag51       : with 0        records occupying 316      words of mem
> f_frag52       : with 0        records occupying 316      words of mem
> f_frag53       : with 0        records occupying 316      words of mem
> f_frag54       : with 0        records occupying 316      words of mem
> f_frag55       : with 0        records occupying 316      words of mem
> f_frag56       : with 0        records occupying 316      words of mem
> f_frag57       : with 0        records occupying 316      words of mem
> f_frag58       : with 0        records occupying 316      words of mem
> f_frag59       : with 0        records occupying 316      words of mem
> f_frag60       : with 0        records occupying 316      words of mem
> f_frag61       : with 0        records occupying 316      words of mem
> f_frag62       : with 0        records occupying 316      words of mem
> f_frag63       : with 0        records occupying 316      words of mem
> f_frag64       : with 0        records occupying 316      words of mem
> f_frag65       : with 0        records occupying 316      words of mem
> f_frag66       : with 0        records occupying 316      words of mem
> f_frag67       : with 0        records occupying 316      words of mem
> f_frag68       : with 0        records occupying 316      words of mem
> f_frag69       : with 0        records occupying 316      words of mem
> f_frag70       : with 0        records occupying 316      words of mem
> f_frag71       : with 0        records occupying 316      words of mem
> f_frag72       : with 0        records occupying 316      words of mem
> f_frag73       : with 0        records occupying 316      words of mem
> f_frag74       : with 0        records occupying 316      words of mem
> f_frag75       : with 0        records occupying 316      words of mem
> f_frag76       : with 0        records occupying 316      words of mem
> f_frag77       : with 0        records occupying 316      words of mem
> f_frag78       : with 0        records occupying 316      words of mem
> f_frag79       : with 0        records occupying 316      words of mem
> f_frag80       : with 0        records occupying 316      words of mem
> f_frag81       : with 0        records occupying 316      words of mem
> f_frag82       : with 0        records occupying 316      words of mem
> f_frag83       : with 0        records occupying 316      words of mem
> f_frag84       : with 0        records occupying 316      words of mem
> f_frag85       : with 0        records occupying 316      words of mem
> f_frag86       : with 0        records occupying 316      words of mem
> f_frag87       : with 0        records occupying 316      words of mem
> f_frag88       : with 0        records occupying 316      words of mem
> f_frag89       : with 0        records occupying 316      words of mem
> f_frag90       : with 0        records occupying 316      words of mem
> f_frag91       : with 0        records occupying 316      words of mem
> f_frag92       : with 0        records occupying 316      words of mem
> f_frag93       : with 0        records occupying 316      words of mem
> f_frag94       : with 0        records occupying 316      words of mem
> f_frag95       : with 0        records occupying 316      words of mem
> f_frag96       : with 0        records occupying 316      words of mem
> f_frag97       : with 0        records occupying 316      words of mem
> f_frag98       : with 0        records occupying 316      words of mem
> f_frag99       : with 0        records occupying 316      words of mem
> f_frag100      : with 0        records occupying 316      words of mem
> schema         : with 101      records occupying 12167    words of mem
> ===> System info in version "4.4.12", debug level = none <===
> opt_disc. Directory "/home/hakan/Mnesia.a@REDACTED" is used.
> use fallback at restart = false
> running db nodes   = [d@REDACTED,b@REDACTED,c@REDACTED,a@REDACTED]
> stopped db nodes   = []
> master node tables = []
> remote             = []
> ram_copies         = []
> disc_copies        = [f,f_frag10,f_frag100,f_frag11,f_frag12,f_frag13,
>                       f_frag14,f_frag15,f_frag16,f_frag17,f_frag18,f_frag19,
>                       f_frag2,f_frag20,f_frag21,f_frag22,f_frag23,f_frag24,
>                       f_frag25,f_frag26,f_frag27,f_frag28,f_frag29,f_frag3,
>                       f_frag30,f_frag31,f_frag32,f_frag33,f_frag34,f_frag35,
>                       f_frag36,f_frag37,f_frag38,f_frag39,f_frag4,f_frag40,
>                       f_frag41,f_frag42,f_frag43,f_frag44,f_frag45,f_frag46,
>                       f_frag47,f_frag48,f_frag49,f_frag5,f_frag50,f_frag51,
>                       f_frag52,f_frag53,f_frag54,f_frag55,f_frag56,f_frag57,
>                       f_frag58,f_frag59,f_frag6,f_frag60,f_frag61,f_frag62,
>                       f_frag63,f_frag64,f_frag65,f_frag66,f_frag67,f_frag68,
>                       f_frag69,f_frag7,f_frag70,f_frag71,f_frag72,f_frag73,
>                       f_frag74,f_frag75,f_frag76,f_frag77,f_frag78,f_frag79,
>                       f_frag8,f_frag80,f_frag81,f_frag82,f_frag83,f_frag84,
>                       f_frag85,f_frag86,f_frag87,f_frag88,f_frag89,f_frag9,
>                       f_frag90,f_frag91,f_frag92,f_frag93,f_frag94,f_frag95,
>                       f_frag96,f_frag97,f_frag98,f_frag99,schema]
> disc_only_copies   = []
> [{a@REDACTED,disc_copies},{b@REDACTED,disc_copies}] = [f_frag100,f_frag99,f_frag98,
>                                                  f_frag97,f_frag96,f_frag95,
>                                                  f_frag94,f_frag93,f_frag92,
>                                                  f_frag91,f_frag90,f_frag89,
>                                                  f_frag88,f_frag87,f_frag86,
>                                                  f_frag85,f_frag84,f_frag83,
>                                                  f_frag82,f_frag81,f_frag80,
>                                                  f_frag79,f_frag78,f_frag77,
>                                                  f_frag76,f_frag75,f_frag74,
>                                                  f_frag73,f_frag72,f_frag71,
>                                                  f_frag70,f_frag69,f_frag68,
>                                                  f_frag67,f_frag66,f_frag65,
>                                                  f_frag64,f_frag63,f_frag62,
>                                                  f_frag61,f_frag60,f_frag59,
>                                                  f_frag58,f_frag57,f_frag56,
>                                                  f_frag55,f_frag54,f_frag53,
>                                                  f_frag52,f_frag51,f_frag50,
>                                                  f_frag49,f_frag48,f_frag47,
>                                                  f_frag46,f_frag45,f_frag44,
>                                                  f_frag43,f_frag42,f_frag41,
>                                                  f_frag40,f_frag39,f_frag38,
>                                                  f_frag37,f_frag36,f_frag35,
>                                                  f_frag34,f_frag33,f_frag32,
>                                                  f_frag31,f_frag30,f_frag29,
>                                                  f_frag28,f_frag27,f_frag26,
>                                                  f_frag25,f_frag24,f_frag23,
>                                                  f_frag22,f_frag21,f_frag20,
>                                                  f_frag19,f_frag18,f_frag17,
>                                                  f_frag16,f_frag15,f_frag14,
>                                                  f_frag13,f_frag12,f_frag11,
>                                                  f_frag10,f_frag9,f_frag8,
>                                                  f_frag7,f_frag6,f_frag5,
>                                                  f_frag4,f_frag3,f_frag2,f]
> [{a@REDACTED,disc_copies},
>  {b@REDACTED,disc_copies},
>  {c@REDACTED,disc_copies},
>  {d@REDACTED,disc_copies}] = [schema]
> 3 transactions committed, 1 aborted, 0 restarted, 1 logged to disc
> 0 held locks, 0 in queue; 0 local transactions, 0 remote
> 0 transactions waits for other nodes: []
> ok
> (a@REDACTED)14>
>
> ________________________________________________________________
> erlang-questions mailing list. Seehttp://www.erlang.org/faq.html
> erlang-questions (at) erlang.org


More information about the erlang-questions mailing list