Citus in SmartOS Containern

Wie in "Citus auf SmartOS übersetzen" schon erwähnt, läßt sich Citus relativ einfach auf SmartOS "portieren".  Das allein ist zwar schon ganz gut, aber wir wollen Citus natürlich zusammen mit Patroni ausrollen, um Citus Cluster möglichst einfach verwalten zu können.

Ähnlich wie in "Patroni Cluster im Container" muß natürlich auch hier wieder eine Konfiguration für Packer erstellt werden, mit deren Hilfe man ein Image erzeugen kann, welches man dann wiederum mit einer Terraformkonfiguration (in diesem Fall in einer Triton Umgebung) ausbringt.

Die entsprechenden Konfigurationen für Packer und Terraform finden sich in meinem Github Repository.

Für die Erstellung des Images ist im Wesentlichen der Download und das Übersetzen von Citus hinzugekommen. Die kleine Änderung in multi_copy.c, die zum Übersetzen benötigt wird, wurde per Patch gelöst

# Build and install citus extension
      "wget https://github.com/citusdata/citus/archive/refs/tags/v11.2.0.tar.gz -O /tmp/citus-11.2.0.tar.gz",
      "tar xvzf /tmp/citus-11.2.0.tar.gz -C /root",
      "mkdir -p /tmp/citus",
      "cd /tmp/citus ; /root/citus-11.2.0/configure --prefix=/opt/local",
      # patch 
      "patch /root/citus-11.2.0/src/backend/distributed/commands/multi_copy.c < /var/tmp/citus.patch",

Für das Deployment via Terraform ist es erforderlich, zwischen verschiedenen Typen von Datenbankknoten zu unterscheiden:

  • Coordinators
  • Workers

Beide Typen müssen in der Patronikonfiguration in verschiedene Gruppen eingeteilt werden wobei die Gruppe "0" den Coordinators vorbehalten ist. Worker Gruppen werden dann einfach durchnummeriert. Der Terraform Code dafür ist jetzt noch nicht besonders DRY, mal sehen, wie man das bewerkstelligen kann.

Ansonsten muß die patroni.yml nur um drei Zeilen erweitert werden (hier für die erste Worker Group):

citus:
  group: 1
  database: citus

Das führt zum Beispiel dazu, dass im Patroni Output jetzt die "Group" Spalte auftaucht:

-bash-4.3$ patronictl -c /var/pgsql/patroni.yml list
+ Citus cluster: patroni2 -----------+----------------+--------------+------------------+----+-----------+
| Group | Member                     | Host           | Role         | State            | TL | Lag in MB |
+-------+----------------------------+----------------+--------------+------------------+----+-----------+
|     0 | postgresql-citus-control-0 | 192.168.130.61 | Replica      | creating replica |    |   unknown |
|     0 | postgresql-citus-control-1 | 192.168.130.58 | Leader       | running          |  1 |           |
|     1 | postgresql-citus-worker-0  | 192.168.130.60 | Sync Standby | running          |  1 |         0 |
|     1 | postgresql-citus-worker-1  | 192.168.130.59 | Leader       | running          |  1 |           |
+-------+----------------------------+----------------+--------------+------------------+----+-----------+
-bash-4.3$ patronictl -c /var/pgsql/patroni.yml list Patroni2 --group 0
+ Citus cluster: patroni2 (group: 0, 7225895337374731045) ---+---------+----+-----------+
| Member                     | Host           | Role         | State   | TL | Lag in MB |
+----------------------------+----------------+--------------+---------+----+-----------+
| postgresql-citus-control-0 | 192.168.130.61 | Sync Standby | running |  1 |         0 |
| postgresql-citus-control-1 | 192.168.130.58 | Leader       | running |  1 |           |
+----------------------------+----------------+--------------+---------+----+-----------+
-bash-4.3$ patronictl -c /var/pgsql/patroni.yml list Patroni2 --group 1
+ Citus cluster: patroni2 (group: 1, 7225895747313397328) --+---------+----+-----------+
| Member                    | Host           | Role         | State   | TL | Lag in MB |
+---------------------------+----------------+--------------+---------+----+-----------+
| postgresql-citus-worker-0 | 192.168.130.60 | Sync Standby | running |  1 |         0 |
| postgresql-citus-worker-1 | 192.168.130.59 | Leader       | running |  1 |           |
+---------------------------+----------------+--------------+---------+----+-----------+

Zusätzlich erzeugt Patroni dann auch eine postgresql.conf in der die citus Extension geladen wird:

shared_preload_libraries = 'citus'

Was in der Datenbank dann so aussieht:

-bash-4.3$ psql -h 192.168.130.58 -p 5432
Password for user postgres: 
psql (14.6)
Type "help" for help.

postgres=# \l
                              List of databases
   Name    |  Owner   | Encoding | Collate |  Ctype  |   Access privileges   
-----------+----------+----------+---------+---------+-----------------------
 citus     | postgres | UTF8     | C       | C.UTF-8 | 
 postgres  | postgres | UTF8     | C       | C.UTF-8 | 
 template0 | postgres | UTF8     | C       | C.UTF-8 | =c/postgres          +
           |          |          |         |         | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C.UTF-8 | =c/postgres          +
           |          |          |         |         | postgres=CTc/postgres
(4 rows)

postgres=# \c citus
You are now connected to database "citus" as user "postgres".
citus=# \dx
                     List of installed extensions
      Name      | Version |   Schema   |         Description          
----------------+---------+------------+------------------------------
 citus          | 11.2-1  | pg_catalog | Citus distributed database
 citus_columnar | 11.2-1  | pg_catalog | Citus Columnar extension
 plpgsql        | 1.0     | pg_catalog | PL/pgSQL procedural language
(3 rows)

citus=# exit

Im Grunde ist jetzt nur noch eine etwas bessere Worker Verwaltung erforderlich, damit man sich nicht ständig wiederholen muß, wenn man zusätzliche Worker-Cluster hinzufügen will.