Wie kann ich Gitlab in großem Maßstab sichern?

13

Wenn Sie den Gitlab-Support fragen, wie ein 3-TB-Backup für ein lokales Gitlab erstellt werden soll, verwenden Sie unser Tool , das einen Tarball erstellt.

Das scheint mir auf allen Ebenen falsch zu sein. Dieser Tarball enthält den Postgres-Dump, Docker-Images, Repo-Daten, GIT-LFS usw. Config und so weiter. Das Sichern von TB statischer Daten zusammen mit KB sehr dynamischen Daten funktioniert nicht richtig. Und dann kommt die Frage: Wir wollen jede Stunde ein Backup machen.

Frage

Ich würde wirklich gerne von anderen erfahren, wie sie es machen, um ein konsistentes Backup zu erhalten.

ZFS unter Linux wäre in Ordnung für mich, wenn das Teil der Lösung ist.

Sandra
quelle
3
Warum ist das falsch? Sie sichern Ihr Gitlab vollständig, um es vollständig wiederherzustellen. Ich denke nicht, dass das falsch ist. Natürlich verbraucht es viel mehr Speicherplatz als beispielsweise inkrementelle Sicherungen, aber ... die Sicherungsgröße interessiert mich nicht.
Lenniey
3
Eine stündliche Sicherung ist keine Seltenheit, aber es ist unmöglich, mit ihrem Ansatz 3 TB in weniger als einer Stunde zu erreichen. Und Backups für nur einen Tag wären ~ 100 TB, wobei möglicherweise nur 10 MB an Daten geändert werden.
Sandra
OK, das ist eine andere Frage, nicht in Bezug auf die Sicherung im Allgemeinen, sondern in Bezug auf häufige Sicherungen.
Lenniey
5
In ihren offiziellen Dokumenten erwähnen sie sogar ihre Methode als langsam und schlagen Alternativen vor: If your GitLab server contains a lot of Git repository data you may find the GitLab backup script to be too slow. In this case you can consider using filesystem snapshots as part of your backup strategy.Ich kann jedoch nicht aus Erfahrung sprechen. Aber ich muss vielleicht bald so etwas
hinzufügen
Gitlab verfügt über Optionen in der Konfigurationsdatei und Backup-Flags, mit denen Sie Abschnitte ausschließen oder Bilder und Artefakte in einem Objektspeicher speichern können
ssube

Antworten:

10

Für eine so kurze Zeit zwischen Sicherungen (1 Stunde) sollten Sie sich am besten auf Snapshots und send/recv Support auf Dateisystemebene verlassen .

Wenn die Verwendung von ZoL in Ihrer Umgebung kein Problem darstellt, empfehle ich dringend, es zu verwenden. ZFS ist ein sehr robustes Dateisystem und Sie werden alle Extras (z. B. Komprimierung), die es bietet, wirklich mögen. In Verbindung mit sanoid/syncoidkann dies eine sehr starke Sicherungsstrategie darstellen. Der Hauptnachteil ist, dass es nicht im Mainline-Kernel enthalten ist, so dass Sie es separat installieren / aktualisieren müssen.

Alternativ können Sie BTRFS verwenden, wenn Sie sich wirklich auf Mainline-Inhalte beschränken möchten. Aber seien Sie sicher, seine (vielen) Nachteile und Pita zu verstehen .

Schließlich ist eine alternative Lösung zu verwenden , lvmthinregelmäßige Backups zu nehmen (zB: mit snapper), auf Tools von Drittanbietern angewiesen (zB bdsync, blocksyncusw.) zu kopieren / Schiff Deltas nur.

Ein anderer Ansatz wäre, zwei replizierte Maschinen (über DRBD) zu haben , über die Sie unabhängige Snapshots erstellen lvmthin.

Shodanshok
quelle
Was ist mit Postgres? Würden Sie gitlab und postgres für eine Minute stoppen, damit ein einheitlicher Shapshot erstellt werden könnte? Im Idealfall wäre es großartig, wenn Postgres in einen schreibgeschützten Modus versetzt werden könnte, während der Schnappschuss erstellt wird.
Sandra
4
@ Sandra, das Snapshots aus einem Dateisystem wiederherstellt, sollte postgresql (und alle anderen ordnungsgemäß geschriebenen Datenbanken) als generisches "Host-Absturz" -Szenario erscheinen und eine eigene Wiederherstellungsprozedur auslösen (dh: Festschreiben einer teilweise geschriebenen Seite für die Hauptdatenbank). Mit anderen Worten, Sie müssen postgres nicht in den schreibgeschützten Modus versetzen, wenn Sie Schnappschüsse aufnehmen.
Shodanshok
14

Ich würde überprüfen, was Sie sichern und möglicherweise einen "Multi-Path" -Ansatz verwenden. Sie können beispielsweise die Git-Repositorys sichern, indem Sie ständig Git-Pulls auf einem Sicherungsserver ausführen. Das würde nur das Diff kopieren und Ihnen eine zweite Kopie aller Git-Repositorys hinterlassen. Vermutlich konnten Sie mit der API neue Repos erkennen.

Und verwenden Sie die "eingebauten" Sicherungsverfahren, um die Probleme usw. zu sichern. Ich bezweifle, dass die 3 TB aus diesem Teil stammen, sodass Sie sehr oft Sicherungen mit sehr geringen Kosten durchführen können. Sie können die PostgreSQL-Datenbank auch mit einem Warm-Standby mit Replikation einrichten.

Möglicherweise stammen Ihre 3 TB aus Container-Images in der Docker-Registrierung. Müssen Sie diese sichern? Wenn ja, dann könnte es einen besseren Ansatz dafür geben.

Grundsätzlich würde ich empfehlen, sich genau anzuschauen, was Ihre Sicherung ausmacht, und die Daten in verschiedenen Teilen zu sichern.

Sogar das Backup-Tool von GitLab bietet Optionen zum Ein- und Ausschließen bestimmter Teile des Systems, z. B. der Docker-Registrierung.

ETL
quelle
1
Git Pulls ist kein perfektes inkrementelles Backup. git push --forcewird entweder die Backups brechen oder den Verlauf von ihnen löschen, je nachdem, wie es implementiert ist.
user371366
@ dn3s deshalb deaktivierst du git push --force immer im Haupt-Repository. Wenn jemand die Geschichte ändern will, kann er seine eigene Gabel bauen und alle damit verbundenen Risiken in Kauf nehmen.
Charlie_pl
2
Dies ist möglicherweise in Ordnung für die Replikation , aber Sie möchten nicht, dass die Integrität Ihrer Sicherungen vom korrekten Anwendungsverhalten abhängt. Was passiert, wenn die Anwendung einen Fehler aufweist oder später falsch konfiguriert wird? Was passiert, wenn Ihr Server von einem böswilligen Benutzer kompromittiert wird? Wenn Ihre Anwendung Inhalte vom Sicherungshost entfernen kann, geht ein Großteil des Werts inkrementeller Remote-Sicherungen verloren.
user371366