Cách tốt nhất để sao chép hàng triệu tệp giữa 2 máy chủ


39

Tôi có khoảng 5 triệu tệp nhỏ (5-30k) trong một thư mục mà tôi muốn sao chép sang một máy khác trên cùng mạng gigabit. Tôi đã thử sử dụng rsync, nhưng nó sẽ chậm khi thu thập dữ liệu sau vài giờ chạy, tôi cho rằng do rsync phải kiểm tra tệp nguồn & đích mỗi lần?

Suy nghĩ thứ hai của tôi sẽ là sử dụng scp, nhưng muốn lấy ý kiến ​​bên ngoài để xem có cách nào tốt hơn không. Cảm ơn!


Nút thắt có lẽ là hệ thống tập tin ở phía nhận. Hầu hết các hệ thống tệp sẽ kết thúc chậm hơn theo cấp số nhân của các tệp bạn đặt trong một thư mục (nghĩa là, mỗi khi rsync thêm một tệp mới ở phía bên nhận, phía nhận sẽ chậm lại cho phần còn lại của quá trình chuyển). Nhiều hệ thống tệp cũ thậm chí không thể chứa hơn 32K tệp trong một thư mục.
Mikko Rantalainen

Câu trả lời:


41

Một cái gì đó như thế này sẽ hoạt động tốt:

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

Cũng có thể bỏ qua gzip và cờ "z" để trích xuất, vì bạn đang ở trên mạng gigabit.


Có cần phải gzip nó không, hay ssh có nén luồng không? Hoặc có thể được thực hiện để làm điều đó?
Thilo

1
ssh sẽ nén luồng nếu bạn vượt qua "-C". Qua một làn đường tôi sẽ không bận tâm đến việc nén luồng; Tôi có thể sẽ qua Internet, trừ khi nó đã được nén.

6
Cá nhân tôi sẽ để lại gzip: ngay cả trên etherabit gigabit, nút cổ chai rất khó có thể là CPU.
Benji XVI

6
@BenjiXVI nút cổ chai chắc chắn sẽ là CPU như gzipsẽ chỉ thực hiện trên một lõi đơn. Bạn có thể mong đợi một cách hợp lý khoảng 30 MB / s với mức nén mặc định là 6 - nhưng điều này sẽ không tối đa Gigabit Ethernet.
syirecton-dj

2
sử dụng pbzip2? ...
Apache

19

Tôi chắc chắn rằng thực tế là bạn có tất cả các tệp FIVE TRIỆU trong một thư mục sẽ khiến nhiều công cụ trở nên khó khăn. Tôi không ngạc nhiên khi rsync không xử lý việc này một cách duyên dáng - đó là một tình huống "độc nhất vô nhị". Nếu bạn có thể tìm ra cách cấu trúc các tệp thành một loại cấu trúc thư mục nào đó, tôi chắc chắn các công cụ đồng bộ hóa tiêu chuẩn như rsync sẽ phản ứng nhanh hơn nhiều.

Tuy nhiên, chỉ cần đưa ra một số lời khuyên thực tế - có lẽ một giải pháp sẽ là tạm thời di chuyển ổ đĩa vào máy đích để bạn có thể sao chép các tệp trong máy chủ thực tế (không qua mạng). Sau đó, di chuyển ổ đĩa trở lại và sử dụng rsync để cập nhật mọi thứ.


6
+1 cho việc di chuyển ổ đĩa vật lý, theo cách này nhanh hơn
Robert Gould

1
Nó chắc chắn nhịp đập sao chép mọi thứ trên một ổ đĩa nhảy và qua lại ...
VirtuosiMedia

@RobertGould Hãy sử dụng IPoAC làm giao thức truyền của chúng tôi: "D
coolcat007

12

Để sao chép hàng triệu tệp qua công tắc gigabit (trong môi trường đáng tin cậy), bạn cũng có thể sử dụng kết hợp netcat (or nc)tar, như đã được đề xuất bởi user55286. Điều này sẽ truyền phát tất cả các tệp dưới dạng một tệp lớn (xem Sao chép tệp nhanh - Linux! (39 GB) ).

# 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

Ngày nay, ngày càng có nhiều thứ dùng thử IPv6, trước tiên bạn cũng có thể cần sử dụng công tắc -4 với lệnh nc của mình ở cả hai đầu để làm cho nó hoạt động trên mạng LAN IPv4 "cũ".
BeowulfNode42

5

Chúng tôi có khoảng 1 triệu tệp trong một thư mục (tệp có giá trị khoảng 4 năm).

Và chúng tôi đã sử dụng robocopy để di chuyển các tệp vào thư mục YYYY / MM (khoảng 35-45.000 tệp mỗi tháng) .. chúng tôi đặt tập lệnh robocopy trong một tệp .bat như thế này:

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

ghi chú ngắn gọn .. /ns /nc /nfl /nplà để tránh làm đầy tệp nhật ký với thông tin bổ sung /log+...là ghi thông tin tóm tắt vào tệp nhật ký.

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

vì vậy, ví dụ các tệp được sửa đổi> = 01 tháng 11 năm 2008 (bao gồm) thành các tệp được sửa đổi <01 / 12/2008 (không bao gồm)

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 để di chuyển các tập tin

sau đó đến thư mục nguồn

sau đó đến thư mục đích (thư mục sẽ được tạo khi đang cần và khi được yêu cầu).

Mất khoảng 40 - 60 phút cho chuyển khoản trị giá 1 tháng (khoảng 35-45.000 tệp) Chúng tôi cho rằng mất khoảng 12 giờ hoặc ít hơn cho chuyển khoản trị giá 1 năm.

Sử dụng Windows Server 2003.

Tất cả nội dung được ghi vào tệp nhật ký ... Thời gian bắt đầu, Thời gian kết thúc và Số lượng tệp được sao chép.

Robocopy lưu ngày.


robocopy ngày nay có công tắc / MT [: n] cho các bản sao đa luồng với n luồng (mặc định 8) để đạt được hiệu ứng tương tự chỉ tốt hơn và không phụ thuộc vào phạm vi ngày và cho phép một dòng lệnh, thay vì một dòng lệnh mỗi chủ đề. Mặc dù công tắc MT không khả dụng trên Windows 2003.
BeowulfNode42

4

Bạn biết đấy, tôi cộng thêm 1 giải pháp tar, nhưng - tùy thuộc vào môi trường - có một ý tưởng khác xảy ra. Bạn có thể nghĩ về việc sử dụng dd (1) . Vấn đề tốc độ với một cái gì đó như thế này là phải mất nhiều chuyển động đầu để mở và đóng một tệp, mà bạn sẽ thực hiện năm triệu lần. Trong trường hợp bạn có thể đảm bảo rằng những thứ này được gán liên tục, thay vào đó bạn có thể sử dụng chúng, điều này sẽ cắt giảm số lượng chuyển động của đầu theo hệ số 5 trở lên.


4

Tôi thích sử dụng lz4 như một công cụ nén nhanh nhất vào lúc này. Tùy chọn SSH -c arcfour128 sử dụng thuật toán mã hóa nhanh hơn mặc định. [1]

Vì vậy, chuyển thư mục trông giống như:

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

Xin lưu ý rằng trên lệnh lz4 của Debian là lz4c và trên CentOS là lz4.


Mã hóa / giải mã ssh có thể là một nút cổ chai do việc sử dụng cpu trên cpu nguồn hoặc đích và tính chất luồng đơn của gần như tất cả các triển khai ssh. Đó là một mạng LAN gigabit riêng, vì vậy không cần mã hóa.
BeowulfNode42

3

Robocopy là tuyệt vời cho những thứ như thế này. Nó sẽ thử lại sau khi hết thời gian mạng và nó cũng cho phép bạn đặt độ trễ khoảng cách giữa các gói để bây giờ tràn vào đường ống.

[Chỉnh sửa]

Lưu ý rằng đây là một ứng dụng chỉ dành cho Windows.


Giả sử bạn đang ở trên cửa sổ của khóa học. Điều thú vị về robocopy là ứng dụng chịu trách nhiệm lặp lại các tập tin, Vấn đề với các tiện ích unix là bạn có thể hết không gian shell để mở rộng tên.
Martin Beckett

3

Tôi biết điều này có thể là ngu ngốc - nhưng bạn đã nghĩ đến việc sao chép chúng vào một đĩa bên ngoài và mang nó đến máy chủ khác chưa? Nó thực sự có thể là giải pháp hiệu quả và đơn giản nhất.


3

Chúng tôi đang điều tra vấn đề này hiện nay. Chúng tôi cần chuyển khoảng 18 triệu tệp nhỏ - tổng cộng khoảng 200 GB. Chúng tôi đã đạt được hiệu suất tốt nhất bằng XCopy cũ, nhưng vẫn mất nhiều thời gian. Khoảng 3 ngày từ 1 máy chủ đến máy chủ khác, khoảng 2 tuần cho một ổ đĩa ngoài!

Thông qua một quá trình khác, chúng tôi cần nhân đôi máy chủ. Điều này đã được thực hiện với Acronis. Mất khoảng 3 giờ !!!

Chúng tôi sẽ điều tra thêm một số điều này. Gợi ý dd ở trên có thể sẽ cung cấp kết quả tương tự.


2

Đã có rất nhiều lời đề nghị hay, nhưng muốn ném vào Beyond So sánh . Gần đây tôi đã chuyển khoảng 750.000 tệp giữa 5KB và 20MB từ máy chủ này sang máy chủ khác qua chuyển đổi gigabit. Nó thậm chí không nấc. Cấp nó mất một thời gian, nhưng tôi mong đợi rằng với rất nhiều dữ liệu.


1

Tôi muốn xem cách zip-> sao chép-> giải nén

hoặc bất cứ hệ thống nén / lưu trữ yêu thích nào của bạn.


yeah nén chúng vào một tập tin cũng là một ý tưởng hay
Robert Gould

thậm chí chỉ là một tarball
Joel Coehoorn

1

Gói chúng vào một tệp trước khi bạn sao chép tệp, sau đó giải nén chúng lại sau khi sao chép.


1

Trong một tình huống tương tự, tôi đã thử sử dụng tar để sắp xếp các tệp. Tôi đã viết một đoạn script nhỏ để chuyển trực tiếp đầu ra của lệnh tar tới máy đích đến một quy trình tar nhận mà không xử lý các tệp.

Cách tiếp cận tar gần như tăng gấp đôi tốc độ truyền so với scp hoặc rsync (YMMV).

Dưới đây là các lệnh tar. Lưu ý rằng bạn sẽ cần kích hoạt các lệnh r bằng cách tạo các tệp .rhosts trong các thư mục chính của mỗi máy (loại bỏ chúng sau khi sao chép xong - chúng là các vấn đề bảo mật khét tiếng). Cũng lưu ý rằng, như thường lệ, HP-UX rất khó xử - trong khi phần còn lại của thế giới sử dụng 'rsh' cho lệnh shell từ xa, HP-UX sử dụng 'remsh'. 'rsh' là một loại vỏ bị hạn chế theo cách nói của HP.

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

Lệnh tar đầu tiên tạo một tệp có tên '-', đây là mã thông báo đặc biệt có nghĩa là 'đầu ra tiêu chuẩn' trong trường hợp này. Kho lưu trữ được tạo chứa tất cả các tệp trong thư mục hiện tại (.) Cộng với tất cả các thư mục con (tar được đệ quy theo mặc định). Tệp lưu trữ này được dẫn vào lệnh remsh sẽ gửi nó đến máy box2. Trên hộp 2 trước tiên tôi thay đổi thư mục nhận thích hợp, sau đó tôi trích xuất từ ​​'-' hoặc 'đầu vào tiêu chuẩn' các tệp đến.

Tôi đã có 6 lệnh tar này chạy đồng thời để đảm bảo liên kết mạng được bão hòa dữ liệu, mặc dù tôi nghi ngờ rằng việc truy cập đĩa có thể là yếu tố hạn chế.


1

Bỏ qua hệ thống tập tin.

Bạn có thể ngắt kết nối phân vùng này mà các tệp nằm trên nó hoặc gắn kết nó chỉ đọc không? Làm điều đó, sau đó một cái gì đó như:

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

Sau đó, bạn có thể gắn kết diskimage.binnhư một thiết bị loopback ở phía đích và sao chép các tệp từ thiết bị đó sang hệ thống tệp đích thực của bạn hoặc có thể sử dụng các công cụ thích hợp để ghép lại vào một phân vùng trống ở phía đích (nguy hiểm, nhưng có thể có thể , mặc dù tôi chưa bao giờ làm điều đó.)

Nếu bạn thực sự can đảm, bạn có thể ddtrực tiếp quay lại vào một phân vùng ở phía đích. Tôi không khuyên bạn nên điều đó.


0

bạn có thể thử các cách sau (có thể theo lô tệp)

  • tar các tập tin
  • gzip chúng
  • sao chép bằng scp nếu có thể
  • súng ngắn
  • gỡ các tập tin

0

Theo đề xuất của sth, bạn có thể thử tar trên ssh.

Nếu bạn không yêu cầu mã hóa (ban đầu bạn đã sử dụng rsync, nhưng không đề cập đến đó là rsync + ssh), bạn có thể thử tar qua netcat để tránh chi phí ssh.

Tất nhiên bạn cũng có thể rút ngắn thời gian sử dụng bằng cách sử dụng gzip hoặc phương pháp nén khác.


0

Có một cái gì đó khác để xem xét. Thử đi:

  • Tạo một VHD, kích thước động
  • Gắn kết nó, có thể là một thư mục
  • Đặt thuộc tính 'nén toàn bộ đĩa'

Bằng cách này, KHÔNG có chi phí cho việc lặp hoặc nén thư mục, bởi vì điều đó đã được thực hiện tại thời điểm các tệp được ghi. Chỉ có một tệp để di chuyển - VHD.

Trên Windows, tôi đặt kích thước gói TCP mặc định là lớn hơn, như 16348. Điều này có nghĩa là chi phí tiêu đề IP ít hơn.

Tuy nhiên, một điều tôi gặp phải là tốt nhất là giữ kích thước tệp dưới 100 Mb cho truyền qua mạng hoặc USB. Tôi sử dụng Rar.exe cho điều đó - để phân chia các tệp.

Hoạt động như một nhà vô địch. Điều này tương đương với 'dd' trong Linux .. Khái niệm gắn hệ thống tệp nén vào thư mục là bình thường đối với Linux, do đó, logic tương tự cũng được áp dụng. Bạn phải đảm bảo tất cả các tệp được đóng trước khi hoạt động bắt đầu, như trong các phương thức khác.

Điều này có thêm lợi ích là làm cho nó có thể đặt hạn ngạch kích thước trên một thư mục. Nếu VHD là một kích thước cố định, vượt quá giới hạn đó sẽ không làm giảm máy chủ, nó sẽ chỉ gây ra lỗi khi tạo hoặc ghi tệp.

Một VHD được định dạng là NTFS cũng có thể xử lý hàng triệu tệp trong một thư mục.

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.