Sao chép tệp lớn từ máy chủ Linux này sang máy chủ Linux khác


20

Tôi đang cố gắng sao chép 75 gigabyte tgz (ảnh chụp lvm mysql) từ máy chủ Linux trong trung tâm dữ liệu LA của chúng tôi sang máy chủ Linux khác trong trung tâm dữ liệu NY của chúng tôi qua liên kết 10 MB.

Tôi nhận được khoảng 20-30Kb / giây với rsync hoặc scp dao động trong khoảng 200-300 giờ.

Hiện tại, đây là một liên kết tương đối yên tĩnh vì trung tâm dữ liệu thứ hai chưa hoạt động và tôi đã đạt được tốc độ tuyệt vời từ việc chuyển tệp nhỏ.

Tôi đã theo dõi các hướng dẫn điều chỉnh tcp khác nhau mà tôi đã tìm thấy qua google nhưng không có kết quả (có thể tôi đang đọc hướng dẫn sai, có một hướng dẫn tốt?).

Tôi đã thấy mẹo đường hầm tar + netcat, nhưng tôi hiểu rằng nó chỉ tốt cho rất nhiều tệp nhỏ mà không cập nhật cho bạn khi tệp được chuyển hoàn tất.

Trước khi tôi sử dụng một ổ đĩa cứng, có ai có đầu vào tốt không?

CẬP NHẬT: Chà ... nó có thể là liên kết sau :( Xem các thử nghiệm của tôi dưới đây ...

Chuyển từ NY đến LA:

Lấy một tập tin trống.

[nathan@laobnas test]$ dd if=/dev/zero of=FROM_LA_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.412 seconds, 164 MB/s
[nathan@laobnas test]$ scp -C obnas:/obbkup/test/FROM_NY_TEST .
FROM_NY_TEST                                    3%  146MB   9.4MB/s   07:52 ETA

Bắt tarball chụp nhanh.

[nathan@obnas db_backup]$ ls -la db_dump.08120922.tar.gz
-rw-r--r-- 1 root root 30428904033 Aug 12 22:42 db_dump.08120922.tar.gz

[nathan@laobnas test]$ scp -C obnas:/obbkup/db_backup/db_dump.08120922.tar.gz .
db_dump.08120922.tar.gz            0%   56MB 574.3KB/s 14:20:40 ET

Chuyển từ LA đến NY:

Lấy một tập tin trống.

[nathan@obnas test]$ dd if=/dev/zero of=FROM_NY_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.2501 seconds, 165 MB/s
[nathan@obnas test]$ scp -C laobnas:/obbkup/test/FROM_LA_TEST .
FROM_LA_TEST                                    0% 6008KB 497.1KB/s 2:37:22 ETA

Sắp xếp tarball chụp nhanh.

[nathan@laobnas db_backup]$ ls -la db_dump_08120901.tar.gz
-rw-r--r-- 1 root root 31090827509 Aug 12 21:21 db_dump_08120901.tar.gz

[nathan@obnas test]$ scp -C laobnas:/obbkup/db_backup/db_dump_08120901.tar.gz .
db_dump_08120901.tar.gz                0%  324KB  26.8KB/s 314:11:38 ETA

Tôi đoán tôi sẽ tham gia cùng với những người điều hành các cơ sở của chúng tôi, liên kết được gắn nhãn là liên kết 10 MB MPLS / Ethernet. (nhún vai)


Chỉ cần một nhận xét, gần đây tôi đã nhận được một bản phát hành từ một nhà cung cấp phần mềm trên Seagate FreeAgent (đĩa USB) có dung lượng khoảng 50 GB. Công ty trong câu hỏi đã có sự hiện diện web và thường yêu cầu khách hàng chỉ cần tải xuống từ trang web của họ. Nghĩ rằng đó là một giải pháp thú vị và nghĩ rằng điều này có thể thêm một số thông tin để giúp trong quyết định của bạn.
mdpc

Bạn đang nhìn thấy loại độ trễ nào?
retracile

Khoảng 80 ms qua liên kết.
Nathan Milford

Vâng, bây giờ tôi chỉ bối rối và thất vọng. Tôi đã chia nó thành 50mb và nó vẫn chậm! Nhưng việc kết hợp các dữ liệu khác nhận được 500kb / giây ... phải có điều gì đó cực kỳ sai lầm. Tôi đang thiếu ....
Nathan Milford

Kiểm tra lưu lượng của bạn với tcpdump. Nó có thể giúp bạn tìm ra, những gì làm chậm quá trình chuyển tiền.
lexsys

Câu trả lời:


16

Sneakernet có ai không?

Giả sử đây là bản sao một lần, tôi không cho rằng có thể chỉ sao chép tệp vào đĩa CD (hoặc phương tiện khác) và qua đêm đến đích là có?

Đó thực sự có thể là tùy chọn nhanh nhất của bạn khi chuyển tập tin có kích thước đó, qua kết nối đó, có thể không sao chép chính xác ... trong trường hợp đó bạn có thể bắt đầu lại từ đầu.


rsync

Lựa chọn / nỗ lực thứ hai của tôi sẽ là rsync vì nó phát hiện chuyển tiền thất bại, chuyển một phần, v.v. và có thể nhận từ nơi nó rời đi.

rsync --progress file1 file2 user@remotemachine:/destination/directory

Cờ --prowards sẽ cung cấp cho bạn một số phản hồi thay vì chỉ ngồi đó và để bạn tự đoán thứ hai. :-)


Vuze (bittorrent)

Lựa chọn thứ ba có lẽ là thử và sử dụng Vuze như một máy chủ torrent và sau đó yêu cầu vị trí từ xa của bạn sử dụng một máy khách bitorrent tiêu chuẩn để tải xuống. Tôi biết những người khác đã làm điều này nhưng bạn biết ... vào thời điểm họ hoàn thành tất cả các thiết lập đang chạy, v.v ... Tôi có thể đã qua đêm dữ liệu ...

Tôi phụ thuộc vào tình huống của bạn.

Chúc may mắn!


CẬP NHẬT:

Bạn biết đấy, tôi đã suy nghĩ về vấn đề của bạn nhiều hơn một chút. Tại sao các tập tin phải là một tarball lớn duy nhất? Tar hoàn toàn có khả năng chia các tệp lớn thành các tệp nhỏ hơn (ví dụ để mở rộng phương tiện truyền thông), vậy tại sao không chia tarball khổng lồ đó thành các phần dễ quản lý hơn và sau đó chuyển các phần thay thế?


3
+1, mặc dù có lẽ không hiệu quả về chi phí trong trường hợp này. Đừng bao giờ đánh giá thấp băng thông của 747 ổ cứng :)
Chad Huneycutt

2
Tôi không thể tìm thấy liên kết, nhưng một vài năm trước Google đã xem xét việc vận chuyển các thùng ổ đĩa xung quanh. Nếu bạn có thể di chuyển một thùng ổ đĩa có tổng dung lượng 500TB từ điểm A sang điểm B, bất kỳ cách nào bạn cắt nó đều là băng thông mạnh mẽ
STW

2
Có lẽ bạn đang đề cập đến bài viết này: arstechnica.com/science/news/2007/03/...
KPWINC

1
Vâng, tôi đã kết thúc việc vận chuyển một ổ đĩa cứng. Vấn đề thực sự, hay như tôi đã nói, là kiểm soát dòng chảy trên (các) công tắc.
Nathan Milford

Bittorrent chỉ hoạt động tốt hơn chuyển khoản trực tiếp nếu bạn có nhiều seeder. Ngay cả khi OP cài đặt bt trên nhiều máy, anh ta chỉ có một kết nối. Và anh ấy đã xác định rằng nhiều tệp nhỏ không đi nhanh hơn một tệp lớn, điều này chỉ ngón tay vào kết nối mạng.
Xalious

7

Tôi đã làm điều đó trong quá khứ, với tệp tbz2 60GB. Tôi không có kịch bản nữa nhưng nó sẽ dễ dàng viết lại nó.

Đầu tiên, chia tệp của bạn thành các mảnh ~ 2GB:

split --bytes=2000000000 your_file.tgz

Đối với mỗi phần, hãy tính băm MD5 (đây là để kiểm tra tính toàn vẹn) và lưu trữ ở đâu đó, sau đó bắt đầu sao chép các phần và md5 của chúng vào trang web từ xa bằng công cụ bạn chọn (tôi: netcat-tar-pipe trong màn hình phiên).

Sau một thời gian, hãy kiểm tra với md5 nếu các mảnh của bạn ổn, sau đó:

cat your_file* > your_remote_file.tgz

Nếu bạn cũng đã thực hiện MD5 của tệp gốc, hãy kiểm tra nó. Nếu nó ổn, bạn có thể gỡ bỏ tập tin của bạn, mọi thứ sẽ ổn.

(Nếu tôi tìm thấy thời gian, tôi sẽ viết lại kịch bản)


5

Thông thường tôi là một người ủng hộ lớn của rsync, nhưng khi lần đầu tiên chuyển một tệp duy nhất, nó dường như không có ý nghĩa gì nhiều. Tuy nhiên, nếu bạn đang chuyển lại tệp chỉ với một chút khác biệt, rsync sẽ là người chiến thắng rõ ràng. Nếu bạn chọn sử dụng rsync, tôi khuyên bạn nên chạy một đầu trong --daemonchế độ để loại bỏ đường hầm ssh hiệu năng. Trang người đàn ông mô tả chế độ này khá kỹ lưỡng.

Đề nghị của tôi? FTP hoặc HTTP với các máy chủ và máy khách hỗ trợ tiếp tục tải xuống bị gián đoạn. Cả hai giao thức đều nhanh và nhẹ, tránh hình phạt ssh-đường hầm. Apache + wget sẽ la hét rất nhanh.

Thủ thuật đường ống netcat cũng sẽ hoạt động tốt. Tar không cần thiết khi chuyển một tệp lớn. Và lý do nó không thông báo cho bạn khi hoàn thành là vì bạn đã không nói với nó. Thêm một -q0cờ vào phía máy chủ và nó sẽ hoạt động chính xác như bạn mong đợi.

máy chủ $ nc -l -p 5000> outfile.tgz

máy khách $ nc -q0 máy chủ.example.com 5000 <infile.tgz

Nhược điểm của phương pháp netcat là nó sẽ không cho phép bạn tiếp tục nếu chuyển khoản của bạn chết 74GB trong ...


+1 cho rsyncd. Tôi thực sự sử dụng nó để chuyển trên mạng LAN của mình vì tôi thấy thông lượng cao hơn so với CIFS hoặc NFS.
Ophidian

1
Trong khi FTP và HTTP tránh "hình phạt đường hầm ssh" thì "hình phạt" vì không mã hóa dữ liệu cần phải được xem xét.
J.Money

3

Cho netcat (đôi khi được gọi là nc) một shot. Sau đây hoạt động trên một thư mục, nhưng nó đủ dễ để điều chỉnh cho chỉ đối phó một tệp.

Trên hộp đích:

netcat -l -p 2342 | tar -C /target/dir -xzf -

Trên hộp nguồn:

tar czf * | netcat target_box 2342

Bạn có thể thử xóa tùy chọn 'z' trong cả hai lệnh tar để thấy tốc độ nhanh hơn một chút vì tệp đã được nén.


1

SCP và Rsync mặc định (sử dụng SCP) rất chậm đối với các tệp lớn. Tôi đoán tôi sẽ xem xét việc sử dụng một giao thức với chi phí thấp hơn. Bạn đã thử sử dụng một cypher mã hóa đơn giản hơn hay chưa? Hãy thử xem xét --rshtùy chọn cho rsync để thay đổi phương thức chuyển.

Tại sao không phải là FTP hoặc HTTP?


1
tôi đã thực hiện "python -m SimpleHTTPServer" từ dòng lệnh trên nguồn và quên tập tin ở đích. Tôi vẫn nhận được "18,5K / s eta 15d 3h"
Nathan Milford

1

Mặc dù nó bổ sung thêm một chút chi phí cho tình huống BitTorrent thực sự là một giải pháp thực sự tốt để chuyển các tệp lớn. BitTorrent có rất nhiều tính năng hay như chunk một tập tin và kiểm tra từng đoạn có thể được truyền lại nếu bị hỏng.

Một chương trình như Azureus [hiện được gọi là Vuze] chứa tất cả các phần bạn sẽ cần để tạo, máy chủ và tải xuống torrent trong một ứng dụng. Bean trong tâm trí Azureus không phải là giải pháp tinh gọn nhất có sẵn cho BitTorrent và tôi nghĩ cũng yêu cầu GUI của nó - có rất nhiều công cụ torrent điều khiển dòng lệnh cho linux.


bt chỉ đi nhanh hơn chuyển trực tiếp nếu có nhiều hạt. Anh ấy có một nguồn duy nhất. Quan trọng hơn, anh ta có một mạng nguồn duy nhất có kết nối mạng kém. Ngay cả việc sao chép tệp vào nhiều vị trí cục bộ sau đó thiết lập bt với nhiều hạt cũng phản tác dụng do kết nối xấu đó. Cộng với việc tạo nhiều bản sao và thiết lập chúng dưới dạng hạt nhân sẽ nhân thời gian sao chép thay vì giảm bớt. BT có thể là một giải pháp khả thi nếu OP đang cố gắng cung cấp một tệp lớn cho nhiều người nhận.
Xalious

0

Cá nhân, 20-30Kb / giây có vẻ khá thấp đối với liên kết 10Mb (giả sử 10Mb chứ không phải 10MB).

Nếu tôi là bạn, tôi sẽ làm một trong hai điều (giả sử không có quyền truy cập vật lý) -

Dù là một, tôi khuyên bạn nên chia tệp lớn thành nhiều phần nhỏ hơn, khoảng 500MB Chỉ cần tham nhũng trong quá cảnh.

Khi bạn có các phần nhỏ hơn, hãy sử dụng lại rsync hoặc cá nhân tôi thích sử dụng phiên bảo mật ftp riêng tư và sau đó CRC các tệp sau khi hoàn thành.


0

Một vài câu hỏi có thể giúp ích trong các cuộc thảo luận: dữ liệu được truyền tải quan trọng như thế nào? Đây có phải là để phục hồi thảm họa, sao lưu nóng, lưu trữ ngoại tuyến hay không? Bạn đang có ý định sao lưu cơ sở dữ liệu trong khi nó lên hay xuống? Điều gì về việc thiết lập cơ sở dữ liệu tại hệ thống từ xa và giữ cho chúng đồng bộ hóa bằng cách phân cụm hoặc cập nhật qua các thay đổi (Tôi không hoàn toàn hiểu về các khả năng của hệ thống cơ sở dữ liệu MySql). Điều này có thể giúp giảm lượng dữ liệu cần truyền qua liên kết.


Nó là ảnh chụp nhanh LVM của một bản sao MYSQL khác (ví dụ MYSQL chính của chúng tôi ở nơi khác). Sau khi được chuyển và định vị, đối tượng mysql đích có thể chỉ cần cập nhật sự khác biệt giữa ảnh chụp nhanh đó (sử dụng nó như một delta) và hiện tại chủ đang ở đâu. Rằng nó là một bản sao lưu MYSQL không liên quan, nó chỉ là một khối dữ liệu lớn mà tôi chỉ cần di chuyển một lần.
Nathan Milford

0

bbcp sẽ chunk file cho bạn và sao chép với nhiều luồng.


0

Câu trả lời muộn cho nhân viên của Google:

Khi truyền bộ dữ liệu lớn, rsync có thể được sử dụng để so sánh nguồn và đích, sau đó ghi tệp bó vào phương tiện lưu động cục bộ bằng cách sử dụng cờ --only-write-batch. Sau đó, bạn chuyển phương tiện cục bộ đến vị trí từ xa, cắm nó vào và chạy lại rsync, sử dụng --read-batch để kết hợp các thay đổi vào bộ dữ liệu từ xa.

Nếu các tệp nguồn thay đổi trong quá trình vận chuyển vật lý hoặc nếu phương tiện vận chuyển đầy, bạn có thể tiếp tục lặp lại --only-write-batch | tàu | --read-batch chu kỳ cho đến khi tất cả đích đến bắt kịp.

(Tài liệu tham khảo: Tôi là một trong những tác giả tính năng này trong rsync - cho biết thêm trường hợp nền và sử dụng, xem thảo luận này của việc thực hiện nguyên mẫu: https://lists.samba.org/archive/rsync/2005-March/011964 .html )

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.