Wie viele wahrscheinlich nicht wissen, ist auch bei Triton die "source of truth", die "Quelle der Wahrheit" ein Datenbank Cluster. Dies besteht aus drei Postgres-Instanzen, die - ähnlich wie bei einem Patroni-Cluster - zusammengeschaltet sind. Da Patroni aber erst später kam, verwendet Manatee - so heißt das Projekt innerhalb von Triton - Zookeeper und den sogenannten Manatee-Sitter, um das Cluster aufzubauen:
Der Manatee User-Guide und der Manatee Troubleshooting Guide aus dem Github Repository sowie der Manatee Overview und Troubleshooting Manatee aus der offiziellen Triton Dokumentation enthalten noch mehr Informationen.
Beim Aufbau einer Triton Umgebung wird zunächst der sogenannte "Headnode" installiert. Nach der Installation laufen dort alle Komponenten. Um die Ausfallsicherheit zu erhöhen, können danach weitere Compute Nodes vom Headnode aus per IPXE gebootet werden, um auf diesen danach weitere Instanzen der auf dem Headnode installierten Komponenten hochzufahren. In der Dokumentation wird dies unter "Core services, resilience and continuity" behandelt.
Es ist sinnvoll einen HA-Cluster mit Manatee aufzubauen, weil sonst der Verlust der Datenbank (sofern keine Backups vorhanden sind) vermutlich den Verlust der gesamten Umgebung bedeutet. Was aber passiert, wenn bei einem HA-Setup auf drei Compute Nodes, ein Compute Node verloren geht?
Das war nämlich passiert - Triple Disk Failure. Sobald man in der AdminUI bei dem betroffenen Compute Node auf "forget Server" klickt, wird dieser aus der Datenbank gelöscht - inklusive aller Instanzen, die darauf gelaufen sind. Danach sieht der Manatee Cluster dann z. B. so aus:
[root@6589d30f-5fe7-4e79-899e-c6b0f540b9c0 (my-dc-2:manatee0) ~]# manatee-adm show -v
zookeeper: 10.65.68.9
cluster: sdc
generation: 77 (B6/952E6978)
mode: normal
freeze: not frozen
ROLE PEERNAME IP
primary 6589d30f-5fe7-4e79-899e-c6b0f540b9c0 10.65.68.14
sync 5e0a09bb-6f04-4ffe-aeb7-ac1cb23b93ed 10.65.68.51
ROLE PEER PG REPL SENT FLUSH REPLAY LAG
primary 6589d30f ok sync B6/A7A09788 B6/A7A09788 B6/A7A07FF0 -
sync 5e0a09bb ok - - - - 0m01s
warning: cluster has no async peers
Aber man muß nicht verzagen. Man kann einfach auf einem neuen oder "überlebenden" Compute Node eine neue Manatee Instanz provisionieren:
[root@headnode (my-dc-2) ~]# service_uuid=`sdc-sapi /services?name=manatee | json -Ha uuid`
[root@headnode (my-dc-2) ~]# echo $service_uuid
39d2a46e-4f52-4776-b822-39e7e6ac2aee
[root@headnode (my-dc-2) ~]# cn_uuid=94caf9cd-15a7-4ee8-b290-0f2b578253d4
[root@headnode (my-dc-2) ~]# echo $cn_uuid
94caf9cd-15a7-4ee8-b290-0f2b578253d4
[root@headnode (my-dc-2) ~]# printf '{
> "service_uuid": "%s",
> "params": {
> "alias": "manatee3",
> "server_uuid": "%s"
> }
> }' "$service_uuid" "$cn_uuid" | sapiadm provision
Provisioned instance a7fdcdaa-1180-468f-bd28-730bdd17aca4 successfully
[root@headnode (my-dc-2) ~]#
Die Instanz zieht sich dann automatisch per zfs receive
einen Snapshot der Postgresdaten von der synchronen Instanz und fährt damit die Postgres Datenbank hoch. Danach ist der Cluster dann wieder komplett:
[root@headnode (my-dc-2) ~]# zlogin $(vmadm lookup alias=~manatee0)
[Connected to zone '6589d30f-5fe7-4e79-899e-c6b0f540b9c0' pts/8]
Last login: Mon Jan 16 08:08:33 on pts/8
= J O Y E N T =
sdc-postgres (release-20221215-20221215T002321Z-gd99bcd2)
https://github.com/tritondatacenter/sdc-manatee.git
triton-origin-multiarch-15.4.1@1.0.1
[root@6589d30f-5fe7-4e79-899e-c6b0f540b9c0 (my-dc-2:manatee0) ~]# manatee-adm show -v
zookeeper: 10.65.68.9
cluster: sdc
generation: 77 (B6/952E6978)
mode: normal
freeze: not frozen
ROLE PEERNAME IP
primary 6589d30f-5fe7-4e79-899e-c6b0f540b9c0 10.65.68.14
sync 5e0a09bb-6f04-4ffe-aeb7-ac1cb23b93ed 10.65.68.51
async a7fdcdaa-1180-468f-bd28-730bdd17aca4 10.65.68.112
ROLE PEER PG REPL SENT FLUSH REPLAY LAG
primary 6589d30f ok sync B7/20767698 B7/20767698 B7/20765CC0 -
sync 5e0a09bb ok async B7/20767698 B7/20767698 B7/20765CC0 0m03s
async a7fdcdaa ok - - - - 0m03s
[root@6589d30f-5fe7-4e79-899e-c6b0f540b9c0 (my-dc-2:manatee0) ~]#
Hier der Link zum entsprechenden Thread auf der Mailingliste.