sezaru
Hello,
Why does the BEAM try to connect each node to all other nodes from the network?
For example, let’s say I have nodes A, B, and C. A needs to talk with B, B needs to talk with A and C only talks with B:
To do this, I configure libcluster with a topology that looks like this:
A <-------> B <-------> C
What I expected was to A and B be connected, and B and C too, but actually A and C connect to each other too.
This is OK in my development environment, but in production, I have more strict firewall rules, so A cannot access C IP and vice versa.
Everything seems to work, but A and C still try to connect to each other, resulting in warnings like this on from my log:
2021-09-25 18:47:47.463 [warn] #PID<0.3141.0>
↳ global: :"candles@node1.candles.tip-off" failed to connect to :"rocket_dbs@node1.rocket_dbs.tip-off
So, why does this is the default behavior of the BEAM? Can I disable/configure it? What are the advantages/disadvantages of it?
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #ai
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 2- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
ityonemo
So one thing that it is important for is to obtain cluster-wide global transactional locks using the :global module. If every node knows every other node, then this is not a problem. If you have a more unusual topology, ensuring that all nodes are aware of the lock is not trivial; I don’t know what guarantees :global makes when you have an unusual topology.
I think if you have a situation where your nodes have a heterogeneous topology you should reconsider using erlang clustering as a “service mesh” or at least look into a different clustering protocol; the original use case for erlang clustering is for symmetrical redundancy, not as a service mesh.
There have been attempts to do so (e.g. “partisan”). I think that project is very interesting but I worry that the abstraction is not quite the right one.
qhwa
According to Erlang’s document,
and (as @ityonemo has mentioned)
So if you need to discover processes, it will have some issues.
On libcluster’s README, it says:
I haven’t tried Partisan yet, but it works not in “all to all” mode, and it provides some alternatives to the
:globalregistry and process discovery. As I understand one of its selling points is such networking conditions. But maybe you don’t need it sinceAandCwon’t talk to each other?