ZFS'de inek kopyaları oluşturmanın bir yolu var mı?


14

Bazı dosyaların / dizinlerin inek kopyalarını yapmaya çalışıyorum, ancak bildiğim birkaç yoldan hepsi en uygun görünmüyor.

Örneğin, btrfs cp --reflink=auto, dosyaların hızlı bir şekilde inek kopyalarını oluşturarak kullanılabilir .

Ne denedim:

  1. Symlinks: İyi değil. Dosya yeniden adlandırıldı, bağlantı koptu.
  2. Hardlinks: Daha iyi, ama yine de iyi değil. Bir dosyada yapılan değişiklikler diğerini değiştirecek ve diğer dosyanın değiştirilmesini istemiyorum.
  3. Veri kümesinin anlık görüntüsünü oluşturun, sonra anlık görüntüyü klonlayın: Bu işe yarayabilir, ancak iyi olmayabilir. Genellikle tüm veri kümesinin bir kopyasını veya kopyaların başka bir veri kümesi gibi davranmasını istemiyorum. Sonra klon / enstantane / orijinal arasında ebeveyn / çocuk ilişkileri var, ki anladığım kadarıyla zor, kırılması imkansız değil.
  4. zfs send/receiveVeri kümesini kullanarak ve etkinleştirilmiş yinelemeyi kullanarak , veri kümesini yeni bir veri kümesine çoğaltın: Bu, bir klon kullanmanın üst / alt ilişkilerini önler, ancak yine de gereksiz yere başka bir veri kümesi oluşturur ve yine de% 100 okunması gereken dosyalarda yer alan yavaşlıktan muzdarip ve bloklar yazılı yerine tekrar başvurdu.
  5. Dosyaları kopyalayın ve yinelenenleri kaldırma işleminin işini yapmasına izin verin: Bu, ancak dosyaların% 100 okunması ve daha sonra bloklar yazmak yerine yeniden başvurulması gerektiği için yavaştır.

Zfs gönderme / alma ve fiziksel olarak kopyalama veya rsyncing yavaşlığı daha da kötüleşir çünkü çoğu şey sıkıştırılmış olarak saklanır ve okuma sırasında sıkıştırılmış, daha sonra yinelenen bloklara başvurmak için tekilleştirmeden önce sıkıştırılmış olmalıdır.

Tüm araştırmalarımda, btrfs'deki --reflink'in basitliğine benzeyen hiçbir şey bulamadım.

Peki, ZFS'de inek kopyaları oluşturmanın bir yolu var mı? Yoksa “fiziksel olarak” kopyalama ve tekilleştirme işleminin tek gerçek seçenek olmasını sağlıyor mu?

Yanıtlar:


4

Yukarıda açıkladığınız gibi seçenek 3 muhtemelen en iyi bahistir. İstediğinizle ilgili en büyük sorun, ZFS'nin bu yazma üzerine kopyalamayı veri kümesi / anlık görüntü düzeyinde gerçekten işlemesi.

Kesin ortamınızla iyi çalıştığını doğrulamadıysanız, tekilleştirme kullanmaktan kaçınmanızı şiddetle öneririm. Bir daha kullanıcı veya VM mağazası taşınana kadar yinelenenleri kaldırma konusunda harika bir deneyime sahibim ve daha sonra bir performans uçurumundan düşüyor ve birçok soruna neden oluyor. İlk on kullanıcıyla harika çalışıyor gibi göründüğü için, onbirinci (veya onikinci veya on üçüncü veya başka bir şey) eklediğinizde makineniz devrilebilir. Bu rotaya gitmek istiyorsanız, üretim ortamınızı tam olarak taklit eden bir test ortamına sahip olduğunuzdan ve bu ortamda iyi çalıştığından emin olun.

Seçenek 3'e geri dönmek için, yönetmek istediğiniz dosya sistemi ağaçlarının her birini bu şekilde tutmak için belirli bir veri kümesi ayarlamanız gerekir. Ayarladıktan ve başlangıçta doldurulduktan sonra, anlık görüntülerinizi alın (her veri seti için biraz farklı olacak şekilde) ve ardından klonlara tanıtın. Asla orijinal veri kümesine tekrar dokunmayın.

Evet, bu çözümün sorunları var. Söylemiyorum, ama ZFS'nin kısıtlamaları göz önüne alındığında, muhtemelen en iyisi. Bu referansı klonları etkili bir şekilde kullanan birine buldum: http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

Ben btrfs ile gerçekten aşina değilim, ancak istediğiniz seçenekleri destekliyorsa, bu sunucudaki Linux ve btrfs kullanarak sadece bu veri kümelerini desteklemek için ayrı bir sunucu kurmayı düşündünüz mü?


Bu düşünce için iyi bir besindir. Eğer “efendi” (ve böylece çocuklar) yeterince büyük değişikliklere ihtiyaç duyarsa, efendinin bir klonu yapılabilir, geliştirilebilir, yeni master pozisyonuna yükseltilebilir, o zaman yeterince farklı olan herhangi bir yardımcı klonun rsync tarafından belirlenmiş varyasyonları olabilir bir yana, klonlar yeni ustadan yok edildi ve yeniden hazırlandı ve değişiklikler tutulan bir yana malzemeden geri çekildi. Bu harika bir çözüm gibi görünmüyor, ancak iyi bir çözüm gibi görünmeye başlıyor ve yinelenenleri kaldırma işleminin etkinleştirilmesi yükünü kurtarıyor. Bunu daha çok düşünmeliyim.
killermist

Evet, bu harika bir çözüm değil, ama tarif ettiklerinizden en az acı verici gibi görünüyor ve başkalarını düşünemedim.
jlp

Noktanızın özeti github.com/zfsonlinux/zfs/issues/405 ile gösterilmektedir. Temel olarak, ZFS dosya tabanlı COW'yu desteklemez, sadece veri kümesi COW'dur, bu nedenle BTRFS'ye eşdeğer değildir cp --reflink=auto.
mtalexan

1

Seçenek 5 en iyisidir.

Seçenek 3'teki üst / alt veri kümeleriyle ilgili olarak, bir klonu tanıtabilirsiniz ve artık klonlanan veri kümesinin bir alt öğesi olmayacaktır. Hala fazladan blok kullanmayacak. Düzenleme: Bu sadece üst / alt ilişkisini tersine çevirir, yok eder kaydetti.

Sıkıştırılmış / şifrelenmiş ve kopyayı yavaşlatan şeylerde bu tamamen yanlıştır. İşlemciniz blok cihazınızdan çok daha hızlı (SSD'ler kullanıyor olsa bile). Sadece bazı örnek sayılar için, bir bloğun okunmasının 10 saniye sürdüğünü, ancak sıkıştırmasının açılması sadece bir saniye ve şifresini çözmek için 2 saniye sürdüğünü varsayalım. Blok 1 10 saniye içinde okunur ve CPU'ya gönderilir. Disk, blok 2'yi okumaya başlarken CPU sıkıştırmayı açmaya ve şifresini çözmeye başlar. CPU, görevini 3 saniye içinde bitirir ve sonraki 7 saniyeyi diskte bekleyerek geçirir. Disk bu arada, blokların sıkıştırılıp sıkıştırılmadığına bakılmaksızın, bu iki bloğu (20 saniye) okumak için tam olarak aynı zaman harcamıştır.

Aynı şekilde yazarken sadece ilk blok ertelenir. CPU blok 1'i sıkıştırır / şifreler ve diske gönderir. Disk 1 bloğunu yazarken CPU sonraki blokları sıkıştırmaya / şifrelemeye başlayacaktır. CPU, blokların yazabileceğinden çok daha hızlı bloklar çiğneyecektir, bu bir sorun değildir. (Evet, bundan daha karmaşık, ama bu öz.)

Sorunuzdaki küçük bir noktanın aşırı uzun açıklaması için özür dilerim, ama bu yanlış anlayışı gidermek istedim.


1
Bir klonu teşvik etmek sadece ebeveyn olarak kabul edilen ve çocuk olarak kabul edilen anahtarları değiştirir. Aradaki anlık görüntüyü yok etmek imkansızdır, çünkü orijinal ebeveyn artık yükseltilen klonun bir çocuğu olan anlık görüntünün bir çocuğudur. Bunun da ötesinde, gereksiz bir şekilde, sadece veri kümesi içindeki dosyaları çoğaltmak istediğim veri kümesi benzeri yapılar oluşturuyor.
killermist

Ayrıca, yinelenenleri kaldırma özelliği etkinleştirilmiş bir havuzda, sıkıştırma yavaşlaması sonucuna katılmıyorum. Sıkıştırma etkinleştirilmiş bir veri kümesinden sıkıştırma etkinleştirilmiş bir veri kümesine kopyalama, hızlar nadiren 5 Mb / sn'yi aştı. Bir veri kümesinde veya diğerinde sıkıştırma devre dışı bırakılmışsa, hızlar ortalama 10-15 Mb / sn'ye atlar. Her iki tarafın sıkıştırması devre dışı bırakıldığında, 20Mb / sn'yi bundan daha yüksek ani artışlarla kolayca görüyorum (muhtemelen bölümler daha yavaş ortamdan çekmek yerine ramdaki yinelenenleri kaldırma tablosuna vuruyor).
killermist

1
Klonlama ile ilgili cevabımı güncelledim. Sıkıştırma / şifreleme / veri tekilleştirmeye gelince, yavaşlamaların nedeni DDT'nin güncellenmesi sıkıştırma veya şifrelemeden daha fazladır. Deneyimlerime göre, sıkıştırma ve şifrelemenin etkisi her zaman ihmal edilebilir olmuştur. Sanırım YMMV.
Bahama
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.