ZFS: Bir sürücüyü kaybettikten sonra doğru sayıda kopyayı nasıl geri yüklersiniz?


12

Zfs ile, copies=2bu kopyalardan bazılarını içeren bir sürücünüz varsa ve sonra kaybederseniz, sisteme etkilenen dosyalar için veri bloklarının yeni bir kopyasını yapması gerektiğini nasıl anlarsınız? Yoksa zfs, kötü veri blokları hakkında bilgi bulur bulmaz ekstra kopyalar için veri blokları eklemeye mi başlıyor?

Scrub bunu yapacak mı?

(v0.6.0.56-rc8, ZFS havuzu sürüm 28, ZFS dosya sistemi sürüm 5, Ubuntu 11.10)

Yanıtlar:


10

"kopya = 2" (veya 3) artıklık bulunmayan havuzlarda (tek disk veya şeritler) kullanılmak üzere tasarlanmıştır. Amaç, tüm cihaz arızasını değil, küçük disk bozulmalarını düzeltmektir. İkinci durumda, havuz sökülemez, bu nedenle herhangi bir ditto bloğu restorasyonu gerçekleşemez.

Yedekliğiniz varsa (yansıtma / raidz / raidz2 / raidz3), ditto blokları diğerlerinden farklı değildir ve ovma / yeniden yaşlandırma onları yeniden oluşturur.


Bu, @Redmumba'nın söyledikleriyle doğrudan çelişir - ve Redmumba koda bağlantılar sağlar. Söyledikleriniz için bazı kaynaklar gösterebilir misiniz? Özellikle, nüshaların = N'nin tüm cihaz arızasıyla başa çıkmayacağını düşündüğünüz için iyi alıntılar görmek isterim - bu, okuduğum hiçbir şeyle eşleşmiyor.
James Moore

1
@ James Moore Bütün bir cihaz arızasından sonra, o diske herhangi bir ditto bloğu yazılmaz. Havuz düzeyinde artıklık yoktur, bu nedenle hatalı diski yenisiyle değiştirmenin bir yolu yoktur. Bu durumu düzgün bir şekilde kurtarmanın tek yolu, havuzun tam bir yedeğini almak, sağlıklı cihazlarla yeniden oluşturmak ve yedeklemeden geri yükleme yapmak ve ilk yedekleme yapılmadan önce istenmeyen yeniden başlatma yapılmamasını sağlamaktır. Aksi takdirde havuz alınamayabilir ve verileri kaybedilebilir. Bu, kötü bir diskin kurtarılmasının çevrimiçi olarak yapıldığı ve yeniden başlatmalardan sağ kurtulduğu gereksiz havuzlara kıyasla oldukça bir yüktür.
jlliagre

1
İşte bir referans: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). Kopyaların = 2 veya 3'ün gereksiz bir yapılandırma olarak kabul edilmediğini varsayıyorum.
jlliagre

1
Bununla birlikte, akılda tutulması gereken bir şey, eğer başlangıçta sahip copies=1olsaydınız ve yükselttiyseniz copies=2, muhtemelen daha sonra yeniden diriltmek / yeniden ovmak isteyeceksiniz - ki bu örnekleri yaratacaktır. Ancak @jilliagre doğrudur: ditto blokları gereksiz bir yapılandırma oluşturmaz. Havuzda birden fazla cihazınız olsa bile blokların başka bir cihazda ayarlandığının garantisi yoktur.
Andrew M.12

1
"kopyalar = N, burada N> 1" özelliğinin artıklık eklemesi amaçlanmamıştır. veri bozulmasını gidermeyi amaçlamaktadır. zfs'ye yazılan her şey sağlama toplamı veya karma olur. tekrar okunduğunda, sağlama toplamı / karması doğrulanır. N = 1 ise, bir sağlama toplamı / karma doğrulama hatası uygulamaya geri dönüşte hataya neden olur. N> 1 ise, diğer kopyalardan birine danışılabilir ve diğer tüm kopyaları onarmak için kullanılabilir.
longneck

9

Bu soruyu gerçekten ilginç buldum ve belgelere dökülen bir saat geçirdikten sonra koda girdim. İşte bulduğum şey.

İlk olarak, bazı terminoloji. Aynen blokları (bu kopyaların aynısıdır, aynaların aksine) bir yazmada otomatik olarak oluşturulur, ancak orijinal kopyayla aynı sanal aygıtta (vdev) olabilir veya olmayabilir. Öte yandan, yansıtılan bloklar her zaman başka bir sanal cihaza yansıtılır.

Bununla birlikte, kod her iki blok tipine çocuk olarak atıfta bulunur. Burada ditto bloklarının sadece çocuk olduğunu göreceksiniz io_vd == NULL(bu yazma fonksiyonundadır). Yansıtılmış bir blok io_vdiçin, karşılık gelen sanal cihaza (örneğin ikinci diskiniz) ayarlanır.

Bunu akılda tutarak, okuma bölümüne ulaştığında , tüm çocukları (ayna veya ditto blokları olsun), beklenmedik bir şekilde içermiyorsa potansiyel olarak güvenli değil good_copiesve gerektiğinde yeniden yazar . Bu, sorunuzun cevabı gibi görünüyor - evet, en az bir iyi kopyanız olduğunda ve aşağıdakilerden herhangi biri olduğunda bunları yeniden yazacaktır:

  • Verileri okumaya çalıştığınızda beklenmeyen hatalar,
  • Yeniden yaşıyorsun veya
  • Ovuyorsun.

Uf! Belki birisi kusurları gösterebilir, ancak bu küçük egzersizle ZFS hakkında bilgi edinmek hoşuma gitti ve umarım bu yardımcı olur!


1
Sorun @ jlliagre'nin cevabında - herhangi bir cihazı kaybederse havuz öldü. Havuzun hala yeterli ditto blokları olması önemli görünmüyor. Bunun herhangi bir yolu var mı?
James Moore

4
@JamesMoore, başarısız olan cihazın ilk 1 MB'ına sahipseniz diziyi çevrimiçi olarak bozulmuş bir duruma zorlayabilirsiniz. Muhtemelen sadece başarısız cihazdan meta verilere ihtiyacınız vardır. Ben bir jbod tarzı zpool ile test ettik ve işe yarıyor: raidz kırık etiketleri kurtarma . Zpool kırmadan önce ve sonra bir md5sum yaptım ve sadece kopyalar = 1 dosya sistemi içe aktarımdan sonra bozuldu. Kopya sayısı = 2 ve kopya sayısı = 3 dosya sistemi mükemmel şekilde eşleşti.
Jodie C

2

@jlliagre ve tüm zpool disklerden biri (vdevs) ölür ama havuz gereksiz (ayna / raidz) olduğunu düşünüyor gibi görünen diğerleri. Bu doğru değil; ayna veya raidz olmasa bile , çok diskli bir havuz her zaman tek bir tam disk arızasından kurtulacaktır.

ZFS Meta Verileri her zaman en az 2 kez kopyalanır, böylece tam bir diskin (veya herhangi bir kısmının) toplam hatası dosya sistemini devralmaz. Ayrıca, birçok dosya, özellikle de daha küçük dosyalar, tüm disklere dağıtılmayacak ve bu nedenle disk arızasından dolayı mutlaka hatalı olmayacaktır. OP, ditto blokları (kullanıcı veri kopyaları> 1) kullanan bir çoklu disk havuzunun durumunu soruyor . Burada, tek bir tam disk hatası hiçbir zaman veri kaybına neden olmamalıdır .ZFS her zaman ditto bloklarını orijinal bloktan uzağa koymaya çalışacaktır ve birden fazla vdev'li havuzlar için bu her zaman başka bir vdev anlamına gelir (bir vdev'in havuzun>% 50'si olduğu bir istisna olabilir, bu çok olağandışı olacaktır) . Dosya sistemi meta verileri de her zaman ditto seviyesinden +1 veya +2 ​​kat daha fazla kopyalanır , böylece her zaman disk arızasından kurtulur. Ayrıca, üçten fazla diskiniz varsa, veri kaybı olmadan bunların yarısını kaybedebilirsiniz; ZFS, iki bitişik diski asla kaybetmediğiniz sürece, hiçbir zaman veri kaybınız olmadığı sürece bir sonraki diskteki ditto bloklarını depolar. (ditto = 2 için üç iyi disk hatası).

Bir dosyaya erişmek için yeterli veri kopyası varsa (bu kopyalar ditto bloklarından, aynadan veya raidz'den olsun), dosyaya erişildiğinde tüm eksik veri kopyaları onarılır. Ovmanın amacı budur; tüm verileri okuyun ve gereksiz kopyaları kullanarak kötü olanları düzeltin. Bu nedenle OP sorusunu doğrudan cevaplamak için, arızalı sürücüyü değiştirdikten sonra bir ovma yapmanız yeterlidir ve tüm kopyalar geri yüklenir.

Her zaman olduğu gibi, destek deposu için vdev'ler sadece sıradan seyrek dosyalar olan havuzlar oluşturarak kavramları kolayca deneyebilirsiniz. Vdev dosyalarını silerek veya bozarak, her türlü arızayı simüle edebilir ve havuzun, dosya sistemlerinin ve verilerin yol boyunca bütünlüğünü doğrulayabilirsiniz.

DÜZENLEME: denemeden sonra, kopyalar = = 2 olan çok diskli yedekli olmayan bir havuzda bir disk başarısız olursa, zfs havuzda başarısız olacaktır. Bir veya daha fazla diskteki parsel veri bozulması hayatta kalabilmeli ve bir fırça ile düzeltilmelidir.


Bu tür deneylerin korkutucu yanı, bir kurulumun hemen veya en azından hızlı bir şekilde başarısız olacağını söylemek için harika olmaları. Bana bir kurulumun zaman zaman başarısız olacağını söylemek için harika değiller. Her durumda, arızalı bir havuzu nasıl geri getireceğiniz açık değildir; Üç seyrek dosya ile böyle bir havuz kurmaya çalıştım ve seyrek dosyalardan birini kaldırmak tüm havuz için ölümcül görünüyor. zpool replace, başarısız dosyanın yerini almaz, zpool bodur durakları% 5 (ve bunlar çok küçük havuzlardır) ve illumos.org/msg/ZFS-8000-5E'deki hata sayfası iyimser değildir.
James Moore

Deneyimlerime benzer bir sonuç aldım, ancak cevabımdan sonra yaptım. Normalde yalnızca raidz kullanıyorum ve güvenilir kaynaklar olduğuna inandığım bilgilerden (oracle bloglar) yanıt veriyordum. Artık kopyaları> 1 olan çok diskli bir JBOD türü havuzun bir disk arızasından kurtulabileceğine inanmıyorum.
Aaron B
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.