Cara tercepat untuk mentransfer gambar 55GB ke server baru

64

Saat ini saya memiliki dua server CentOS. Saya perlu tahu bagaimana dan apa cara tercepat untuk "tar" direktori gambar dan SCP selesai?

Apakah itu cara tercepat yang saya sarankan, karena tarring mengambil selamanya ... Saya menjalankan perintah:

tar cvf imagesbackup.tar images

Dan saya akan langsung menyelesaikannya.

Beri tahu saya jika ada cara yang lebih cepat. Saya memiliki akses jarak jauh / SSH ke kedua mesin.

Andrew Fashion
sumber
12
Sneakernet?
Nick T

Jawaban:

98

Alih-alih menggunakan tar untuk menulis ke disk lokal Anda, Anda dapat menulis langsung ke server jauh melalui jaringan menggunakan ssh.

server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"

String apa pun yang mengikuti perintah "ssh" Anda akan dijalankan pada server jarak jauh alih-alih login interaktif. Anda dapat menyalurkan input / output ke dan dari perintah-perintah jarak jauh melalui SSH seolah-olah mereka lokal. Menempatkan perintah dalam tanda kutip menghindari kebingungan, terutama saat menggunakan pengalihan.

Atau, Anda dapat mengekstrak file tar di server lain secara langsung:

server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"

Perhatikan opsi yang jarang digunakan -C. Ini berarti "ubah ke direktori ini terlebih dahulu sebelum melakukan sesuatu."

Atau, mungkin Anda ingin "menarik" dari server tujuan:

server2$ tar -zx -C /destination < <(ssh server2 "tar -zc -C /srcdir ./path")

Perhatikan bahwa <(cmd) konstruksinya baru untuk bash dan tidak berfungsi pada sistem yang lebih lama. Ini menjalankan program dan mengirimkan output ke pipa, dan mengganti pipa itu ke dalam perintah seolah-olah itu file.

Saya bisa saja dengan mudah menulis di atas sebagai berikut:

server2$ tar -zx -C /destination -f <(ssh server2 "tar -zc -C /srcdir ./path")

Atau sebagai berikut:

server2$ ssh server2 "tar -zc -C /srcdir ./path" | tar -zx -C /destination

Atau, Anda dapat menyelamatkan diri dari kesedihan dan cukup menggunakan rsync:

server1$ rsync -az ./path server2:/destination/

Akhirnya, ingat bahwa mengompresi data sebelum transfer akan mengurangi bandwidth Anda, tetapi pada koneksi yang sangat cepat, mungkin benar-benar membuat operasi mengambil lebih banyak waktu . Ini karena komputer Anda mungkin tidak dapat mengompres dengan cukup cepat untuk mengikutinya: jika mengompresi 100MB lebih lama dari yang dibutuhkan untuk mengirim 100MB, maka lebih cepat untuk mengirimnya tanpa kompresi.

Sebagai alternatif, Anda mungkin ingin mempertimbangkan untuk mem-piping sendiri gzip (daripada menggunakan opsi -z) sehingga Anda bisa menentukan level kompresi. Sudah pengalaman saya bahwa pada koneksi jaringan cepat dengan data kompresibel, menggunakan gzip pada level 2 atau 3 (defaultnya adalah 6) memberikan throughput keseluruhan terbaik dalam kebanyakan kasus. Seperti itu:

server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"
tylerl
sumber
Rsync bekerja dengan baik - kompres dengan cepat, menyalin seluruh folder, melanjutkan pada tautan yang rusak. Semua dalam satu perintah sederhana. Suka. Ini adalah opsi yang menurut saya berguna: z: kompres r: recurse = salin subfolder v: verbose. Contoh perintah Rsync saya: rsync -azvr / src-path / username @ dest_server: / dest / path /
Bastion
68

Saya akan tergoda untuk me-rsync-nya sendiri - ia melakukan kompresi dan menangani kehilangan tautan dengan baik.

Chopper3
sumber
14
rsync adalah alat yang tepat.
Rich
4
+1 - Yay rsync!
Evan Anderson
1
+1, hanya untuk ditumpuk. Plus, saya sangat suka rsync.
Steven Monday
1
Tetapi ketika menggunakan rsync Anda harus mengompres data secara manual (jika Anda ingin menyimpan data Anda yang dikompresi)
wlk
Bagaimana Anda bisa menyimpan file yang dikompres dengan rsync?
Dolan Antenucci
12

Jika Anda hanya menaruhnya dan tidak ada yang lain ini akan membuang banyak waktu dengan hanya mendapatkan kecepatan minimal.

Jadi hanya dengan menyimpan file dengan switch cvf akan secara efektif menghabiskan waktu yang diperlukan untuk membaca semua gambar 55GB dan menulisnya kembali ke disk. (Secara efektif akan lebih banyak waktu terbuang karena akan ada overhead yang cukup besar).

Hanya ada satu keuntungan yang Anda dapatkan di sini, biaya overhead untuk mengunggah banyak file sedang dikurangi. Anda mungkin mendapatkan waktu transfer yang lebih cepat jika Anda mengompres gambar (tetapi karena saya percaya mereka sudah dalam format terkompresi, ini tidak akan banyak membantu). Hanya lebih banyak buang waktu komputasi.

Kerugian terbesar dari mentransfer tar archiv besar melalui kawat adalah bahwa jika terjadi kesalahan itu bisa berarti Anda harus memulai dari awal.

Saya akan menggunakan cara itu:

md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/

Di server baru

md5sum /images/* > md5sum_new.txt

Dan kemudian diff. Dan karena scp mendukung kompresi dengan cepat, tidak perlu arsip terpisah.

Sunting

Saya akan menyimpan informasi MD5 karena berguna untuk OP. Tapi satu komentar mengejutkan saya dengan wawasan baru. Jadi sedikit pencarian disediakan informasi yang berguna ini. Harap dicatat bahwa subjek di sini adalah SFTP tidak secara langsung SCP .

Berbeda dengan FTP, SFTP memang menambah overhead untuk transfer file. Ketika file ditransfer antara klien dan server, file tersebut dipecah menjadi potongan-potongan kecil yang disebut "paket." Misalnya, anggap setiap paket adalah 32KB. Protokol SFTP melakukan checksum pada setiap file 32KB saat dikirim, dan termasuk checksum itu bersama dengan paket itu. Penerima mendapatkan paket itu dan mendekripsi data, dan kemudian memverifikasi checksum. Checksum itu sendiri "lebih kuat" dari pada checksum CRC32. (Karena SFTP menggunakan 128-bit atau checksum yang lebih tinggi, seperti MD5 atau SHA, dan karena ini dilakukan pada setiap paket, ada pemeriksaan integritas yang sangat granular yang dilakukan sebagai bagian dari transfer.) Dengan demikian, protokol itu sendiri lebih lambat (karena overhead tambahan), tetapi keberhasilan penyelesaian transfer berarti, secara de facto,

cepat
sumber
Terima kasih banyak, apa yang sedang dilakukan md5sum? dan apa perbedaannya? Terima kasih, tampil sekarang!
Andrew Fashion
2
md5sum (atau md5) mengambil checksum dari file. Diff mencari perbedaan dalam file (man diff). Checksum menciptakan string, hash, bahwa jika file diubah dalam transit ... sedikit terbalik, kesalahan ... tidak akan cocok ketika Anda mengambilnya lagi di sisi lain. Untuk file besar, Anda memiliki kemungkinan peningkatan kesalahan. Itu sebabnya ketika Anda melihat situs yang memungkinkan Anda mengunduh file .iso mereka sering memiliki MD5 checksum untuk Anda bandingkan dengan file yang Anda unduh untuk memastikannya cocok dan tidak rusak.
Bart Silverstrim
3
scp dienkripsi dan menjamin integritas melalui saluran. Masih ada sedikit peluang bahwa data itu rusak dalam memori atau pada disk tentu saja, tetapi itu cukup langka.
Ryan Bair
1
Apakah overhead checksum SFTP sebenarnya penting dalam arti praktis? Saya tidak bisa membayangkannya. 4 byte untuk setiap 32.768 tidak terdengar signifikan. Itu 128 kB per GB. Menyebut bahwa "lebih lambat" sepertinya berlebihan dalam hal apa pun kecuali rasa teoretis yang membosankan.
underscore_d
8

Di atas saran md5sum Pacey, saya akan menggunakan yang berikut:

Di tempat tujuan: nc -w5 -l -p 4567 | tar -xvf -

Kemudian pada sumbernya: tar -cvf - /path/to/source/ | nc -w5 destinationserver 4567

Itu masih tar / untar, dan tidak ada enkripsi, tetapi langsung ke server lain. Mulai keduanya secara bersamaan ( -w5beri Anda waktu 5 detik.) Dan tontonlah. Jika bandwidth ketat, tambahkan -z ke tar di kedua ujungnya.

SmallClanger
sumber
1
Saya pikir itu sebaliknya dia harus mengeksekusi pada tujuan (untuk membuka soket) dan kemudian pada sumber (untuk mengirim)
Dimitrios Mistriotis
di tempat server tujuan, apakah saya hanya meletakkan [email protected]?
Andrew Fashion
Tidak, hanya IP. netcat tidak menggunakan protokol selain TCP :) Perintah ini juga akan menjadi yang tercepat dari semua perintah yang diberikan di atas. Hanya ada satu baca per file pada sumbernya, lalu lintas jaringan minimum yang tepat untuk mentransfer file, dan tepat satu tulis per file pada tujuan. Jika Anda memiliki siklus CPU cadangan, menambahkan tanda -z (untuk kompresi) akan mempercepatnya lebih lanjut, karena lebih sedikit data jaringan yang harus ditransfer.
Jeff McJunkin
@ user36845 - Benar. Saya tidak menyiratkan kronologi dengan pemesanan di atas, tetapi Anda benar, soket harus dibuka terlebih dahulu. Saya akan mengeditnya untuk menjelaskan. :)
SmallClanger
Saya tidak yakin mengapa ssh / scp dibatasi pada 125MB / s hingga 133MB / s, tetapi netcat dapat menyalurkan data tersebut pada ~ 380MB / s dengan mudah (tautan yang sama)
ThorSummoner
1

Satu titik - tidak semua host memiliki rsync dan host mungkin memiliki versi tar yang berbeda. Untuk alasan ini, seseorang dapat merekomendasikan sebagai port of call pertama menggunakan cpio yang sering diabaikan.

Anda dapat cpio over ssh untuk melakukan replikasi ad-hoc dari struktur file / direktori antar host. Dengan cara ini Anda memiliki kontrol yang lebih baik atas apa yang dikirim karena Anda perlu "memberi makan" cpio, nom-nom. Ini juga lebih portabel-argumen, cpio tidak banyak berubah - ini adalah poin penting jika Anda mencari beberapa host di lingkungan yang heterogen.

Contoh menyalin / mengekspor / home dan subdirs ke host jarak jauh:

cd /export/ find . home -print | cpio -oaV | ssh 10.10.10.10 'cd /export/home; cpio -imVd'

Di atas akan menyalin konten / ekspor / rumah dan subdirektori ke / ekspor / rumah di host jarak jauh.

Semoga ini membantu.

Rowley
sumber
Dia menyebutkan bahwa itu adalah dua kotak CentOS, jadi mereka memiliki rsync dan file versi tar yang kompatibel. Alat seperti rsync diciptakan untuk menggantikan alat seperti cpio :). Anda tidak dapat "melanjutkan" dengan cpio, setidaknya tanpa mengetahui dari mana tepatnya Anda ingin memulai dan memfilter temuan Anda sebagaimana mestinya. Yang merupakan overhead waktu yang tidak perlu. Karena itu, informasi yang berguna untuk kotak UNIX 'lama' :)
Rafiq Maniar
Ya, cmmand itu kehilangan saya haha
Andrew Fashion
1

Jika Anda memiliki akses ssh, Anda memiliki akses rsync.

rsync -av -e ssh /storage/images/ user@[ip or domain name]:/storage/images/

atau

rsync -av -e "ssh -l user" /storage/images/ [ip or domain name]:/storage/images/

Jika Anda menerima kesalahan seperti "rsync error: beberapa file tidak dapat ditransfer (kode 23) di main.c (977) [sender = 2.6.9]", periksa pengguna dan grup di antara server; Anda mungkin memiliki ketidakcocokan.

Gunakan opsi rsync "-z" jika Anda ingin rsync mengompres transfer. Opsi ini akan menggunakan lebih banyak CPU tetapi lebih sedikit bandwidth, jadi waspadalah.

Ada opsi "- kemajuan" yang akan memberi Anda persen yang ditransfer, yang agak baik jika Anda suka hal semacam itu.

quinnr
sumber
0

Apakah mereka menggunakan jaringan bersama alih-alih membutuhkan internet untuk mentransfer file? NFS atau FTP mungkin jauh lebih cepat daripada overhead SCP, meskipun Anda akan kehilangan enkripsi selama transfer.

Tex
sumber
server berbeda di lokasi terpencil
Andrew Fashion
0

Atau Anda selalu dapat menggunakan pipa tar:

(cd /path && tar -cjf - * ) | ssh user@host 'tar -xjf - -C /path'

'j' = bzip2, Anda dapat menggunakan 'z' untuk gzip atau --lzma jika tar Anda mendukungnya.

OneOfOne
sumber