mnesia question
Dan Gudmundsson
dgud@REDACTED
Fri Feb 17 10:20:40 CET 2006
Renyi Xiong writes:
> what if one node participant fails to respond (machine down or network down)
> during commit process while the coordinator waiting for commit vote
> ('receive' waits forever for a message, right?)
>
> the reason why I'm asking this question is that:
>
> our system is designed to handle thousands of write transactions a second
> and to have multiple replicas to provide fault tolerance. if one replica
> down and fails to send 'mnesia_down' message. there is a good chance that a
> commit process is on going.
>
> does 'mnesia_monitor' on coordinator node handle that?
Yes. :-)
/Dan
>
> Thanks,
> Renyi.
>
> ----- Original Message -----
> From: "Hakan Mattsson" <hakan@REDACTED>
> To: "Renyi Xiong" <rxiong@REDACTED>
> Cc: "Ulf Wiger (AL/EAB)" <ulf.wiger@REDACTED>;
> <erlang-questions@REDACTED>
> Sent: Tuesday, February 14, 2006 2:04 AM
> Subject: Re: mnesia question
>
>
> On Wed, 8 Aug 2001, Renyi Xiong wrote:
>
> RX> Thanks guys,
> RX> It's really helpful for us to understand how Mnesia works.
> RX>
> RX> 1.My understanding is when one node initiates a write operation it sends
> a
> RX> message to each of the replicas at same time and doesn't care the write
> RX> transaction status on other replicas. It's up to the transaction handler
> on
> RX> each node to handle the write transaction separately. Is that right?
>
> Yes, this is true for normal transactions using
> 2pc. But it is not as bad as it sounds as the
> transaction recovery protocol ensures that the
> outcome of the transaction always is atomic.
>
> If needed, Mnesia will automatically use 3pc as
> transaction protocol. It is slower, but takes
> care of transactions operating on multiple tables
> which are replicated asymmetrically.
>
> RX> 2.How do I know the write operation succeeds on at least
> RX> on of the replicas including the one which initiates it?
>
> Use mnesia:sync_transaction/1. It waits for all
> participating nodes to complete their commit work
> before it returns. It is slower, but needed in
> some applications.
>
> /Håkan
>
> RX> Thanks,
> RX> Renyi.
> RX>
> RX> ----- Original Message ----- From: "Hakan Mattsson"
> <hakan@REDACTED>
> RX> To: "Ulf Wiger (AL/EAB)" <ulf.wiger@REDACTED>
> RX> Cc: "Renyi Xiong" <renyix1@REDACTED>; <erlang-questions@REDACTED>;
> RX> <rxiong@REDACTED>
> RX> Sent: Monday, February 13, 2006 8:54 AM
> RX> Subject: RE: mnesia question
> RX>
> RX>
> RX> On Mon, 13 Feb 2006, Ulf Wiger (AL/EAB) wrote:
> RX>
> RX> UW> Renyi Xiong wrote:
> RX> UW> >
> RX> UW> > 1. what happens if one of (not all of) the RAM replicas of
> RX> UW> > Mnesia table fails when doing write operation? write fails?
> RX> UW>
> RX> UW> If you are using transactions, chances are good that mnesia
> RX> UW> will be able to follow through after all. The transaction
> RX> UW> is completed as an 'asymmetric' transaction, and the failed
> RX> UW> node gets the opportunity to update itself later.
> RX>
> RX> Yes, the transaction is completed consistently on the
> RX> surviving nodes. On the node(s) where Mnesia fails to
> RX> write, Mnesia will be terminated. When Mnesia later is
> RX> started on these nodes, it will pick the table contents
> RX> from the surviving node(s). This fundamental behavior
> RX> is the same for all types of transactions as well as
> RX> for dirty writes.
> RX>
> RX> For transactions using 3pc, the recovery procedure is
> RX> more complicated as the failing nodes may need to
> RX> determine the outcome of the transaction before the
> RX> transaction log can be processed. 3pc is used for
> RX> transactions involving updates of the schema or
> RX> asymmetrically replicated tables.
> RX>
> RX> UW> (Of course, assuming that the failed node is not the
> RX> UW> one that initiated the transaction.)
> RX>
> RX> The recovery procedure is the same, even if it was the
> RX> failing node that initiated the transaction.
> RX>
> RX> UW> If you're using dirty writes, you may end up with
> RX> UW> database inconsistency. Don't use dirty writes on
> RX> UW> replicated tables unless you really really know what
> RX> UW> you're doing.
> RX>
> RX> This is a good general advice.
> RX>
> RX> Using dirty writes on replicated tables, is about as
> RX> hazardous as using master nodes, using the
> RX> max_wait_for_decision configuration parameter or to
> RX> force load tables. Elaborating with these mechanisms
> RX> may easily end up with an inconsistent database as
> RX> they bypasses the transaction recovery procedure in
> RX> Mnesia. Sometime it is necessary to use these
> RX> mechanisms, but use them with care.
> RX>
> RX> /Håkan
> RX>
> RX> UW> > 2. Is Mnesia table RAM replica distributable across VPN network?
> RX> UW>
> RX> UW> If you can get Distributed Erlang to work, you will be able to
> RX> UW> replicate mnesia tables. Without Distributed Erlang - no
> replication.
> RX> UW>
> RX> UW>
> RX> UW> > 3. Is possible to add and remove RAM replica dynamically?
> RX> UW>
> RX> UW> Yes, using the function
> RX> UW>
> RX> UW> mnesia:add_table_copy(Tab, Node, Type)
> RX> UW>
> RX> UW> where Type == ram_copies, if it's a RAM replica you want to add.
> RX> UW>
> RX> UW> Removing a replica:
> RX> UW>
> RX> UW> mnesia:del_table_copy(Tab, Node)
> RX> UW>
> RX> UW> Regards,
> RX> UW> Ulf W
More information about the erlang-questions
mailing list