mmyers

mmyers

Dynamically connect nodes and start a distributed application

Is it possible to have nodes running independently, and then start running a distributed app with a fail-over/takeover configuration programmatically at run-time?

I’ve been working with the Magic 8-ball example in Distributed OTP Applications | Learn You Some Erlang for Great Good! with the A-B-C nodes. I have it working in Elixir, but it requires configuration files that are pre-configured with the distributed node cluster and fail-over rules. I’ve read about libcluster+swarm, but it seems like overkill for my 2-node clusters. And it seems like I would still have to have the nodes pre-configured.

Here’s the idea of what I’m trying to accomplish. Maybe there is an easier/better way to do this, I’m open to ideas:

I will have two nodes that are running on separate IoT devices. At first these nodes don’t know about each other, and they don’t know if they will ever be clustered - they may not be.

The devices will receive a signal (details TBD) informing them that they should connect to each other and start running a distributed application with one node acting as fail-over for the other.

Playing around in iex, it feels like I’m getting closer, but not really.
Note, for this example, both nodes are on my local computer.

iex --name "a@192.168.0.2" -pa _build/dev/lib/m8ball/ebin --cookie cookie_s
iex --name "b@192.168.0.2" -pa _build/dev/lib/m8ball/ebin --cookie cookie_s

Note: Initially the cookies won’t be the same, but a shared cookie will be part of the signal/command to connect.
Devices receive the command to connect and run the distributed m8ball app.

  • Connect the Nodes
    Node.connect(:"b@192.168.0.2")

  • Start the distributed application at a.

:dist_ac.start_link  # It seems like I need to start `dist_ac` (since it's not running on the individual nodes).
:dist_ac.load_application(:m8ball, [{:m8ball, 5000, ['a@192.168.0.2', {'b@192.168.0.2'}]}])

It seem like :dist_ac.load_application is what I need, but it never returns. I’m not sure what I’m missing.
There is not a lot of documentation or articles that I can find about this. I had to look at the Erlang source code to get this far.

Any suggestions?

Marked As Solved

mmyers

mmyers

Thanks for your suggestions anthonator.

Apparently, what I was trying to do is not really possible. If I had kept reading on learnyousomeerlang, I would have seen:

The thing is, for the mechanism to work, the application needs to be started as part of the boot procedure of the node .

Currently I’m going with a simple Node monitor GenServer to detect :nodeup and :nodedown and can easily connect with Node.connect now I’m also looking into Epmdless

Where Next?

Popular in Questions Top

gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> somethi...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call t...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New

Other popular topics Top

danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 29377 241
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39297 209
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement