Cách nhanh nhất để chuyển 55GB hình ảnh sang máy chủ mới


64

Tôi hiện có hai máy chủ CentOS. Tôi cần biết làm thế nào và cách nhanh nhất để "tar" lên thư mục hình ảnh và SCP nó là gì?

Đó có phải là cách nhanh nhất mà tôi vừa đề xuất, bởi vì tarring sẽ mất mãi mãi ... Tôi đã chạy lệnh:

tar cvf imagesbackup.tar images

Và tôi sẽ chỉ lướt qua nó.

Hãy cho tôi biết nếu có một cách nhanh hơn. Tôi có quyền truy cập từ xa / SSH vào cả hai máy.


12
Sneakernet?
Nick T

Câu trả lời:


98

Thay vì sử dụng tar để ghi vào đĩa cục bộ của bạn, bạn có thể ghi trực tiếp vào máy chủ từ xa qua mạng bằng ssh.

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

Bất kỳ chuỗi nào tuân theo lệnh "ssh" của bạn sẽ được chạy trên máy chủ từ xa thay vì đăng nhập tương tác. Bạn có thể chuyển đầu vào / đầu ra đến và từ các lệnh từ xa đó thông qua SSH như thể chúng là cục bộ. Đặt lệnh trong dấu ngoặc kép sẽ tránh mọi sự nhầm lẫn, đặc biệt là khi sử dụng chuyển hướng.

Hoặc, bạn có thể trích xuất tệp tar trên máy chủ khác trực tiếp:

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

Lưu ý -Ctùy chọn hiếm khi được sử dụng . Nó có nghĩa là "thay đổi thư mục này trước khi làm bất cứ điều gì."

Hoặc, có lẽ bạn muốn "kéo" từ máy chủ đích:

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

Lưu ý rằng <(cmd) cấu trúc này là mới đối với bash và không hoạt động trên các hệ thống cũ. Nó chạy một chương trình và gửi đầu ra tới một đường ống và thay thế đường ống đó vào lệnh như thể nó là một tệp.

Tôi có thể dễ dàng viết những điều trên như sau:

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

Hoặc như sau:

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

Hoặc, bạn có thể tiết kiệm cho mình một số đau buồn và chỉ cần sử dụng rsync:

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

Cuối cùng, hãy nhớ rằng việc nén dữ liệu trước khi truyền sẽ làm giảm băng thông của bạn, nhưng trên một kết nối rất nhanh, nó thực sự có thể khiến hoạt động mất nhiều thời gian hơn . Điều này là do máy tính của bạn có thể không thể nén đủ nhanh để theo kịp: nếu việc nén 100MB sẽ mất nhiều thời gian hơn để gửi 100 MB, thì việc gửi nó không bị nén sẽ nhanh hơn.

Thay phiên, bạn có thể muốn xem xét đường ống để tự giải nén (thay vì sử dụng tùy chọn -z) để bạn có thể chỉ định mức nén. Theo kinh nghiệm của tôi, trên các kết nối mạng nhanh với dữ liệu có thể nén, sử dụng gzip ở cấp độ 2 hoặc 3 (mặc định là 6) mang lại thông lượng tổng thể tốt nhất trong hầu hết các trường hợp. Thích như vậy:

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

Rsync hoạt động rất đẹp - nén nhanh chóng, sao chép toàn bộ thư mục, tiếp tục trên liên kết bị hỏng. Tất cả trong một lệnh đơn giản. Yêu nó. Đây là các tùy chọn tôi thấy hữu ích: z: nén r: recurse = copy thư mục con v: verbose. Ví dụ về lệnh Rsync của tôi: rsync -azvr / src-path / username @ Dest_server: / Dest / path /
Bastion

68

Tôi muốn được tự mình đồng bộ hóa nó - nó nén và xử lý mất liên kết tốt.


14
rsync chính xác là công cụ phù hợp.
Giàu

4
+1 - Yay rsync!
Evan Anderson

1
+1, chỉ để chồng lên. Thêm vào đó, tôi thực sự thích rsync.
Steven Thứ Hai

1
Nhưng khi sử dụng rsync, bạn sẽ phải nén dữ liệu theo cách thủ công (nếu bạn muốn lưu trữ dữ liệu của mình được nén)
wlk

Làm cách nào bạn có thể lưu trữ (các) tệp nén bằng rsync?
Dolan Antenucci

12

Nếu bạn chỉ tar chúng lên và không có gì khác, điều này sẽ lãng phí hàng tấn thời gian chỉ với tốc độ tăng tối thiểu.

Vì vậy, chỉ cần ghi lại các tập tin bằng các công tắc cvf sẽ có hiệu quả chi phí thời gian để đọc tất cả các hình ảnh 55 GB và ghi chúng trở lại vào đĩa. (Thực tế, nó sẽ còn lãng phí nhiều thời gian hơn vì sẽ có một chi phí đáng kể).

Chỉ có một lợi thế bạn đạt được ở đây, chi phí để tải lên nhiều tệp đang bị giảm. Bạn có thể nhận được thời gian truyền nhanh hơn nếu bạn nén hình ảnh (nhưng vì tôi tin rằng chúng đã ở định dạng nén nên điều này sẽ không giúp ích nhiều). Chỉ lãng phí thời gian tính toán.

Bất lợi lớn nhất từ ​​việc chuyển một lưu trữ tar lớn qua dây là nếu có sự cố xảy ra, điều đó có nghĩa là bạn phải bắt đầu lại.

Tôi sẽ sử dụng theo cách đó:

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

Trên máy chủ mới

md5sum /images/* > md5sum_new.txt

Và sau đó chỉ diff. Và vì scp hỗ trợ nén khi đang bay nên không cần lưu trữ riêng.

Biên tập

Tôi sẽ giữ thông tin MD5 vì nó hữu ích cho OP. Nhưng một bình luận đánh tôi với cái nhìn sâu sắc mới. Vì vậy, một chút tìm kiếm đã cung cấp thông tin hữu ích này. Xin lưu ý rằng chủ đề ở đây là SFTP không trực tiếp SCP .

Ngược lại với FTP, SFTP không thêm chi phí cho việc chuyển tập tin. Khi một tệp được chuyển giữa máy khách và máy chủ, nó được chia thành các phần nhỏ hơn gọi là "gói". Ví dụ: giả sử mỗi gói là 32KB. Giao thức SFTP thực hiện tổng kiểm tra trên mỗi tệp 32KB khi được gửi và bao gồm tổng kiểm tra đó cùng với gói đó. Người nhận nhận gói tin đó và giải mã dữ liệu, sau đó xác minh tổng kiểm tra. Bản thân tổng kiểm tra "mạnh" hơn tổng kiểm tra CRC32. (Vì SFTP sử dụng tổng kiểm tra 128 bit hoặc cao hơn, chẳng hạn như MD5 hoặc SHA và vì việc này được thực hiện trên mỗi gói, nên có một kiểm tra tính toàn vẹn rất chi tiết được thực hiện như một phần của chuyển khoản.) Do đó, giao thức bản thân nó chậm hơn (vì có thêm chi phí), nhưng việc hoàn thành thành công một phương tiện chuyển nhượng, trên thực tế,


Cảm ơn bạn rất nhiều, md5sum đang làm gì? và khác biệt là gì? Cảm ơn bạn, thực hiện ngay bây giờ!
Thời trang Andrew

2
md5sum (hoặc md5) sẽ kiểm tra các tệp. Diff tìm sự khác biệt trong các tập tin (man diff). Tổng kiểm tra tạo ra một chuỗi, một hàm băm, nếu tệp bị thay đổi trong quá trình ... bị lật một chút, một lỗi ... sẽ không khớp khi bạn lấy lại ở phía bên kia. Đối với các tệp lớn, bạn có cơ hội tăng lỗi. Đó là lý do tại sao khi bạn thấy các trang web cho phép bạn tải xuống các tệp .iso, họ thường có một tổng kiểm MD5 để bạn so sánh tệp đã tải xuống của mình để đảm bảo nó khớp và không bị hỏng.
Bart Silverstrim

3
scp được mã hóa và đảm bảo tính toàn vẹn trên dòng. Tất nhiên vẫn có một cơ hội nhỏ rằng dữ liệu bị hỏng trong bộ nhớ hoặc trên đĩa, nhưng điều đó khá hiếm.
Ryan Bair

1
Liệu tổng chi phí của SFTP có thực sự quan trọng trong bất kỳ ý nghĩa thực tế nào không? Tôi không thể tưởng tượng như vậy. 4 byte cho mỗi 32768 không có âm thanh đáng kể. Đó là 128 kB mỗi GB. Gọi rằng "chậm hơn" có vẻ như quá lời trong bất cứ điều gì ngoại trừ một ý nghĩa lý thuyết nhàm chán.
gạch dưới

8

Trên đầu đề xuất md5sum của Pacey, tôi sẽ sử dụng như sau:

Về đích: nc -w5 -l -p 4567 | tar -xvf -

Sau đó trên nguồn: tar -cvf - /path/to/source/ | nc -w5 destinationserver 4567

Nó vẫn là một tar / unar, và không có mã hóa, nhưng nó trực tiếp đến máy chủ khác. Bắt đầu cả hai cùng một lúc ( -w5mang lại cho bạn ân sủng 5 giây.) Và xem nó đi. Nếu băng thông bị chật, hãy thêm -z vào tar ở cả hai đầu.


1
Tôi nghĩ rằng đó là cách khác trước tiên anh ta phải thực hiện tại đích (để mở ổ cắm) và sau đó về nguồn (để gửi đi)
Dimitrios Mistriotis

thay cho máy chủ đích, tôi chỉ cần đặt root@1.1.1.1?
Thời trang Andrew

Không, chỉ là IP. netcat không sử dụng giao thức nào khác ngoài TCP :) Lệnh này cũng sẽ nhanh nhất trong tất cả các lệnh được đưa ra ở trên. Có chính xác một lần đọc cho mỗi tệp trên nguồn, lưu lượng mạng tối thiểu chính xác để truyền tệp và chính xác một lần ghi cho mỗi tệp trên đích. Nếu bạn có chu kỳ CPU dự phòng, việc thêm cờ -z (để nén) sẽ tăng tốc hơn nữa, vì ít dữ liệu mạng phải được truyền đi.
Jeff McJunkin

@ user36845 - Đúng. Tôi không ngụ ý một thứ tự thời gian với thứ tự ở trên, nhưng bạn nói đúng, ổ cắm sẽ cần phải được mở trước. Tôi sẽ chỉnh sửa nó để làm rõ. :)
SmallClanger

Tôi không chắc tại sao ssh / scp bị giới hạn ở mức 125MB / s đến
133 MB

1

Một điểm - không phải tất cả các máy chủ đều có rsync và máy chủ có thể có các phiên bản tar khác nhau. Vì lý do này, người ta có thể đề xuất như một cổng cuộc gọi đầu tiên bằng cách sử dụng cpio bị bỏ quên.

Bạn có thể cpio qua ssh để thực hiện sao chép cấu trúc tệp / thư mục giữa các máy chủ. Bằng cách này, bạn có quyền kiểm soát tốt hơn đối với những gì được gửi qua khi bạn cần "nuôi" cpio, nom-nom. Nó cũng dễ di chuyển hơn, cpio không thay đổi nhiều - đây là một điểm quan trọng nếu bạn đang chăm sóc nhiều máy chủ trong một môi trường không đồng nhất.

Ví dụ sao chép / xuất / nhà và các thư mục con đến máy chủ từ xa:

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

Ở trên sẽ sao chép nội dung của / export / home và bất kỳ thư mục con nào đến / export / home trên máy chủ từ xa.

Hi vọng điêu nay co ich.


Anh ấy đã đề cập đến nó là hai hộp CentOS, vì vậy chúng có các phiên bản tương thích với rsync và tệp. Các công cụ như rsync đã được tạo để thay thế các công cụ như cpio :). Bạn không thể "tiếp tục" với cpio, ít nhất là không biết chính xác bạn muốn bắt đầu từ đâu và lọc tìm kiếm khi thích hợp. Đó là một chi phí không cần thiết thời gian. Phải nói rằng, thông tin hữu ích cho các hộp UNIX 'cũ' :)
Rafiq Maniar

Vâng, cmmand đó đã mất tôi haha
Andrew Fashion

1

Tôi có quyền truy cập ssh, bạn có quyền truy cập rsync.

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

hoặc là

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

Nếu bạn nhận được một lỗi như "lỗi rsync: một số tệp không thể được chuyển (mã 23) tại main.c (977) [sender = 2.6.9]", hãy kiểm tra người dùng và các nhóm giữa các máy chủ; bạn có thể có một sự không phù hợp.

Sử dụng tùy chọn rsync "-z" nếu bạn muốn rsync nén việc chuyển. Tùy chọn này sẽ sử dụng nhiều CPU hơn nhưng băng thông ít hơn, vì vậy hãy lưu ý điều đó.

Có một tùy chọn "- tiến hành" sẽ cung cấp cho bạn một tỷ lệ phần trăm được chuyển, đó là một điều tuyệt vời nếu bạn thích kiểu đó.


0

Có phải họ trên một mạng chia sẻ thay vì cần internet để truyền tệp? NFS hoặc FTP có thể nhanh hơn rất nhiều so với chi phí hoạt động của SCP, mặc dù bạn sẽ mất mã hóa trong quá trình chuyển.


các máy chủ khác nhau ở các địa điểm xa
Andrew Fashion

0

Hoặc bạn luôn có thể sử dụng ống nhựa tar:

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

'j' = bzip2, bạn có thể sử dụng 'z' cho gzip hoặc --lzma nếu tar của bạn hỗ trợ nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.