Snapshot ZFS ke file sebagai Cadangan dengan rotasi


14

Saya memiliki sistem FreeNAS lokal dan ingin menggunakan snapshot ZFS untuk cadangan.
FreeNAS memiliki Tugas Replikasi bawaan yang digunakan

zfs send snapshot_name

untuk mengirim snapshot ke sistem jarak jauh. Tetapi ini membutuhkan sistem dengan ZFS di ujung yang lain.

Saya ingin mengirim snapshot ke file dan mengirim file terkompresi dan terenkripsi ini ke mesin jarak jauh.

Ini dimungkinkan dengan

zfs send snapshot_name | gzip | openssl enc -aes-256-cbc -a -salt > file.gz.ssl

Setiap hari saya membuat snapshot dari kumpulan penyimpanan dan menyimpan setiap snapshot selama 30 hari.
Dengan setiap snapshot yang diambil, saya akan mem-pipe snapshot ini ke file.
- snapshot_file 1 memiliki setiap file di dalamnya (katakanlah 2GB)
- snapshot_file 2 hanya memiliki perubahan ke snapshot_file 1 (katakanlah 5MB)
- snapshot_file 3 menyimpan perubahan pada snapshot_file 2; dan seterusnya.

Pada hari 31 snapshot_file 1 semakin dihapus (karena saya hanya ingin perubahan dari 30 hari terakhir)

Karena itu snapshot_file 2 perlu menampung setiap file (2GB dari snapshot_file 1 + 5MB perubahan)

Tetapi dengan pendekatan ini setiap hari (mulai hari ke 31) file 2GB baru harus dibuat dan dikirim ke sistem jarak jauh. Ini terlalu banyak overhead.

Apa yang akan menjadi pendekatan terbaik untuk menggunakan snapshots yang disalurkan ke file sebagai strategi cadangan dengan sejarah X hari?

PS: Saya tahu ada banyak perangkat lunak cadangan di luar sana (misalnya rdiff-backup), yang bisa saya gunakan. Tapi saya ingin tahu bagaimana ini bisa dilakukan.


Mengapa tidak Anda gunakan zfs recvdi ujung yang lain (di kolam dengan zfs set compression=gzip-9misalnya). Menyimpan file snapshot terdengar sangat tidak efisien bagi saya.
Stéphane Chazelas

1
@StephaneChazelas karena saya tidak memiliki sistem file ZFS di ujung lainnya. Sistem remote saya adalah kotak gentoo dengan ext4 (saya tahu saya bisa menginstal zfsonlinux, tapi saya lebih suka tidak)
Martin Grohmann

Jawaban:


12

Jika Anda menyimpan snapshot dalam file, tidak seperti dalam sistem file (misalnya dengan zfs receive), saya khawatir, ini tidak mungkin.

ZFS di sisi penerima

Jika Anda menggunakan ZFS pada sisi pengiriman dan sisi penerima, Anda dapat menghindari keharusan mentransfer keseluruhan foto dan hanya mentransfer perbedaan foto tersebut dibandingkan dengan foto sebelumnya:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' | \
  zfs receive

ZFS tahu tentang snapshot dan menyimpan blok timbal balik hanya sekali. Memiliki sistem file yang memahami snapshot memungkinkan Anda untuk menghapus yang lama tanpa masalah.

Sistem file lain di sisi penerima

Dalam kasus Anda, Anda menyimpan snapshot dalam file individual, dan sistem file Anda tidak mengetahui snapshot tersebut. Seperti yang sudah Anda perhatikan, ini merusak rotasi. Anda juga harus mengirim seluruh snapshot, yang akan menghabiskan bandwidth dan ruang penyimpanan, tetapi memungkinkan Anda untuk menghapus snapshot individual. Mereka tidak saling bergantung. Anda dapat melakukan snapshot tambahan seperti ini:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' \
  > incremental-2014-02-04:05

Untuk mengembalikan snapshot tambahan, Anda juga perlu snapshot sebelumnya. Ini berarti Anda tidak dapat menghapus incrementals lama.

Solusi yang memungkinkan

Anda dapat melakukan incrementals seperti yang ditunjukkan pada contoh terakhir saya dan melakukan non-incremental baru setiap bulan. Inkremental baru bergantung pada non-inkremental ini dan Anda bebas untuk menghapus snapshot lama.

Atau Anda bisa mencari solusi cadangan lainnya. Ada rsnapshot , yang menggunakan rsyncdan tautan keras. Ini melakukan pekerjaan yang sangat baik pada rotasi dan sangat efisien bandwidth, karena hanya memerlukan cadangan penuh sekali.

Lalu ada bareo . Itu incrementals, yang hemat bandwidth dan ruang. Ini memiliki fitur yang sangat bagus; itu dapat menghitung cadangan penuh dari satu set inkremental. Ini memungkinkan Anda untuk menghapus incrementals lama. Tapi ini sistem yang agak rumit dan ditujukan untuk pengaturan yang lebih besar.

Solusi terbaik, bagaimanapun, adalah menggunakan ZFS di sisi penerima. Ini akan menjadi bandwidth yang efisien, penyimpanan yang efisien dan jauh lebih cepat daripada solusi lain. Satu-satunya kelemahan yang dapat saya pikirkan adalah bahwa Anda harus memiliki memori minimum 8 GiB ECC pada kotak itu (Anda mungkin baik-baik saja dengan 4 GiB jika Anda tidak menjalankan layanan apa pun dan hanya menggunakannya untuk zfs receive).


ya ini saya tahu. Tetapi bagaimana jika saya menghapus (karena saya hanya ingin memiliki sejarah 30 hari) file dataset @ 2014-02-04? Maka saya hanya memiliki perubahan yang dibuat setelah 4 Februari, tetapi tidak setiap file.
Martin Grohmann

2
@ MartinGrohmann Saya mengerti maksud Anda sekarang. Nah itulah keindahan ZFS, Anda dapat menghapus snapshot lama di ZFS tanpa masalah. Pada sistem file lain Anda harus menyimpan yang lama. Mungkin Anda lebih baik dengan sesuatu seperti rsnapshotitu. Atau Anda bisa memulai non-incremental baru setelah satu bulan dan kemudian menghapus incrementals sebelumnya.
Marco

Terima kasih untuk bantuannya; Saya baru saja menemukan duplikasi Itu mungkin cara untuk pergi dengan kemampuan enkripsi.
Martin Grohmann

2
@MartinGrohmann Duplicity adalah program yang bagus, tetapi mengalami masalah yang sama . Jika Anda hanya melakukan inkremental, ruang Anda terus bertambah. Anda tidak dapat mendapatkan kembali ruang tanpa membuang-buang bandwidth dan melakukan cadangan penuh baru. Baik menggunakan ZFS di kedua sisi atau melihat bareos , ZFS dapat menghitung cadangan lengkap baru dari inkremental. Itu memungkinkan Anda untuk menghapus incrementals lama tanpa mentransfer kembali semuanya.
Marco

Jika bandwidth dari sumber Anda adalah masalahnya, solusi potensial (yang saya terapkan untuk rumah saya ZFS NAS sekarang) adalah untuk selalu hanya mengirim tambahan ke penyimpanan jarak jauh Anda, tetapi sebulan sekali memutar VPS FreeBSD jarak jauh (misalnya, pada digital ocean) yang kemudian dapat membuka snapshot penuh terakhir, zfs mengembalikan beberapa # inkremental ke dalamnya, kemudian menyimpan hasilnya sebagai snapshot baru. VPS hanya perlu sekitar cukup lama untuk membuat cadangan basis baru. Lautan digital memiliki API yang memungkinkan pembuatan / penghancuran VPS mereka dengan mudah. Dan sistem lokal Anda hanya perlu mengirim cadangan tambahan.
stuckj
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.