Çok büyük klasör yapılarını senkronize etme


14

İntranetimizde yaklaşık 4.000 klasöre bölünmüş yaklaşık 800.000 dosya içeren bir klasör yapımız var. Bunu DMZ'lerimizdeki küçük bir makine kümesiyle senkronize etmemiz gerekiyor. Yapının derinliği çok sığdır (asla iki seviyeyi geçmez).

Dosyaların çoğu asla değişmez, her gün birkaç bin güncellenmiş dosya ve 1-2 bin yeni dosya vardır. Veriler, kaynak verilerin temizlendiği yerde tutulan geçmiş raporlama verileridir (yani bunlar, kaynak verilerin arşivlediğimiz ve sildiğimiz için yeterince eski olduğu kesinleşmiş raporlardır). Makul bir zaman dilimi içinde olabileceği göz önüne alındığında, günde bir kez senkronizasyon yeterlidir. Raporlar bir gecede oluşturulur ve sabah ilk iş zamanlanmış bir görev olarak senkronize edilir.

Açıkçası, bu kadar az dosya düzenli olarak değiştiğinden, artımlı kopyadan büyük ölçüde yararlanabiliriz. Rsync'i denedik, ancak bu "bina dosyası listesi" işlemini tamamlamak sekiz ila on iki saat kadar sürebilir . Rsync'in yapabildiklerini hızla büyüttüğümüz açıktır (12 saatlik zaman dilimi çok uzun).

Yapıları senkronize etmek için RepliWeb adlı başka bir araç kullanıyorduk ve yaklaşık 45 dakika içinde artımlı bir transfer yapabilir. Bununla birlikte, sınırını aştığımız görülüyor, dosyaların silinmediklerinde sildiğini görmeye başladı (belki de bazı dahili bellek yapısı tükendi, emin değiliz).

Bu türden büyük ölçekli bir senkronizasyon projesinde başka biri var mı? Senkronizasyon için böyle büyük dosya yapılarını işlemek üzere tasarlanmış bir şey var mı?


Çalışmayı aynı anda çalışan birkaç rsync örneği üzerinde bölmeyi denediniz mi? Dizin yapısının gerçekten iyi bir resmi yok ama dizin adı veya dosya adına göre bölebilirsiniz.
Debriyaj

Bunu düşünmüştük, ancak böyle düz bir yapıda, işi bölmek için iyi bölme çizgileri bulmak zor. Klasörlerin çoğunlukla benzer şekilde adlandırılmış olması nedeniyle karmaşıktır (klasörlerin çoğunun aynı ilk 6 karakter kümesiyle başlamasını sağlayan bir adlandırma kuralı vardır).
MightyE

Hiç iyi bir çözüm buldun mu Dave? Ben her biri 65 ^ 16 dosya olabilir 65535 alt dizinleri olan bir dir için lsyncd düşünüyorum .
Mike Diehn

1
@MikeDiehn Burada tamamen mutlu olduğum bir araç bulamadım. Dosyaları silmedikleri gibi gördükleri hatayı düzeltmek için tescilli RepliWeb aracını aldık, taşan bir iç yapıydı. O işi yıllar önce terk ettim, sanırım hala kullanıyorlar. Amaçlarınız için, dizinleriniz makul bir şekilde dağıtılmışsa, Ryan'ın çözümü gibi bir şeyle gidebilirsiniz. Üst düzey silme işlemlerini fark etmeyecek, ancak 65535 alt dizin bana muhtemelen bunlara sahip olmadığınızı gösteriyor.
MightyE

Yanıtlar:


9

Dosya sisteminin son değiştirilen zaman damgalarına güvenebiliyorsanız, Rsync'i UNIX / Linux 'find' yardımcı programıyla birleştirerek işleri hızlandırabilirsiniz. 'find', son gün içinde son değiştirilme zamanlarını gösteren tüm dosyaların bir listesini oluşturabilir ve YALNIZCA dosya / dizin listesini kısaltılmış olarak Rsync'e bağlayabilir. Bu, Rsync'in göndericideki her bir dosyanın meta verilerini uzak sunucu ile karşılaştırmasını sağlamaktan çok daha hızlıdır.

Kısacası, aşağıdaki komut SADECE son 24 saat içinde değişen dosya ve dizinler listesinde Rsync'i yürütür: (Rsync diğer dosyaları / dizinleri kontrol etmek için ZORLAYMAZ.)

find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.

'Bul' komutunu bilmiyorsanız, belirttiğiniz ölçütleri karşılayan dosyaları ve / veya dizinleri arayarak belirli bir dizin alt ağacı aracılığıyla geri çekilir. Örneğin, bu komut:

find . -name '\.svn' -type d -ctime -0 -print

geçerli dizinde (".") başlayacak ve tüm alt dizinleri arayacak ve şunları arayacaktır:

  • herhangi bir dizin ("-type d"),
  • ".svn" ("-name '.svn'") adlı,
  • meta veriler son 24 saat içinde değiştirildi ("-ctime -0").

Standart çıktıda bu ölçütlerle eşleşen her şeyin tam yol adını ("-print") yazdırır. '-Name', '-type' ve '-ctime' seçeneklerine "testler" ve '-print' seçeneğine "eylem" denir. 'Find' için kılavuz sayfasında testlerin ve eylemlerin tam bir listesi bulunur.

Gerçekten akıllı olmak istiyorsanız, bu işlemi hataya dayanıklı ve esnek hale getirmek için '-ctime' yerine 'find' komutunun '-cnewer' testini kullanabilirsiniz. '-cnewer', ağaçtaki her dosya / dizinin meta verilerinin bazı referans dosyalarından daha yakın zamanda değiştirilip değiştirilmediğini test eder. 'Bul' önce NEXT run'ın başvuru dosyasını her çalıştırma başında, 'bul ...' hemen oluşturmak için 'touch' kullanın. rsync ... 'komutu yürütülür. İşte temel uygulama:

#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file

Bu komut dosyası son çalıştırmanın ne zaman yapıldığını otomatik olarak bilir ve yalnızca son çalıştırmadan bu yana değiştirilen dosyaları aktarır. Bu daha karmaşık olsa da, çalışmama süresini veya başka bir hata nedeniyle işi 24 saatten fazla kaçırmış olabileceğiniz durumlara karşı sizi korur.


Bu son derece akıllı bir çözüm! touch $next_ref_fileSonunda ne demek istediğini düşünüyorum ? Ancak silinmiş yollarla başa çıkma kabiliyeti olmadan bizi terk eder (bu statik arşiv raporları bile sonunda arşivlenecek ve silinecek kadar yaşlanır). Bu bir gösteri tıpa olmayabilir.
MightyE

Ben bile sadece find . -ctime 0bu dizin yapısı (hala zamanını raporlamak için tamamlamak için bekliyor) bu oldukça yavaş olsa buluyorum . Bu aslında beni biraz disheartens çünkü bu muhtemelen bu işi tamamlamak için bekleyebilirsiniz en hızlı bar ayarlar oldukça düşük seviyeli bir operasyon olabilir gibi görünüyor. Disk G / Ç'nin buradaki sınırlayıcı faktör olması söz konusu olabilir.
MightyE

Bu senaryoya gelince, evet, bir hata yaptım. 'Bul' çalıştırmadan hemen önce 'touch' çalıştırmak 'next_ref_file' ('curr_ref_file' değil) demek ... | rsync ... 'komutu. (Cevabımı düzeltirim.)
Ryan B. Lynch

3
Yavaş 'find' komutuna gelince: Ne tür bir dosya sistemi kullanıyorsunuz? Ext3 kullanıyorsanız, iki FS ayarını göz önünde bulundurmak isteyebilirsiniz: 1) Ext3'ün 'dir_index' özelliğini etkinleştirmek ve büyük dosya sayılarına sahip dirslere erişimi hızlandırmak için 'tune2fs -O dir_index <DEVICE_NODE>' komutunu çalıştırın. 2) Genellikle okuma işlemini hızlandıran erişim zamanı güncellemelerini kapatmak için 'mount -o remount, noatime, nodiratime' komutunu çalıştırın. 'dumpe2fs -h <DEVICE_NODE> | grep dir_index 'size' dir_index 'öğesinin zaten etkin olup olmadığını söyler (bazı dağıtımlarda bu varsayılan değerdir) ve' mount | grep <DEVICE_NODE> 'size erişim süresi güncellemelerini anlatır.
Ryan B. Lynch

Ne yazık ki NTFS - find komutu için Cygwin kullanan Windows 2003 Server. Debian kümelerimizden birinde benzer bir şeyle karşılaşmamız durumunda ext3 için bu ayarlama seçeneklerini (mükemmel tavsiye) hatırlayacağım.
MightyE

7

Unison'u deneyin , değişiklik listelerini (bina listesi listesi), her sunucuya yerel olarak tutarak, delta hesaplamak için zamanı hızlandırarak ve daha sonra kablo üzerinden gönderilen miktarı azaltarak bu sorunu çözmek için özel olarak tasarlanmıştır.


Unison'u deniyorum. Yaklaşık 2 saattir "Değişiklikler aranıyor" aşamasında çalışmakta ve şu anda üzerinde çalıştığı dosyalara dayanarak, yaklaşık yarıya kadar yapılmış gibi görünüyor (yani, aktarım başlamadan önce toplam 4 saat). Rsync'den daha iyi olacak gibi görünüyor, ancak yine de istenen operasyonel penceremizin dışında.
MightyE

2
Her iki tarafta ilk kez bir dizin oluşturduğunuzda, yeniden oluşturma süreleri her bir dosyayı karma yapmak zorunda olduğu için rsync'e benzer. Bu yapıldıktan sonra, unison bir dosyanın ne zaman değiştiğini belirlemek için dizinin son değiştirilme zamanını kullanır ve sadece o dosyayı değişiklikler için taramak zorundadır.
Dave Cheney

Ne yazık ki, katalog oluşturulmadan önce oturumumu zorla sona erdiren gayretli bir Operasyon yöneticisinin kurbanıydım (eşzamanlı oturumların sayısını üretim sunucularıyla sınırlandırıyoruz). İlk kataloğu oluştururken kaydettiği ilerlemeyi kaybettim, bu yüzden baştan başlamak zorundayım. Nasıl olduğunu size bildireceğim.
MightyE

İlk kataloğun değişiklikleri taramak için oluşturulması yaklaşık 2 saat sürüyor. Bunun için ne kadar RAM Unison kullandığına çok şaşırdım. Dosya koleksiyonumuz için kaynak sunucu 635M kullanıyor ve uzak istemci 366M kullanıyor. Bir kümedeki birkaç makineyi senkronize etmek, özellikle kaynak sunucu için oldukça ağır bir ayak izi olacaktır!
MightyE

1
Verilerinizi, son zamanlarda değişen verileri tanımlamayı kolaylaştıracak şekilde yapılandırabiliyor musunuz? Yani, yıl / ay / gün / ... formatında mı saklıyorsunuz?
Dave Cheney


2

Rsync'de -z anahtarını kullanıyorsanız, onsuz çalıştırmayı deneyin. Bazı nedenlerden dolayı, dosyaların ilk numaralandırılmasını bile hızlandırdığını gördüm.


-Z bayrağıyla ve -z olmadan denedik. "Bina dosyası listesi" yürütme süresi üzerinde bir etkisi var gibi görünmüyordu.
MightyE

2

Sıkıştırma olmayan rsync komutunun -z komutunun çıkarılması, "alıcı dosya listesi" nin çok daha hızlı gitmesini sağladı ve yaklaşık 500 GB aktarmamız gerekiyordu. -Z anahtarı ile bir gün sürmeden önce.

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.