Apakah ada cara untuk membuat salinan sapi di ZFS?

14

Saya mencoba membuat salinan dari beberapa file / direktori, tetapi dari beberapa cara yang saya ketahui, semuanya tampak kurang optimal.

Sebagai contoh, btrfs dapat, dengan penggunaan cp --reflink=autocepat menghasilkan salinan file.

Apa yang saya coba:

  1. Symlinks: Tidak bagus. Mengganti nama file, tautan rusak.
  2. Hardlink: Lebih baik, tetapi masih tidak bagus. Perubahan pada satu file akan mengubah yang lain, dan saya tidak selalu ingin file lainnya diubah.
  3. Buat snapshot dari dataset, lalu clone snapshot: Ini bisa berfungsi, tetapi tidak baik. Seringkali saya tidak mencari salinan seluruh dataset, atau untuk salinan berfungsi seperti dataset lain. Lalu ada hubungan orang tua / anak antara klon / snapshot / asli, yang seperti yang saya pahami sulit, jika tidak mungkin untuk diputus.
  4. Menggunakan zfs send/receive, dan mengaktifkan dedup, mereplikasi dataset ke dataset baru: Ini menghindari hubungan orang tua / anak menggunakan klon, tetapi masih perlu membuat dataset lain, dan masih menderita dari kelambatan yang terlibat dalam file yang harus dibaca 100% dan blok direferensikan lagi alih-alih ditulis.
  5. Salin file dan biarkan dedup melakukan tugasnya: Ini berfungsi, tetapi lambat karena file tersebut harus 100% dibaca dan kemudian blok direferensikan alih-alih menulis.

Lambatnya zfs mengirim / menerima dan secara fisik menyalin atau rsyncing semakin diperburuk karena sebagian besar hal disimpan terkompresi, dan harus didekompresi selama membaca, kemudian dikompresi sebelum pemotongan tendangan untuk referensi blok duplikat.

Dalam semua penelitian saya, saya belum dapat menemukan apa pun yang menyerupai kesederhanaan --reflink di btrfs.

Jadi, apakah ada cara untuk membuat salinan sapi di ZFS? Atau apakah "secara fisik" menyalin dan membiarkan dedup melakukan tugasnya satu-satunya pilihan nyata?

pembunuh kulit
sumber

Jawaban:

4

Saya pikir opsi 3 seperti yang telah Anda jelaskan di atas mungkin adalah taruhan terbaik Anda. Masalah terbesar dengan apa yang Anda inginkan adalah ZFS benar-benar hanya menangani copy-on-write ini pada tingkat dataset / snapshot.

Saya sangat menyarankan menghindari menggunakan dedup kecuali Anda telah memverifikasi bahwa itu bekerja dengan baik dengan lingkungan Anda. Saya memiliki pengalaman pribadi dengan dedup bekerja dengan baik sampai satu lagi pengguna atau toko VM dipindahkan, dan kemudian jatuh dari tebing kinerja dan menyebabkan banyak masalah. Hanya karena sepertinya berfungsi baik dengan sepuluh pengguna pertama Anda, mesin Anda mungkin jatuh ketika Anda menambahkan kesebelas (atau kedua belas, atau ketiga belas, atau apa pun). Jika Anda ingin menempuh rute ini, pastikan Anda memiliki lingkungan pengujian yang persis meniru lingkungan produksi Anda dan berfungsi dengan baik di lingkungan itu.

Kembali ke opsi 3, Anda harus menyiapkan set data tertentu untuk menahan setiap pohon sistem file yang ingin Anda kelola dengan cara ini. Setelah Anda mengaturnya dan awalnya dihuni, ambil snapshot Anda (satu per dataset yang akan sedikit berbeda) dan promosikan kemudian ke dalam klon. Jangan pernah menyentuh dataset asli lagi.

Ya, solusi ini memiliki masalah. Saya tidak mengatakan itu tidak, tetapi mengingat pembatasan ZFS, itu mungkin masih yang terbaik. Saya memang menemukan referensi ini kepada seseorang yang menggunakan klon secara efektif: http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

Saya tidak terlalu mengenal btrf, tetapi jika ia mendukung opsi yang Anda inginkan, sudahkah Anda mempertimbangkan untuk menyiapkan server terpisah hanya untuk mendukung dataset ini, menggunakan Linux dan btrf di server itu?

jlp
sumber
Ini adalah makanan yang bagus untuk dipikirkan. Jika "master" (dan dengan demikian anak-anak) membutuhkan perubahan yang cukup besar, klon master dapat dibuat, ditingkatkan, dipromosikan ke posisi master baru, maka setiap klon pembantu yang cukup jauh berbeda dapat memiliki variasi yang ditentukan ditentukan. Di samping itu, klon-klon tersebut menghancurkan dan membuat ulang dari master baru, dan perubahan menarik kembali dari materi yang dikesampingkan. Ini tidak terlihat seperti solusi yang bagus, tetapi mulai terlihat seperti solusi yang baik, dan tidak menghemat biaya karena dedup diaktifkan. Harus memikirkan ini lebih lanjut.
killermist
Ya, itu bukan solusi yang bagus, tetapi tampaknya itu yang paling tidak menyakitkan dari yang telah Anda jelaskan dan saya tidak bisa memikirkan yang lain.
jlp
Ringkasan poin Anda diilustrasikan oleh github.com/zfsonlinux/zfs/issues/405 Pada dasarnya, ZFS tidak mendukung COW berbasis file, hanya dataset COW, jadi tidak ada yang setara dengan BTRFS cp --reflink=auto.
mtalexan
1

Opsi 5 adalah yang terbaik.

Berkenaan dengan dataset orangtua / anak di opsi 3, Anda dapat mempromosikan klon dan itu tidak akan lagi menjadi anak dari dataset yang dikloning. Masih tidak akan menggunakan blok tambahan. Sunting: Dicatat bahwa ini hanya membalikkan hubungan orang tua / anak, bukan menghancurkannya.

Berkenaan dengan hal-hal yang dikompresi / dienkripsi dan memperlambat salinan, itu sepenuhnya salah. Prosesor Anda jauh lebih cepat daripada perangkat blok Anda (bahkan jika menggunakan SSD). Hanya untuk beberapa contoh angka, misalkan dibutuhkan 10 detik untuk membaca blok, tetapi hanya perlu satu detik untuk mendekompresnya dan 2 detik untuk mendekripsi. Blok 1 dibaca dalam 10 detik dan dikirim ke CPU. CPU mulai mendekompresi dan mendekripsi ketika disk mulai membaca blok 2. CPU akan menyelesaikan tugasnya dalam 3 detik dan kemudian menghabiskan 7 detik berikutnya menunggu di disk. Sementara itu disk telah menghabiskan jumlah waktu yang sama persis membaca dua blok (20 detik) terlepas dari apakah blok dikompresi atau tidak.

Demikian juga saat menulis, hanya blok pertama yang ditunda. CPU mengompres / mengenkripsi blok 1 dan mengirimkannya ke disk. Saat disk menulis blok 1, CPU akan mulai mengompresi / mengenkripsi blok berikutnya. CPU akan mengunyah blok jauh lebih cepat daripada disk dapat menulisnya sehingga tidak menjadi masalah. (Ya, ini lebih kompleks dari ini, tapi ini intinya.)

Maaf untuk penjelasan yang terlalu panjang tentang poin kecil dalam pertanyaan Anda, tetapi saya ingin menjernihkan kesalahpahaman itu.

bahamat
sumber
1
Mempromosikan klon hanya beralih yang dianggap sebagai orangtua dan yang dianggap sebagai anak. Tetap tidak mungkin untuk menghancurkan snapshot di antara karena orangtua asli sekarang adalah anak dari snapshot, yang sekarang adalah anak dari klon yang dipromosikan. Selain itu, masih tidak perlu membuat konstruksi seperti dataset di mana saya hanya ingin mereplikasi file dalam dataset.
killermist
Selain itu, pada kumpulan dengan dedup diaktifkan, saya harus tidak setuju dengan kesimpulan tentang perlambatan kompresi. Menyalin dari dataset dengan kompresi diaktifkan ke dataset dengan kompresi diaktifkan, kecepatan jarang melebihi 5Mb / detik. Jika satu dataset atau yang lain memiliki kompresi dinonaktifkan, kecepatan melompat ke rata-rata 10-15Mb / detik. Dengan kompresi kedua sisi dinonaktifkan, saya melihat 20 MB / detik dengan mudah dengan lonjakan lebih tinggi dari itu (mungkin karena bagian memukul tabel dedup di ram daripada menarik dari media yang lebih lambat).
killermist
1
Saya memperbarui jawaban saya sehubungan dengan kloning. Adapun kompresi / enkripsi / dedup, perlambatan lebih disebabkan oleh memperbarui DDT daripada kompresi atau enkripsi. Dalam pengalaman saya, dampak kompresi dan enkripsi selalu diabaikan. Saya kira YMMV.
bahamat