Mnesia and LevelDB: Liberating Mnesia from the limitations of DETS
erlang-factory.com
erlang-factory.com
So this effort brought in the ability to have a better backend, and make Mnesia a better option as a general purpose distributed database.
Here is an talk on how WhatsApp uses Mnesia:
Erlang Factory 2014 - That's 'Billion' with a 'B': Scaling to the Next Level at WhatsApp
https://www.youtube.com/watch?v=c12cYAUTXXs
Here is an example of using Mnesia:
https://en.wikibooks.org/wiki/Erlang_Programming/Using_mnesi...
mnesia should not be in the OTP. Not by a longshot.
I love Erlang. I hate mnesia.
Resynchs are really slow, because "resynch" is copy data from the network. Mostly this goes close to the line speed for your network though; be sure to move the data files out of the way on the node that will be receiving the copies: otherwise mnesia first loads those, then throws them away sigh. It would be pretty nice if there was support for logging changes when a node is down, though.
Doubtful on the network thing. mnesia will partition then resync when the server gets really busy. As others have mentioned, it might have nothing to do with anything that Erlang is doing. It might be something external. It could just be a lot of traffic that causes it to fall behind. Either way, one missed message and then you're forced to fully resync.
>Resynchs are really slow, because "resynch" is copy data from the network. Mostly this goes close to the line speed for your network though<
Which means your other node has its interface maxed out, causing more service disruptions. I've never run mnesia on a 10gig network, but that definitely was the case with 1gig. I'm not really willing to test or run mnesia in a 10gig/40gig environment. Been burned by it too many times.
>Mostly this goes close to the line speed for your network though; be sure to move the data files out of the way on the node that will be receiving the copies: otherwise mnesia first loads those, then throws them away sigh. It would be pretty nice if there was support for logging changes when a node is down, though.<
Which again, is another sign that it's not robust enough for Internet application usage. Probably OK for some 1990's phone switching, but not for how distributed systems are built today. How are you going to manually move the files out of the way in today's world of systemd automatically restarting failed daemons? Manual operator intervention? Thought so, and this is why ops teams hate mnesia.
• in a 1:1 master:hot-spare setup,
• where the nodes contain their own data in process-memory-space rather than relying on a separate "database" node,
• and you need to be able to fail-over to the hot-spare and promote it to master, without business logic being aware of this,
• and your system has time tolerances allowing you to manually fix the old master and bring it up as the new hot-spare,
then mnesia is perfect.
You know what system I'm describing?
Call switching!
You know what system I'm not describing?
Most things!
Exactly right!
The "distributed" part of Erlang (including mnesia) was designed to run in a blade-like system where the networking was provided by a physical common backplane among all the compute cards in the chassis.
So, a lot of distributed erlang and mnesia falls apart when dealing with network partitions and resyncs and real-world scenarios that wouldn't really happen on a common physical substrate.
That's why most sane erlang people won't run distributed erlang (gotta love that epmd), they'll run their own TCP servers connecting to external DBs.
Distributed OTP applications (with the automated takeover/failover mechanism) see very little use in the real world because of their set of assumptions that network failures are rarer than software or hardware failure, which result in perceiving all netsplits as nodes going down (a great way to get split brains!)
I do wonder if you could get an interesting boost in fault-tolerance by writing an Erlang application to run distributed between, say, several EC2 instances in the same Placement Group. That gets you the analogous "backplane guarantee" in virtualized network-space, AFAIK.
Something, like, say, file processing. You have a watch directory, you want to be able to process everything that lands in that directory in a scalable manner, but don't want to re-process the same thing (but it's okay if you do, just inefficient). Mnesia is probably fine to keep tabs of what you've processed already; in the event of a netsplit you can just let all sides of it keep going, until you get around to fixing the cluster. Your inconsistencies just lead to inefficiencies, rather than real data loss, and you have a clear path to fixing them (just dump the data on the partitioned nodes, and rejoin them to the cluster). As such, you have a more resilient, scalable system than you would if you just used a centralized database, while not having to configure and manage a separate DB.
That said, I like the idea of being able to swap Mnesia out for something a little less warty, if it's pretty seamless in operation.