Save the whales - äh manatees

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.