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

34 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!

3 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.

2 Likes