Libcluster Postgres - Clustering Strategy for Libcluster

Hi, my colleagues and I at Supabase have worked on libcluster_postgres, a libcluster custom strategy that utilizes PostgreSQL LISTEN and NOTIFY to handle dynamic clustering. This library came out of a requirement for a more reliable discovery method that was cloud agnostic.

By default, the node’s cookie is used as the channel identifier, but you can customize it to anything you want, so long as it is a valid PostgreSQL identifier.

This clustering strategy is being used across 3 different products written in Elixir - Realtime, Supavisor, and Logflare.

@filipecabaco @wenbo @chasers @abc3

43 Likes

This is great work.

I’ve used Redis before to do this job, but since there’s almost zero chance I’ll have to build a clustered system that doesn’t contain postgres I really like this solution.

Congrats!

4 Likes

I’ve given this a go, seems to work wonders. That being said, I think the example in the document doesn’t seem right:

config :libcluster,
  topologies: [
    example: [
      strategy: Cluster.Strategy.Postgres,
      config: [
          hostname: "localhost",
          username: "postgres",
          password: "postgres",
          database: "postgres",
          port: 5432,
          parameters: [],
          # optional, defaults to node cookie
          channel_name: "cluster"
      ],
    ]
  ]

Shouldn’t this be LibclusterPostgres.Strategy based from this? https://github.com/supabase/libcluster_postgres/blob/main/lib/strategy.ex

you are right! this was from an earlier iteration :man_facepalming:

will push a fix to the docs

update: fix: Change URLs in Readme and fix example by filipecabaco · Pull Request #13 · supabase/libcluster_postgres · GitHub

2 Likes

v0.1.2 Release

Link to full changelog

Support for ssl and ssl_opts connection options by @joshknz in #14 for custom SSL certs.

4 Likes

@ziinc

Thanks for the great library. I am trying to make it work inside an AWS Elastic Beanstalk environment, and using a RDS PostgreSQL 16 server.

Dockerfile specifications:

ARG ELIXIR_VERSION=1.15.7
ARG OTP_VERSION=26.2.5
ARG DEBIAN_VERSION=bullseye-20240513-slim

One instance reports, as an example:

21:00:14.839 [error] [libcluster:example] Failed to connect to node: myapp@c72329f86177
21:00:19.847 [warning] [libcluster:example] unable to connect to :myapp@c72329f86177

What can be the reason for that?

1 Like

@acrolink it’s probably an aws networking issue. The error is elixir reporting that nodes in the BEAM network are failing to connect as far as I can tell.

1 Like

Just wanted to leave a note and say, I was having a ton of minor headaches relying on epmd, this just worked. Just in time for needed pubsub/presence features. Thanks for sharing a great library!

7 Likes