Dosya sağlama toplamlarını nasıl verimli bir şekilde oluşturur ve doğrularım?


12

Genellikle karmaşık bir dizin hiyerarşisinde yuvalanmış büyük ölçekli dosya koleksiyonları için sağlama toplamlarını yakalayıp doğrulamak istiyorum.

Her dosyanın bir sağlama toplamına ihtiyacı var mı? Varolan dizin yapısını, örneğin dosya ağacındaki yalnızca bir düğümü doğrulamak ve içindeki her dosyayı zorunlu kılmak için kullanmanın yolları var mı?


Yanıtların belirttiği gibi, azalttığınız tehdit türlerini ve sağlama toplamını buna göre ayırt etmek önemlidir. Katıldığım önceki bir Kütüphane ve Bilgi Bilimi Yığın Taşması yanıtı , çoğunlukla HDFS ile ilgili olsa da ilgi çekici olabilir.
Andy Jackson

Yanıtlar:


13

Sağlama toplamlarını kullanmanın en etkili yolu, bilgisayarın her şeyi yapmasını sağlamaktır. Yazıldığında tüm verileri sağlama toplamı (aslında sağlama toplamından daha güçlü olan karma değerleri kullanır) ZFS gibi bir dosya sistemi kullanın ve veriler her okunduğunda bunları doğrular. Tabii ki, dezavantajı, ZFS'nin bir dosyayı silerken veya üzerine yazarken bir hata olduğunu ve normal bir işlem olduğunu bilmemesi, ancak ZFS her şey için yazma üzerine kopya semantiği kullandığından, riski azaltmak için anlık görüntü özelliğini kullanabilirsiniz. .

ZFS, raid5 tarzı eşlik, sürücü aynaları veya kopya kopyalar gibi ayarladığınız herhangi bir artıklığı kullanarak karma denetimini geçemeyen verileri otomatik olarak geri yükleyebilir (kopyaları = N özelliğini herhangi bir ZFS dosya sistemine ekleyin ve N kopyasını depolar) yazın). Ayrıca, karmaları bir Merkle ağacında saklar; burada bir dosyanın karma değeri blokların karma değerlerine bağlıdır, bir dizin girişinin karma değeri içerdiği dosyaların ve dizinlerin karma değerlerine bağlıdır, bir dosya sisteminin karma değerine bağlıdır kök dizinin karması vb.

Hangi çözümle karşılaşırsanız karşılaşın, sürecin CPU'nuzun hızıyla değil, disklerinizin hızıyla sınırlı olduğunu göreceksiniz.

Ayrıca, disklerinizin BER'sini de dikkate almayı unutmayın. Sonuçta, sadece dönen pas plakalarıdır. Tüketici seviyesindeki bir sürücüde, okunan her 10 ^ 14 bit için 1 yanlış okunan bit hatası vardır; bu, okuduğunuz her 11 terabaytın 1 bitine kadar çalışır. 11 terabaytlık bir veri kümeniz varsa ve içindeki her dosyanın karmasını hesaplarsanız, bu sağlama toplamlarından birini yanlış ve kalıcı olarak veri kümesindeki dosyalardan birinin bir bloğuna zarar vermiş olacaksınız. Ancak ZFS, havuzunuzdaki her diske yazdığı her bloğun karmasını bilir ve bu nedenle hangi bloğun kaybedildiğini bilir. Daha sonra, o bloktaki verileri doğru değerlerle yeniden yazmak için havuzunuzdaki artıklığı (eşlik, aynalar veya ekstra kopyalar) kullanabilir.

Ancak yorumlarda iyi bir noktaya değiniyor. ZFS, hesapladığı karma değerlerin hiçbirini kullanıcıya göstermez, bu nedenle bir ZFS sistemine giren veya çıkan verilere karma eşlik etmelidir. İnternet Arşivinin bunu arşivdeki her öğeye eşlik eden bir xml dosyası ile yapmasını seviyorum. Örnek olarak https://ia801605.us.archive.org/13/items/fakebook_the-firehouse-jazz-band-fake-book/fakebook_the-firehouse-jazz-band-fake-book_files.xml adresine bakın .


1
Beni dövüyorsun. Ayrıca karma tabanlı bir sistem önerecektim. Her dosya Hash, bir dizin karma vb dosya karma (+ sub dir karma) karma .. Ticaret kapalı CPU / IO vs hata olasılığıdır. Checksum / CRC ucuzdur ancak hata olasılığı ölçekle birlikte artmaktadır. Ortak karmaları da yapın, ancak çok daha düşük bir hata olasılığı ile başlarlar.
Diamond Z

3
ZFS gibi bir dosya sistemi çalıştırsanız bile (Btrfs de benzer işlevselliğe sahiptir, ancak yine de ağır geliştirme aşamasındadır ve şu anda üretim kullanımına hazır kabul edilmemektedir), verilerin olduğundan emin olmak için periyodik bir "fırçalama" işlemi yapmanız gerekecektir. sağlama toplamlarını veya sağlama değerlerini okuyup doğrulayın. Sadece toplamlarını hesaplama ve gelene kadar sonra onlarla hiçbir şey yapmadan ihtiyaç verilere erişim değersiz daha potansiyel olarak kötüdür.
CVn

1
Evet, bu iyi bir nokta. Son fırçalama, kötüleşen 2 kilobaytlık veriyi düzeltti. Bu beş blok üzerine dağılmış dört blok! Belirli bir veri parçasının okumaları arasında ne kadar uzun süre giderseniz, tek bir dosyada onu kurtaramayacak kadar hata biriktirme olasılığı o kadar yüksek olur.

1
Ev bilgisayarımda yaklaşık 150 GB veri üzerinde bir md5sum kullanıcı alanı çalıştırmak, yaklaşık 40 dakika duvar saati sürdü, tamamen G / Ç bağlı. 100 kata kadar ölçeklendirerek , tüketici donanımında üç gün altında bir gölgede 15 TB kontrol edilmesini sağlıyoruz . Büyük bir arşivde bile uygun şekilde seçilmiş bir aralıkla yapılabileceğini kesinlikle düşünürdüm.
bir CVn

3
ZFS bloklar için sağlama toplamlarını hesaplar, dosyalar veya bit akışları için değil, değil mi? ZFS, hesaplama problemini çözerken, daha az insan tarafından denetlenebilir ve dosya sisteminden bağımsız olarak taşınabilir sabitlik verileri üretmiyor gibi görünüyor - arşivler için bir zorunluluktur.

6

Her dosya için sağlama toplamı oluştururdum. Sağlama toplamları çok küçüktür ve tüm dizin için sağlama toplamı oluşturmak, her dosyayı da işlemenizi gerektirir (en azından yalnızca dizin girişlerinden yapılan dizin sağlama toplamından bahsetmiyorsanız - Veri sağlamak için bunları da yaparım silindi).

Tüm arşiv için bir sağlama toplamınız olduğunu varsayın. Verilerin bozuk olduğunu biliyorsunuz, ancak bunun tek bir dosya olup olmadığını ve daha önemlisi hangisinin olduğunu bilmiyorsunuz. Ayrı sağlama toplamlarına sahip olmak size daha fazla esneklik sağlar. Bozuk tek bir dosyayı algılayabilir ve dosyayı diğer yedeklemeden değiştirebilirsiniz (bu da başka bir dosyanın bozulmasına neden olabilir).

Bu şekilde verilerinizin hayatta kalma olasılığı daha yüksektir.


Bu kesinlikle mantıklı. Sadece yüz binlerce sağlama toplamı oluşturmanın ve kontrol etmenin hesaplı olarak pahalı başarısını ele almak için hangi stratejilerin mevcut olduğunu merak ediyorum.

4

Belki de BagIt'i getirmek için iyi bir zaman . Bu, dijital nesnelerin arşivlenmesi, uzun süreli korunması ve aktarımı için tasarlanmış çok basit ama güçlü bir dosya paketleme biçimidir. Kullanıcılar arasında Kongre Kütüphanesi ve California Dijital Kütüphanesi bulunmaktadır.

Bir BagIt aracı (çeşitli programlama dillerinde bulunur) dosyalarınızı belirli bir dizin yapısına koyar ve sizin için sağlama toplamı / karma yapar. Hepsi bu.

PS: Tabii ki, BagIt araçları da dahil edilen sağlama toplamları / sağlamalarına karşı çantaları doğrulayabilir ve torbalara bazı meta veriler ekleyebilirsiniz. Ama bu çantalar kadar karmaşık.


1

Bu cevap, @ lechlukasz ve @ db48x'in yanı sıra yorumlarda yapılan bazı noktaların yanı sıra kendi düşüncelerimin bir birleşimidir .

İleriye giden basit yol, birleştirilmiş bir dosya sistemi ve ayrı meta veri yaklaşımıdır.

ZFS veya Btrfs gibi anında veri karma ve doğrulama yapan bir dosya sistemi kullanarak (büyük ilerlemeler kaydedilmiş olsa da, Btrfs şu anda üretim için hazır sayılmaz), makul olabilirsiniz veriler işletim sistemi hatası olmadan diskten okunabiliyorsa, okunan verilerin diske dosya sistemi tarafından belirtilen şekilde yazıldığından emin olun. Periyodik "fırçalama" işlemlerini gerçekleştirerek, tüm veriler dosya sisteminin ne olması gerektiği fikrine karşı okunur ve doğrulanır.

Ancak, bu yalnızca diskteki bozulmaya karşı koruma sağlar (okunamayan bloklar, açık donanım yazma hataları, verilerin parçalarını doğrudan blok aygıtında bozan geçersiz yazma işlemleri vb.). Dosyalarda çalışmak için amaçlanan işletim sistemi olanakları aracılığıyla çalışan bir yazılım hatasına, yanlış kullanıcı işlemine veya kötü amaçlı yazılımlara karşı koruma sağlamaz, bu tesislerde bu tür hatalar olmadığı varsayılır.

İkincisine karşı korumak için başka bir koruma katmanına ihtiyacınız var. Kullanıcı uygulamasının perspektifinden veri sağlama veya sağlama, yukarıda belirtilen risklerin çoğuna karşı korunmaya yardımcı olur, ancak ayrı olarak gerçekleştirilmesi gerekir (yazılımda yerleşik bir işlem eylemi olarak veya tamamen ayrı bir işlem olarak).

Bugünün donanımı ve büyük miktarlarda veri depolamak için pratik olanlarla (katı hal diskleri / SSD'lerin aksine döner tabla sabit diskleri), SHA1 gibi karmaşık karma algoritmalar bile büyük ölçüde G / Ç'ye bağlı olacaktır - yani, hız verinin karma olduğu bilgisayar işlemcisinin karma değerini hesaplama becerisi yerine depolama sisteminin okuma hızının bir fonksiyonu olacaktır. 2012 yılında orta seviye bir tüketici bilgisayarı hakkında yaklaşık 150 GB veri üzerinde bir kullanıcı alanı MD5 karma işlemi yürütme denemesi yaptım ve diski yaklaşık 40 dakika boyunca kesintisiz olarak kullandıktan sonra bitti. Bu rakamları 100 katına kadar ölçeklendirdiğinizde, aynı donanımda yaklaşık üç gün içinde 15 TB'lik bir koleksiyonun MD5 karmasını elde edersiniz. Okuma aktarım hızı ekleyerek (kolayca gerçekleştirilebilir örn.Örneğin RAID 0 , RAID 10'u oluşturan RAID 1 ile kombinasyon halinde daha yüksek okuma / yazma performansı elde etmek için yaygın olarak kullanılan artıklık olmadan şeritlemedir ), tamamlanma süresi aynı miktarda veri için azaltılabilir.

İkisini birleştirerek, her iki dünyanın da en iyisini elde edersiniz: dosya sistemi, dosyayı okurken aldığınız şeyin gerçekten yazılan şey olduğuna dair güvence verir ve verilerin tümünün üzerinde ayrı bir sabitlik kontrol işlemi gerçekleştirilebilir. saklananlar hala arşivde yutulanlarla eşleşir. İkisi arasındaki herhangi bir tutarsızlık (dosya sistemi dosyanın iyi olduğunu söyler, sabitlik kontrolü bunun olmadığını söyler), arşivin amaçlanan çalışma modunun dışında, ancak işletim sisteminin tesislerinde değiştirilerek ikincil bir dosyadan geri yükleme isteğinde bulunan bir dosyayı gösterir. kopya (yedek). Bu nedenle, sabitlik kontrolü daha uzun bir zaman aralığında çalışabilir, bu da çok büyük arşivler için gerekli hale gelir, ancak okumaların başarılı olması durumunda herhangi bir çevrimiçi erişimin donanımda bozulmayacağı garanti edilir. Prensip olarak, arşiv yazılımı, tutarsızlıkları okuma hataları olarak bildirmek için dosya sistemine güvenebilir ve kullanıcı dosyayla çalışırken ve dosyanın yutulanla eşleşmediğini belirten uygun bir ileti görüntülediğinden arka planda ayrı bir sabitleme denetimi gerçekleştirebilir arşivin içine. Bir blok karma dosya sistemi kullanmak, böyle bir şemanın algılanan performans üzerinde minimum etkisi olurken, içeriğin doğru olduğundan emin olabilirsiniz.


1

Yanıtları gözden geçirdim ve veri katmanı hatalarını işlemek için ZFS'ye güvenme fikrini sevmeme rağmen, dosyaların yanlışlıkla veya kötü amaçlı olarak değiştirilmesi sorunu hala var. Bu durumda ZFS sizi korumaz ve bahsi geçen başka biri gibi, harici doğrulama için başka bir yerde saklamanız için kullanıcı tarafından görüntülenebilir bir "karma" vermez.

Saldırıdan sonra değiştirilmediğini doğrulamak için sistem yürütülebilirlerini izlemek için yaygın olarak kullanılan TripWire adlı bir Linux uygulaması var. Görünüşe göre bu proje terk edildi, ancak AIDE (Advanced Intrusion Detection Environment)ServerFault üzerinde önerilen yeni bir proje var :

/server/62539/tripwire-and-alternatives

Yüklediğinizde, kullanıcı tarafından yapılandırılabilen her x dakikada bir çalışır ve dosyalarda değişiklik olup olmadığını belirttiğiniz tüm klasörleri kontrol eder. Tüm dosya karmaları hesaplamak için bir kez çalıştırılması gerekir ve bundan sonra, tüm karmaları geçerli dosyaya göre kontrol eder ve hala aynı olduklarından emin olur. Hangi tür karma veya karma kombinasyonunu kullanacağınızı (SHA-256'dan daha zayıf bir şey önermem), hangi dosya özniteliklerinin (içerik, boyut, değiştirilmiş zaman damgası vb.), Kontrol sıklığını, karma veritabanının nasıl / nerede saklanacağı vb.

Bazıları bu aşırıya kaçmayı düşünebilir, ancak OP'nin gereksinimlerine bağlı olarak, sakladığı verilerin belirli bir süre sonra aynı kalacağı konusunda daha rahat olabilir.


0

Avustralya Ulusal Arşivleri, GPLv3 altında ücretsiz olarak sunulan [Checksum Checker] ( http://checksumchecker.sourceforge.net/ ) geliştirdi .

Veritabanından bir sağlama toplamı ve algoritma okur, ardından dosyanın sağlama toplamını yeniden hesaplar, iki değeri karşılaştırır ve bir hata olup olmadığını bildirir. MD5, SHA1, SHA2, SHA256 ve SHA512 algoritmalarını destekler.

Dijital havuzlarındaki diğer yazılımlar [DPR] ( http://dpr.sourceforge.net/ ) ilk sağlama toplamını oluşturur (diğer tüm işleme faaliyetlerini gerçekleştirir)

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.