Bagaimana Gitlab cadangan skala besar?

13

Ketika meminta dukungan Gitlab tentang cara melakukan pencadangan 3TB pada Gitlab lokal, mereka membalas menggunakan alat kami yang menghasilkan tarball.

Ini hanya keliru bagi saya di semua tingkatan. Tarbal ini berisi dump postgres, gambar buruh pelabuhan, data repo, GIT LFS, dll konfigurasi dan sebagainya. Mencadangkan TB data statis bersama-sama dengan KB data yang sangat dinamis tidak benar. Dan kemudian muncul masalah, kami ingin melakukan backup setiap jam.

Pertanyaan

Saya benar-benar ingin tahu dari orang lain bagaimana mereka melakukannya, untuk mendapatkan cadangan yang konsisten.

ZFS di Linux akan baik-baik saja dengan saya, jika itu adalah bagian dari solusi.

Sandra
sumber
3
Kenapa ini salah? Anda mencadangkan Gitlab sepenuhnya untuk memulihkannya sepenuhnya. Saya tidak berpikir ini salah. Tentu saja menggunakan lebih banyak ruang daripada mengatakan, cadangan inkremental, tapi ... Saya tidak akan peduli tentang ukuran cadangan.
Lenniey
3
Memiliki cadangan setiap jam bukanlah hal yang tidak pernah terjadi, tetapi tidak mungkin membuat 3TB dalam waktu kurang dari satu jam dengan pendekatan mereka. Dan cadangan untuk hanya satu hari adalah ~ 100TB, di mana mungkin hanya ada 10MB perubahan data.
Sandra
OK, ini pertanyaan yang berbeda, bukan tentang cadangan secara umum tetapi tentang cadangan yang sering.
Lenniey
5
Dalam dokumen resmi mereka, mereka bahkan menyebut metode mereka lambat dan menyarankan alternatif: 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.saya tidak bisa berbicara dari pengalaman. Tapi saya mungkin harus memasukkan sesuatu seperti ini segera ...
Lenniey
Gitlab memiliki opsi dalam file konfigurasi dan flag cadangan yang akan memungkinkan Anda untuk mengecualikan bagian, atau sejauh menyimpan gambar dan artefak pada objek toko
ssube

Jawaban:

10

Untuk waktu yang singkat antara cadangan (1 jam), taruhan terbaik Anda adalah mengandalkan snapshot dan send/recv dukungan tingkat sistem file .

Jika menggunakan Zool tidak menjadi masalah di lingkungan Anda, saya akan sangat menyarankan untuk menggunakannya. ZFS adalah sistem file yang sangat kuat dan Anda akan sangat menyukai semua ekstra (mis: kompresi) yang ditawarkannya. Ketika digabungkan dengan sanoid/syncoid, itu dapat memberikan strategi cadangan yang sangat kuat. Kerugian utama adalah tidak dimasukkan ke dalam kernel mainline, jadi Anda perlu menginstal / memperbaruinya secara terpisah.

Atau, jika Anda benar-benar perlu membatasi diri pada hal-hal yang termasuk dalam arus utama, Anda dapat menggunakan BTRFS. Tapi pastikan untuk memahami kelemahan dan pita (banyak) .

Akhirnya, solusi alternatif adalah dengan menggunakan lvmthinuntuk mengambil backup secara teratur (misalnya: dengan snapper), mengandalkan alat pihak ketiga (misalnya: bdsync, blocksync, dll) untuk menyalin / delta kapal saja.

Pendekatan yang berbeda adalah dengan memiliki dua mesin yang direplikasi (via DRBD) di mana Anda mengambil snapshot indipenden melalui lvmthin.

shodanshok
sumber
Bagaimana dengan postgres? Apakah untuk menghentikan gitlab dan postgres sebentar, sehingga shapshot yang konsisten dapat dibuat? Idealnya akan lebih bagus jika postgres dapat dimasukkan ke dalam mode read-only ketika snapshot dibuat.
Sandra
4
@Sandra yang memulihkan dari snapshot sistem file akan muncul di postgresql (dan basis data lain yang ditulis dengan benar) sebagai skenario generik "host crash", memicu prosedur pemulihannya sendiri (yaitu: melakukan ke basis data utama setiap halaman yang ditulis sebagian). Dengan kata lain, Anda tidak perlu menempatkan postgres ke mode baca-saja saat mengambil foto.
shodanshok
14

Saya akan meninjau apa yang Anda cadangkan dan mungkin menggunakan pendekatan "multi-path". Misalnya, Anda dapat membuat cadangan repositori Git dengan terus-menerus menjalankan tarikan Git pada server cadangan. Itu hanya akan menyalin perbedaan dan meninggalkan Anda dengan salinan kedua dari semua repositori Git. Agaknya Anda bisa mendeteksi repo baru dengan API.

Dan gunakan prosedur pencadangan "bawaan" untuk mencadangkan masalah, dll. Saya ragu bahwa 3TB berasal dari bagian ini sehingga Anda dapat melakukan pencadangan sangat sering dengan biaya yang sangat sedikit. Anda juga bisa mengatur database PostgreSQL dengan siaga hangat dengan replikasi.

Kemungkinan 3TB Anda berasal dari gambar kontainer di registri Docker. Apakah Anda perlu mendukungnya? Jika demikian, maka mungkin ada pendekatan yang lebih baik hanya untuk itu.

Pada dasarnya, saya akan merekomendasikan benar-benar melihat apa yang membuat cadangan Anda dan membuat cadangan data di berbagai bagian.

Bahkan alat cadangan dari GitLab memiliki opsi untuk memasukkan / mengecualikan bagian-bagian tertentu dari sistem seperti Docker Registry.

ETL
sumber
1
git pulls bukan cadangan inkremental yang sempurna. git push --forceakan memecah cadangan atau menghapus riwayat dari mereka, tergantung pada bagaimana itu diterapkan.
user371366
@ dn3s itulah sebabnya Anda selalu menonaktifkan git push --force pada repositori utama. Jika seseorang ingin mengubah sejarah, mereka dapat membuat garpu sendiri, dan menerima semua risiko yang ditimbulkannya.
charlie_pl
2
itu mungkin baik untuk replikasi , tetapi Anda tidak ingin integritas cadangan bergantung pada perilaku aplikasi yang benar. apa yang terjadi jika ada bug dalam aplikasi, atau kesalahan konfigurasi di jalan? bagaimana jika server Anda dikompromikan oleh pengguna jahat? jika aplikasi Anda memiliki kemampuan untuk menghapus konten dari host cadangan, sebagian besar nilai backup jarak jauh tambahan hilang.
user371366