Cara terbaik untuk menyalin jutaan file antara 2 server

39

Saya memiliki sekitar 5 juta file kecil (5-30k) dalam satu direktori yang ingin saya salin ke komputer lain di jaringan gigabit yang sama. Saya mencoba menggunakan rsync, tetapi akan memperlambat hingga merangkak setelah beberapa jam berjalan, saya berasumsi karena rsync harus memeriksa file sumber & tujuan setiap kali?

Pikiran kedua saya adalah menggunakan scp, tetapi ingin mendapatkan pendapat dari luar untuk melihat apakah ada cara yang lebih baik. Terima kasih!

noaheverett
sumber
Hambatannya mungkin adalah filesystem di sisi penerima. Sebagian besar sistem file akan berakhir secara eksponensial lebih lambat dari lebih banyak file yang Anda masukkan ke dalam satu direktori (yaitu, setiap kali rsync menambahkan file baru di sisi penerima, sisi penerima memperlambat bagian yang tersisa dari transfer). Banyak filesystem lama bahkan tidak dapat memuat lebih dari 32 ribu file dalam satu direktori.
Mikko Rantalainen

Jawaban:

41

Sesuatu seperti ini seharusnya bekerja dengan baik:

tar c some/dir | gzip - |  ssh host2 tar xz

Mungkin juga hilangkan gzip dan bendera "z" untuk ekstraksi, karena Anda berada di jaringan gigabit.

sth
sumber
Apakah perlu untuk gzip, atau apakah ssh memampatkan aliran? Atau dapatkah dibuat untuk melakukannya?
Thilo
1
ssh akan memampatkan aliran jika Anda melewatkan "-C". Lebih dari satu lan aku tidak akan repot-repot menekan aliran sungai; melalui Internet saya mungkin akan, kecuali sudah dikompresi.
6
Secara pribadi saya akan meninggalkan gzip: bahkan lebih dari gigabit ethernet, bottlenecknya sangat kecil kemungkinannya adalah CPU.
Benji XVI
6
@ BenjiXVI bottleneck pasti akan menjadi CPU karena gziphanya akan pernah dijalankan pada satu inti. Anda dapat memperkirakan sekitar 30 MB / s dengan tingkat kompresi default 6 - tetapi ini tidak akan memaksimalkan Gigabit Ethernet.
syneticon-dj
2
gunakan pbzip2? ...
Apache
19

Saya yakin fakta bahwa Anda memiliki semua LIMA JUTAAN file dalam satu direktori akan membuang banyak alat ke dalam kegelisahan. Saya tidak terkejut bahwa rsync tidak menangani ini dengan anggun - ini situasi yang "unik". Jika Anda bisa mencari cara untuk menyusun file menjadi semacam struktur direktori, saya yakin alat sinkronisasi standar seperti rsync akan jauh lebih responsif.

Namun, hanya untuk memberikan saran aktual - mungkin salah satu solusinya adalah memindahkan drive secara fisik ke mesin tujuan sementara sehingga Anda dapat melakukan salinan file di server yang sebenarnya (bukan melalui jaringan). Kemudian, gerakkan drive kembali dan gunakan rsync untuk menjaga keadaan.

Marc Novakowski
sumber
6
1 untuk memindahkan drive yang secara fisik, itu cara yang lebih cepat dengan cara ini
Robert Gould
1
Tentu beats menyalin segala sesuatu pada drive melompat dan akan bolak-balik ...
VirtuosiMedia
@RobertGould Mari kita gunakan IPoAC sebagai protokol transmisi kami: "D
coolcat007
12

Untuk menyalin jutaan file melalui sakelar gigabit (di lingkungan tepercaya) Anda juga dapat menggunakan kombinasi netcat (or nc)dan tar, seperti yang telah disarankan oleh user55286. Ini akan mengalirkan semua file sebagai satu file besar (lihat Fast File Copy - Linux! (39 GBs) ).

# requires netcat on both servers
nc -l -p 2342 | tar -C /target/dir -xzf -   # destination box
tar -cz /source/dir | nc Target_Box 2342    # source box
vron
sumber
Hari-hari ini dengan semakin banyak hal yang mencoba IPv6 pertama Anda mungkin perlu juga menggunakan -4 switch dengan perintah nc Anda di kedua ujungnya untuk membuatnya bekerja pada LAN IPv4 "lama".
BeowulfNode42
5

Kami memiliki sekitar 1 juta file dalam suatu direktori (nilai file sekitar 4 tahun).

Dan kami menggunakan robocopy untuk memindahkan file ke direktori YYYY / MM (sekitar 35-45.000 file per bulan) .. kami menempatkan skrip robocopy dalam file .bat seperti ini:

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081201 /MINAGE:20090101 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\12
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090101 /MINAGE:20090201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\01
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090201 /MINAGE:20090301 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\02

catatan singkat .. /ns /nc /nfl /npadalah untuk menghindari kembung file log dengan info tambahan /log+...untuk menulis informasi ringkasan ke file log.

/minage and /maxage is to copy files modified with in that date range. 

jadi misalnya file diubah> = 01 / Nov / 2008 (inklusif) ke file yang dimodifikasi <01 / Des / 2008 (tidak inklusif)

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11

/mov untuk memindahkan file

kemudian muncul direktori sumber

kemudian datang direktori tujuan (direktori akan dibuat dengan cepat saat dan ketika diperlukan).

Butuh waktu sekitar 40 - 60 menit untuk transfer 1 bulan (sekitar 35-45.000 file). Menurut kami, dibutuhkan sekitar 12 jam atau kurang untuk transfer 1 tahun.

Menggunakan Windows Server 2003.

Semua barang dicatat dalam file log ... Mulai Waktu, Waktu Berakhir dan Jumlah file Disalin.

Robocopy menyelamatkan hari itu.

ihightower
sumber
robocopy hari ini memiliki switch / MT [: n] untuk Do copy multi-threaded dengan n thread (default 8) untuk mencapai efek yang sama hanya lebih baik dan tidak bergantung pada rentang tanggal, dan memungkinkan untuk satu baris perintah, bukan satu per utas. Meskipun saklar MT tidak tersedia pada Windows 2003.
BeowulfNode42
4

Anda tahu, saya plus-1 solusi tar, tetapi - tergantung pada lingkungan - ada satu ide lain yang terjadi. Anda mungkin berpikir tentang menggunakan dd (1) . Masalah kecepatan dengan sesuatu seperti ini adalah dibutuhkan banyak gerakan kepala untuk membuka dan menutup file, yang akan Anda lakukan lima juta kali. Di Anda dapat memastikan bahwa ini ditugaskan secara bersamaan, Anda bisa melakukannya, yang akan memotong jumlah gerakan kepala dengan faktor 5 atau lebih.

Charlie Martin
sumber
4

Saya lebih suka menggunakan lz4 sebagai alat kompresi tercepat saat ini. Opsi SSH -c arcfour128 menggunakan algoritma enkripsi yang lebih cepat dari standar. [1]

Jadi transfer direktori terlihat seperti:

tar -c folder | lz4 -c | ssh -carcfour128 somehost 'lz4 -d | tar -x > folder'

Harap dicatat bahwa pada perintah Debian lz4 adalah lz4c dan pada CentOS adalah lz4.

insider
sumber
Enkripsi / dekripsi ssh dapat menjadi hambatan karena penggunaan cpu pada cpu sumber atau tujuan dan sifat ulir tunggal dari hampir semua implementasi ssh. Ini adalah LAN gigabit pribadi, jadi tidak perlu mengenkripsi.
BeowulfNode42
3

Robocopy sangat bagus untuk hal-hal seperti ini. Ini akan mencoba lagi setelah waktu jaringan habis dan itu juga memungkinkan Anda mengatur penundaan celah antar paket untuk sekarang membanjiri pipa.

[Sunting]

Perhatikan bahwa ini adalah aplikasi khusus Windows.

Scott Muc
sumber
Dengan asumsi Anda ada di windows tentu saja. Yang menyenangkan tentang robocopy adalah aplikasi ini bertanggung jawab untuk pengulangan file, Masalah dengan unix utils adalah Anda mungkin kehabisan ruang shell untuk memperluas nama.
Martin Beckett
3

Saya tahu ini mungkin bodoh - tetapi apakah Anda berpikir untuk menyalinnya ke disk eksternal dan membawanya ke server lain? Ini sebenarnya mungkin solusi yang paling efisien dan sederhana.

Elia
sumber
3

Kami sedang menyelidiki masalah ini saat ini. Kita perlu mentransfer sekitar 18 juta file kecil - total sekitar 200GB. Kami mencapai kinerja terbaik menggunakan XCopy tua biasa, tetapi masih membutuhkan waktu yang lama. Sekitar 3 Hari dari 1 server ke yang lain, sekitar 2 Minggu ke drive eksternal!

Melalui proses lain, kami perlu menduplikasi server. Ini dilakukan dengan Acronis. Butuh sekitar 3 jam !!!

Kami akan menyelidiki ini lagi. Saran dd di atas mungkin akan memberikan hasil yang serupa.

Ruz
sumber
2

Sudah banyak saran bagus, tapi ingin dilempar ke Beyond Compare . Saya baru-baru ini mentransfer sekitar 750.000 file antara 5KB dan 20MB dari satu server ke server lain melalui switch gigabit. Itu bahkan tidak cegukan sama sekali. Memang butuh beberapa saat, tapi saya harapkan dengan begitu banyak data.

David Thomas Garcia
sumber
1

Saya akan melihat bagaimana kinerja zip-> copy-> unzip

atau apa pun sistem kompresi / arsip favorit Anda.

Keith Nicholas
sumber
ya mengompresi mereka ke dalam satu file akan menjadi ide yang baik juga
Robert Gould
bahkan hanya tarball
Joel Coehoorn
1

Masukkan mereka ke dalam satu file sebelum Anda menyalinnya, lalu bongkar lagi setelah disalin.

ChrisW
sumber
1

Dalam situasi yang sama, saya mencoba menggunakan tar untuk mengumpulkan file. Saya menulis sebuah skrip kecil untuk menyalurkan output dari perintah tar menyeberang ke mesin target langsung ke proses tar penerima yang unbundled file.

Pendekatan tar hampir dua kali lipat tingkat transfer dibandingkan dengan scp atau rsync (YMMV).

Berikut adalah perintah tar. Perhatikan bahwa Anda harus mengaktifkan r-perintah dengan membuat file .rhosts di direktori home masing-masing mesin (hapus ini setelah mereka menyalin selesai - mereka terkenal masalah keamanan). Perhatikan juga bahwa, seperti biasa, HP-UX canggung - sedangkan bagian dunia lainnya menggunakan 'rsh' untuk perintah shell-jauh, HP-UX menggunakan 'remsh'. 'rsh' adalah sejenis shell terbatas dalam bahasa HP.

box1> cd source_directory; tar cf - . | remsh box2 "cd target_directory; tar xf - "

Perintah tar pertama membuat file yang disebut '-', yang merupakan token khusus yang berarti 'output standar' dalam kasus ini. Arsip yang dibuat berisi semua file di direktori saat ini (.) Ditambah semua subdirektori (tar bersifat rekursif secara default). File arsip ini disalurkan ke perintah remsh yang mengirimkannya ke mesin box2. Pada kotak 2 saya pertama-tama mengubah ke direktori penerima yang tepat, kemudian saya mengekstrak dari '-', atau 'input standar' file yang masuk.

Saya memiliki 6 perintah tar ini yang berjalan secara bersamaan untuk memastikan tautan jaringan dipenuhi dengan data, meskipun saya menduga bahwa akses disk mungkin menjadi faktor pembatas.

dr-jan
sumber
1

Lewati sistem file.

Apakah Anda dapat meng-unmount partisi ini sehingga file-file itu hidup, atau me-mountnya hanya baca? Lakukan itu, lalu sesuatu seperti:

dd if=/dev/PARTITION | ssh username@host "dd of=diskimage.bin"

Anda kemudian dapat memasang diskimage.binsebagai perangkat loopback di sisi tujuan, dan menyalin file dari itu ke sistem file tujuan Anda yang sebenarnya, atau mungkin menggunakan alat yang tepat untuk menjahitnya kembali ke partisi kosong di sisi tujuan (berbahaya, tetapi mungkin mungkin , meskipun saya belum pernah melakukannya.)

Jika Anda benar-benar berani, Anda bisa ddlangsung kembali ke partisi di sisi tujuan. Saya tidak merekomendasikan itu.

LawrenceC
sumber
0

Anda dapat mencoba yang berikut ini (mungkin dalam batch file)

  • tar batch file
  • gzip mereka
  • salin menggunakan scp jika memungkinkan
  • gunzip
  • untar file
kal
sumber
0

Seperti yang disarankan oleh sth Anda dapat mencoba tar di atas ssh.

Jika Anda tidak memerlukan enkripsi (awalnya Anda menggunakan rsync, tetapi tidak menyebutkan itu rsync + ssh), Anda dapat mencoba tar di netcat untuk menghindari overhead ssh.

Tentu saja Anda juga dapat mempersingkat waktu yang dibutuhkan dengan menggunakan gzip atau metode kompresi lainnya.

user55286
sumber
0

Ada hal lain yang perlu dipertimbangkan. Coba ini:

  • Buat VHD, berukuran dinamis
  • Pasang itu, mungkin sebagai direktori
  • Setel atribut 'kompres seluruh disk'

Dengan melakukan ini, TIDAK ada overhead untuk iterasi atau kompresi direktori, karena itu dilakukan pada saat file ditulis. Hanya ada satu file untuk dipindahkan - VHD.

Pada Windows, saya mengatur ukuran paket TCP default menjadi lebih besar, seperti 16348. Ini berarti lebih sedikit overhead header IP.

Satu hal yang saya temui adalah, yang terbaik adalah menjaga ukuran file di bawah 100 Mb untuk jaringan atau transfer USB. Saya menggunakan Rar.exe untuk itu - untuk membagi file.

Bekerja seperti jagoan. Ini sama dengan 'dd' di Linux .. Konsep pemasangan filesystem terkompresi ke direktori juga normal untuk Linux, jadi logika yang sama berlaku. Anda harus memastikan semua file ditutup sebelum operasi dimulai, seperti pada metode lainnya.

Ini memiliki manfaat tambahan sehingga memungkinkan untuk menempatkan kuota ukuran pada folder. Jika VHD adalah ukuran tetap, melampaui batas itu tidak akan menurunkan server, itu hanya akan menyebabkan kesalahan membuat atau menulis file.

VHD yang diformat sebagai NTFS dapat menangani jutaan file dalam folder juga.

Coder Kolombia
sumber