Soru İki sunucu arasında hızlı bir şekilde çok sayıda dosya nasıl kopyalanır


İki servis (Ubuntu) arasında çok büyük miktarda mp3 dosyası aktarmam gerekiyor. Büyük ölçüde ortalama 300K olan bir milyon dosya demek istiyorum. İle denedim scp ama bir hafta kadar sürerdi. (yaklaşık 500 KB / s) Tek bir dosyayı HTTP ile aktarırsam, 9-10 MB / s alırım, ancak hepsini nasıl aktaracağımı bilmiyorum.

Hepsini hızlı bir şekilde transfer etmenin bir yolu var mı?


81
2018-06-02 19:55


Menşei


Sunucular arasında ne tür bir ağ var. Her makinede 1 NIC arasında GB Ethernet geçişi kullandım. SCP kullanarak yapılan bu konfigürasyonda çok iyiyim - Jim Blizard
Scp'nin neden bu kadar yavaş olduğunu araştırmak isteyebilirsiniz. Şifrelemeden dolayı ftp gibi şeyler daha yavaş olabilir ama o kadar yavaş olmamalı. - Zoredache
Aralarında 100 mbps var. scp küçük dosyalarda daha yavaştır (çoğu küçüktür) - nicudotro


Cevaplar:


Katran öneriyorum. Dosya ağaçları zaten benzer olduğunda, rsync gerçekleştirir çok iyi. Ancak, rsync her dosyaya birden fazla analiz geçecek ve ardından değişiklikleri kopyalayacağından, ilk kopya için katrandan çok daha yavaştır. Bu komut muhtemelen ne istersen onu yapacak. Makineler arasında dosyaları kopyalayacak ve hem izinleri hem de kullanıcı / grup sahipliğini koruyacaktır.

tar -c /path/to/dir | ssh remote_server 'tar -xvf - -C /absolute/path/to/remotedir'

Mackintosh'un yorumuna göre bu, rsync için kullanacağınız komuttur.

rsync -avW -e ssh /path/to/dir/ remote_server:/path/to/remotedir

109
2018-06-02 20:04



+1 Hem skp hem de rsync'in ağdaki dosya başına daha fazla gidiş dönüşüne sahip olacağı için, katlama seçeneği çok sayıda küçük dosya için çok daha verimlidir. - Sekenre
rsync katrandan daha iyi çalıştı - nicudotro
Ayrıca, çok sayıda CPU'nuz varsa (her iki uçta), ancak (en azından) ana bilgisayarlar arasında yavaş bir bağlantı varsa, tar komutunda sıkıştırmayı (gzip veya bzip) etkinleştirmeye değer olabilir. - Vatine
@Jamie: Eğer ssh-agent kullanıyorsanız, o zaman kullanılmalıdır. Aksi halde, özel anahtarı nerede bulacağınızı belirtmek için '-i' seçeneğini kullanın. Detaylar için man sayfasına bakınız. - Scott Pack
@niXar ~ çıkış karakteri sadece SSH bir terminal kullanıyorsa etkindir. Bu, uzak bir komut belirttiğinizde geçerli değildir ( -t seçenek). Yani endişeniz geçersiz. - Gilles


Harici sabit disk ve aynı gün kurye teslimatı.


32
2018-06-02 20:00



Heh heh ... hiç ağ teknolojisi, 90 MPH yapan bantlarla dolu bir istasyon vagonunun bant genişliğini geçmiyor, değil mi? (snicker) Bir LAN üzerinde olduğunu varsaydım çünkü HTTP ile 9-10MB / sn aldığını söyledi. - Evan Anderson
İnternette bu tür bir hız elde ediyorum, ama yaşadığım yerde şanslıyım! Bir LAN üzerinde ise, daha ucuz hala! - Adam
Ahh-- konumunuza bakma. Evet-- Kore'deki internet bağlantısının oldukça etkileyici olduğunu duydum. ABD'de burada sıkışıp, net üzerinden 900KB / sn almak için mutluyum ... - Evan Anderson
Evet, ama bir download için beklerken lezzetli burrito alabilirsiniz ve Seul'de bile sadece yaklaşık üç yarım Meksika restoranı var. - Adam


Rsync kullanırdım.

Bunları, mevcut dizin listelemeleriyle HTTP üzerinden dışa aktardıysanız, wget ve --mirror argümanını da kullanabilirsiniz.

SCP'nin her şeyi şifrelediğinden (ve dolayısıyla CPU üzerinde darboğaz oluşturduğundan), HTTP'nin SCP'den daha hızlı olduğunu görüyorsunuz. HTTP ve rsync daha hızlı hareket edecek çünkü şifrelemiyorlar.

Ubuntu'da rsync kurulumu ile ilgili bazı dokümanlar: https://help.ubuntu.com/community/rsync

Bu dokümanlar, SSH üzerinden rsync'yi tünellemekle ilgili konuşuyor, ancak verileri özel bir LAN üzerinde taşıyorsanız SSH'ye ihtiyacınız yoktur. (Özel bir LAN üzerinde olduğunuzu farz ediyorum. İnternet üzerinden 9-10MB / sn alıyorsanız, ne tür bağlantılar olduğunu bilmek istiyorum!)

Göreceli güvensiz bir rsync sunucusu kurmanıza izin verecek diğer bazı çok temel belgeler şunlardır: (SSH'ye bağımlı değilsiniz): http://transamrit.net/docs/rsync/


16
2018-06-02 19:57



SCP, verileri şifrelemek için gerçekten biraz CPU kullanıyor olsa da,% 100 CPU kullanımı olduğunu düşünmüyorum, bu yüzden CPU bir darboğaz değildir. Hızlı transferler söz konusu olduğunda SCP'nin verimsiz olduğunu defalarca fark ettim. - Cristian Ciupitu
SCP için 300K ve HTTP için 9MB gördüğü göz önüne alındığında, SCP ile ilgili bir darboğazın (normalde CPU) devreye gireceğini varsaydım. Yine de kesinlikle başka bir şey olabilir. Söz konusu makinelerin donanım özelliklerini bildiğinin söylenmesi zor. - Evan Anderson
rsync hemen hemen taşıma için ssh kullanacak, bu varsayılan davranış olduğundan, scp'de şifrelenmenin neden olduğu herhangi bir ek yük de rsync'de mevcut olacaktır - Daniel Lawson
“Zaten SCP'nin her şeyi şifrelediği için HTTP'nin SCP'den daha hızlı olduğunu görüyorsunuz” → WRONG. 10 yaşındaki sunucuları olmadığı sürece, bu göreve bağlı CPU değildir. - niXar
@RamazanPOLAT - Çok uzun bir komut satırınız var. Dosya seçimini farklı şekilde belirtin ve sizin için iyi çalışır. Tipik olarak, kaynak dizini sonunda bir joker karakteriyle belirtebilirsiniz. Ayrıca kullanabilirsiniz --include ve --exclude daha nüanslı almak için argümanlar. - Evan Anderson


Fazla tartışma olmadan, netcat, ağ swissarmy bıçağını kullanın. Genelde protokol yok, doğrudan ağ soketine kopyalanıyorsunuz. Örnek

srv1$ tar cfv - *mp3 | nc -w1 remote.server.net 4321

srv2$ nc -l -p 4321 |tar xfv -

14
2018-06-02 20:17



Ne yazık ki, netcat'i farkettiğimden olmasa bile çok verimsiz. - Cristian Ciupitu
Seni reddediyorum çünkü bu gerçekten çok kötü bir tavsiye. Doğru bir cevap var: rsync. Neden daha iyi olsa da tüm nedenleri listeleyebilirdim, ancak bu minik yorum kutusunu bir yana bırakın, bu sayfaya sığmazdı. - niXar
@niXar: Tek yapmanız gereken tek bir dosya transferi (daha fazla senkronizasyona gerek yok) ise, o zaman tarpipe gerçekten ihtiyacınız olan şeydir. - Witiko
@niXar netcat, bunu özel vlan ve / veya VPN gibi güvenli bir ortamda yapıyorsanız iyi olur. - Lester Cheung


Rsync ile giderseniz çok dosya ile, Ben her iki ucunda sürüm 3 veya yukarıda almaya çalışın. Nedeni daha az olan bir versiyonun her dosyayı transfer işlemine başlamadan önce numaralandırmasıdır. Yeni özellik çağrıldı artımlı-özyineleme.

Yeni bir artımlı-yineleme algoritması   rsync konuşurken konuşuluyor         başka bir 3.x sürümü. Bu transfer daha hızlı başlıyor         (tüm dosyalar bulunmadan önce) ve daha az bellek gerektirir.         Bazı kısıtlamalar için manpage'deki --recursive seçeneğine bakın.


8
2018-06-02 20:41





rsync, diğerleri gibi zaten önerdi. Şifrelemeden gelen CPU yükü darboğazsa, blowfish gibi daha az CPU yoğun bir algoritma kullanın. Örneğin. gibi bir şey

rsync -ax -e 'ssh -c blowfish' /local/path user@host:/remote/path


7
2018-06-02 20:56



Şifreyi değiştirmeyle ilgili puan için +1 - Daniel Lawson
10G ethernet ve 10 yıllık bir CPU olmadıkça CPU bir darboğaz olmayacak. - niXar
sadece yorum: şifre "-c arcfour" daha hızlıdır. - Arman
@niXar: Fakat makinenizde zaten CPU tüketen bir göreviniz varsa, bu bir endişe kaynağıdır. - Isaac


Çok sayıda dosya kopyalarken, tar ve rsync gibi araçların, birçok dosyanın açılması ve kapatılmasından dolayı gerekenden daha verimsiz olduğunu buldum. Bu senaryolar için katrandan daha hızlı olan hızlı arşivleyici adlı açık kaynak kodlu bir araç yazdım: https://github.com/replicon/fast-archiver; Birden çok eşzamanlı dosya işlemlerini gerçekleştirerek daha hızlı çalışır.

İşte iki milyondan fazla dosyanın yedeklemesi için hızlı arşivleme ve tar katsayısı örneği; hızlı arşivleme arşivine 27 dakika, zifte 1 saat 23 dakika sürüyor.

$ time fast-archiver -c -o /dev/null /db/data
skipping symbolic link /db/data/pg_xlog
1008.92user 663.00system 27:38.27elapsed 100%CPU (0avgtext+0avgdata 24352maxresident)k
0inputs+0outputs (0major+1732minor)pagefaults 0swaps

$ time tar -cf - /db/data | cat > /dev/null
tar: Removing leading `/' from member names
tar: /db/data/base/16408/12445.2: file changed as we read it
tar: /db/data/base/16408/12464: file changed as we read it
32.68user 375.19system 1:23:23elapsed 8%CPU (0avgtext+0avgdata 81744maxresident)k
0inputs+0outputs (0major+5163minor)pagefaults 0swaps

Sunucular arasında dosya aktarmak için, ssh ile hızlı arşivleyiciyi kullanabilirsiniz.

ssh postgres@10.32.32.32 "cd /db; fast-archive -c data --exclude=data/\*.pid" | fast-archiver -x

4
2017-08-26 20:51





Dün 80 TB veriyi (milyonlarca küçük dosya) hareket ettirirken rsync için tar  çok daha hızlı olduğu kanıtlandı, denemeyi bıraktığımız gibi

# slow
rsync -av --progress /mnt/backups/section01/ /mnt/destination01/section01

ve değiştirildi tar yerine...

# fast
cd /mnt/backups/
tar -cf - section01 | tar -xf - -C /mnt/destination01/ 

Bu sunucular aynı LAN üzerindeyken, hedef, itme işlemini yapan kaynak sistemde NFS'ye monte edilir. Bunu daha hızlı yapmamak için, atime dosyaların

mount -o remount,noatime /mnt/backups
mount -o remount,noatime /mnt/destination01

Aşağıdaki grafik, rsync'ten katranın değişmesine kadar olan farkı göstermektedir. O benim patron adlı fikir ve benim çalışma arkadaşı her ikisi de onu idam etti ve harika yaptı onun blogunda yazmak. sadece beğeniyorum güzel resimler. :)

rsync_vs_tar


3
2018-04-04 10:32



Güvende olduğum bir bilgisayar korsanı bana "nfs yerine tc'den daha hızlı bile" diyebilir. diğer bir deyişle tar cf - directory | ttcp -t dest_machine itibaren ftp.arl.mil/mike/ttcp.html - Philip Durbin
İlgisiz soru, ama bu grafik nereden? - CyberJacob


Tarımı kullanıyorum netcat Ben de kullanmayı tercih etmektense socat - Durumunuz için optimize etmek için çok daha fazla güç - örneğin, mss'yi değiştirerek. (Ayrıca, eğer istersen gül ama buluyorum socat argümanlar hatırlamak daha kolay çünkü tutarlılar). Bu yüzden, son zamanlarda yeni sunuculara taşındığım için bu durum çok yaygın:

host1$ tar cvf - filespec | socat stdin tcp4:host2:portnum

host2$ socat tcp4-listen:portnum stdout | tar xvpf -

Takma adlar isteğe bağlıdır.


3
2018-06-03 06:38





Başka bir alternatif ahenk. Bu durumda Rsync'den biraz daha verimli olabilir ve bir dinleyici kurmak biraz daha kolay olabilir.


2
2018-06-02 20:00