din_S
Running different instances of one application on multiple ports using libcluster
I want to run different instances of the same app (not copies of the same app) on the same server (clustering) using different ports, so I used libcluster library and did the following (in application.ex):
def start(_type, _args) do
import Supervisor.Spec
# Define Topologies for clustering
topologies = [
example: [
strategy: Cluster.Strategy.Gossip
]
]
# List all child processes to be supervised
children = [
# For Clustering
{Cluster.Supervisor, [topologies, [name: MyApp.ClusterSupervisor]]},
# Start the endpoint when the application starts
supervisor(MyAppWeb.Endpoint, []),
{ConCache, [name: :my_cache, ttl_check_interval: false]}
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
result = Supervisor.start_link(children, opts)
end
I even tried this:
topologies = [
example: [
strategy: Cluster.Strategy.Gossip,
config: [hosts: [:"a@127.0.0.1", :"b@127.0.0.1",:"b@127.0.0.1",:"d@127.0.0.1"]],
]
]
but when I tried the following on the server (Ubuntu 18):
PORT=3000 elixir --sname a -S mix phx.server
then
PORT=3001 elixir --sname b -S mix phx.server
I get the following error
** (Mix) Could not start application my_app: MyApp.Application.start(:normal, []) returned an error: shutdown: failed to start child: MyAppWeb.Endpoint
** (EXIT) shutdown: failed to start child: {:ranch_listener_sup, MyAppWeb.Endpoint.HTTP}
** (EXIT) shutdown: failed to start child: :ranch_acceptors_sup
** (EXIT) {:listen_error, MyAppWeb.Endpoint.HTTP, :eaddrinuse}
what should I do to make it work.
Marked As Solved
kokolegorille
I have tested this on a Phoenix without libcluster and it works for me.
I also have a libcluster, swarm project, but it uses Cowboy instead of Phoenix.
This might not help You, but I use Epmd strategy, and my config is standard to libcluster doc.
config :libcluster, topologies: [
example_1: [
strategy: Cluster.Strategy.Epmd,
config: [hosts: [
:node1@localhost,
:node2@localhost,
:node3@localhost,
]],
],
example_2: [
strategy: Cluster.Strategy.Gossip,
]
]
and I start nodes like this
$ iex --sname node1@localhost -S mix
$ PORT=4001 iex --sname node2@localhost -S mix
$ PORT=4002 iex --sname node3@localhost -S mix
It works, but this is not using Phoenix, but Cowboy.
Last Post!
Mack_Akdas
Hi Din_s,
I see a replication, maybe irrelevant to what you are looking for, but this should not be there, shouldn’t that not be a ‘c’ ?
Popular in Questions
Other popular topics
Latest Phoenix Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









