Filetransifts thông minh hơn rsync? [đóng cửa]


7

Tôi có một tệp lớn (2-3 GB, định dạng nhị phân, không có giấy tờ) mà tôi sử dụng trên hai máy tính khác nhau (thông thường tôi sử dụng nó trên hệ thống máy tính để bàn nhưng khi đi du lịch tôi đã đặt nó vào máy tính xách tay của mình). Tôi sử dụng rsync để chuyển tập tin này qua lại.

Thỉnh thoảng tôi thực hiện cập nhật nhỏ cho tệp này, thay đổi dưới 100 kB. Điều này xảy ra trên cả hai hệ thống.

Vấn đề với rsync theo tôi hiểu là nếu nó nghĩ rằng một tệp đã thay đổi giữa nguồn và đích thì nó sẽ chuyển tệp hoàn chỉnh. Trong tình huống của tôi, nó cảm thấy lãng phí thời gian khi chỉ một phần nhỏ của tệp có thay đổi. Tôi dự tính một giao thức trong đó các tác nhân chuyển giao trên nguồn và đích trước tiên kiểm tra toàn bộ tệp và sau đó so sánh kết quả. Khi họ nhận ra rằng tổng kiểm tra cho toàn bộ tệp là khác nhau, họ chia tệp thành hai phần, A và B và kiểm tra riêng chúng.

Aha, B giống hệt nhau trên cả hai máy, hãy bỏ qua một nửa. Bây giờ nó tách A thành A1 và A2. Ok, chỉ có A2 đã thay đổi. Tách A2 thành A2I và A2II và so sánh, v.v. Thực hiện điều này một cách đệ quy cho đến khi tìm thấy, ví dụ: ba phần mỗi phần 1 khác nhau giữa nguồn và đích và sau đó chuyển chỉ các phần này và chèn chúng vào đúng vị trí tại tệp đích. Ngày nay với SSD nhanh và CPU đa lõi như vậy song song nên rất hiệu quả.

Vì vậy, câu hỏi của tôi là, có công cụ nào hoạt động như thế này (hoặc theo cách khác mà tôi không thể tưởng tượng được nhưng với kết quả tương tự) có sẵn ngày hôm nay không?

Một yêu cầu làm rõ đã được đăng. Tôi chủ yếu sử dụng Mac nên hệ thống tập tin là HFS +. Thông thường tôi bắt đầu rsync như thế này

rsync -av --delete --progress --stats- trong trường hợp này đôi khi tôi sử dụng SSH và đôi khi rsyncd. Khi tôi sử dụng rsyncd tôi bắt đầu như thế này rsync --daemon --verbose --no-detach.

Làm rõ thứ hai: Tôi yêu cầu một công cụ chỉ chuyển delta cho một tệp tồn tại ở hai vị trí có thay đổi nhỏ và / hoặc nếu rsync thực sự cung cấp điều này. Kinh nghiệm của tôi với rsync là nó chuyển các tệp đầy đủ (nhưng bây giờ có một câu trả lời giải thích điều này: rsync cần một máy chủ rsync để có thể chuyển chỉ các deltas, nếu không (ví dụ: sử dụng ssh-shell), nó sẽ chuyển toàn bộ tập tin tuy nhiên đã thay đổi nhiều).


1
Tôi muốn nói rằng nó là tốt nhất.
DisplayName

1
Rsync không nên truyền lại toàn bộ tệp nếu chỉ một phần nhỏ được thay đổi. Theo mặc định, nó chỉ chuyển các thay đổi. Bạn đã xác nhận rằng nó thực sự truyền lại toàn bộ tập tin? Làm thế nào để bạn gọi rsync?
Marco

1
Điển hình là một cái gì đó như thế này rsync -av --delete --progress --stats. Đôi khi tôi sử dụng máy chủ rsync rsync --daemon --verbose --no-detach. Nhưng kết quả luôn luôn như vậy.
db

3
Toàn bộ điểm của rsynclà nó tìm thấy chỉ là phần mà đã thay đổi và chỉ họ gửi.
psusi

@db đang hỏi có một công cụ có thể sao chép lại một cách hiệu quả một tập tin. Đó là đồng bộ hóa tệp a giống như tệp b. (Có thể đây là những gì rsyncđã làm, vì vậy có thể đây là câu trả lời)
ctrl-alt-delor

Câu trả lời:


8

Rsync sẽ không sử dụng deltas nhưng sẽ truyền toàn bộ tệp nếu nó - như một quy trình duy nhất - chịu trách nhiệm cho các tệp nguồn và đích. Nó có thể truyền deltas khi có một quá trình máy khách và máy chủ riêng biệt chạy trên các máy nguồn và đích.

Lý do rsync sẽ không gửi deltas khi đó là quy trình duy nhất là để xác định xem có cần gửi delta hay không, nó cần đọc tệp nguồn và tệp đích. Vào lúc đó, nó có thể đã sao chép trực tiếp tệp.

Nếu bạn đang sử dụng lệnh của biểu mẫu này, bạn chỉ có một quy trình rsync:

rsync /path/to/local/file /network/path/to/remote/file

Nếu bạn đang sử dụng lệnh của biểu mẫu này, bạn có hai quy trình rsync (một trên máy chủ cục bộ và một trên điều khiển từ xa) và có thể sử dụng deltas:

rsync /path/to/local/file remote_host:/path/to/remote/file

1
Hấp dẫn. Không biết điều đó. Như bạn có thể thấy trong nhận xét của tôi ở đây unix.stackexchange.com/questions/180992/NH Đôi khi tôi khởi động máy chủ en rsync trên một trong các máy (khi tôi muốn sử dụng tổng kiểm). Tôi đã không nhận thấy rằng nó nhanh hơn (nhưng một lần nữa, cho đến nay tôi chỉ sử dụng rsync khi tôi muốn chuyển khoản rất an toàn và sử dụng tổng kiểm tra và sau đó việc kiểm tra mất rất nhiều thời gian).
db

1
Hmm, sau một suy nghĩ thứ hai, nếu kiểm tra lại làm chậm quá trình chuyển, thì một lần nữa nó có thể chuyển toàn bộ tập tin!? Bất kỳ cách nào để chuyển rsync chuẩn?
db

1
Tôi không thấy bất cứ nơi nào hiển thị các ví dụ về đường dẫn cục bộ và từ xa. Bạn có cung cấp tên máy chủ trong một trong các đường dẫn không? Nếu không, thuật toán deltas sẽ không khởi động. Ngoài ra, hãy nhớ rằng để tính toán deltas, toàn bộ tệp phải được đọc (ở cả hai mặt), đối với các tệp lớn sẽ mất một thời gian đáng kể.
roaima

2
có, tôi sử dụng tên máy chủ, thông qua giao thức ssh- hoặc rsync (nghĩa là không phải tệp: //), chẳng hạn nhưrsync://remote.local:/myFile /myFile;
db

1
rsync được lập trình để giảm thiểu lưu lượng mạng, ngay cả khi điều đó có nghĩa là nó phải thực hiện nhiều IO cục bộ. Theo như rsync, các hệ thống tệp mạng là cục bộ, vì rsync có thể mở các tệp đó bằng một cuộc gọi hệ thống đơn giản.
wurtel

2

Từ phần MÔ TẢ của man rsync:

Rsync là một công cụ sao chép tập tin nhanh và cực kỳ linh hoạt. Nó có thể sao chép cục bộ, đến / từ một máy chủ khác trên bất kỳ shell từ xa nào hoặc đến / từ một daemon rsync từ xa. Nó cung cấp một số lượng lớn các tùy chọn kiểm soát mọi khía cạnh của hành vi của nó và cho phép đặc tả rất linh hoạt của tập hợp các tệp được sao chép. Nó nổi tiếng với thuật toán chuyển delta, giúp giảm lượng dữ liệu được gửi qua mạng bằng cách chỉ gửi sự khác biệt giữa các tệp nguồn và các tệp hiện có ở đích.

Vì vậy, đó sẽ là "không".


1
Nhưng làm thế nào để tính toán delta? Theo kinh nghiệm của tôi, nếu tôi chuyển một thư mục có hàng ngàn tệp hoặc tệp lớn này, thì nó luôn chuyển toàn bộ tệp nếu có thay đổi. Ví dụ, đôi khi tôi cũng chuyển thư mục với mp3 qua lại. Nếu tôi thay đổi thẻ ID trên mp3 như vậy và nhận được khoảng 500 kB / giây thì phải mất 8-10 giây để truyền tệp mặc dù chỉ một vài byte đã thay đổi.
db

2
@ user23122 Bạn có đang sử dụng công -Wtắc không? Bạn sử dụng công tắc nào? Và hệ thống tập tin gì? Chỉnh sửa thông tin này vào câu hỏi của bạn vì nó có liên quan.
jasonwryan

1
câu hỏi cập nhật với các thông tin được yêu cầu.
db

0

Bạn có thể sử dụng RAID-1 (phản chiếu) cho Optimizimg này. Điều này đang trở nên kỳ lạ với sự thay đổi được thực hiện cho cả hai bên nhưng điều đó cũng làm cho việc sử dụng trở nên rsynckỳ lạ. Bạn nên giải thích làm thế nào điều này được xử lý.

  1. Bạn có thể tạo một tệp ( dd if=/dev/zero of=/path/to/syncfile.img bs=1M count=3500) lớn hơn một chút so với tệp đồng bộ hóa của bạn sẽ phát triển trong tương lai gần.
  2. Sau đó, bạn đặt một thiết bị lặp lên trên tệp đó ( losetup /dev/loop5 /path/to/syncfile.img).
  3. Bạn làm điều này trên cả hai hệ thống.
  4. Trên hệ thống từ đó các thay đổi sẽ được đồng bộ hóa với hệ thống khác mà bạn cung cấp thiết bị khối của hệ thống khác có sẵn với các thiết bị khối mạng ( nbd).
  5. Tạo một mảng RAID-1 trên cả hai thiết bị khối : mdadm create /dev/md5 --raid-devices=2 --level=raid1 --bitmap=/path/to/ext3volume/sync-bitmap --assume-clean /dev/loop5 --write-mostly /dev/path/to/nbd. Bạn phải cung cấp --bitmap=/path/to/ext3volume/sync-bitmapkhi bạn lắp ráp các mảng sau.
  6. Tạo một hệ thống tập tin trên RAID mke2fs -j /dev/md5và gắn kết nó ở đâu đó.
  7. Sao chép tập tin vào ổ đĩa. Điều này nên được thực hiện với một kết nối mạng tốt. Có thể có một cách thông minh hơn để ghi nội dung tệp trực tiếp vào thiết bị khối có thể được thực hiện cục bộ nhưng vì nội dung tệp được trộn với siêu dữ liệu của hệ thống tệp nên tôi không biết cách thực hiện.

Bây giờ bạn có thể ngắt kết nối thiết bị khối mạng. Điều này dẫn đến RAID-1 xuống cấp ở cả hai bên. Nếu bạn muốn đồng bộ hóa, bạn phải: 1. ngắt kết nối và nạp RAID trên hệ thống mà bạn đồng bộ hóa thành 2. thiết lập lại nbd 3. thêm nóng nbd vào RAID trên hệ thống nguồn đồng bộ hóa.

Sau đó cả hai thiết bị khối sẽ được đồng bộ hóa. Nhưng do bitmap, hệ thống nguồn biết mà không cần phải đọc ở phía bên kia dữ liệu nào phải được chuyển.

các vấn đề

F * ck. Bây giờ tôi đã viết tất cả những gì tôi nhận ra rằng điều này không hoạt động (tốt) với những thay đổi ở cả hai bên (cho các khu vực khác nhau). Nó có thể hoạt động nếu bạn sử dụng --buildthay vì --create(cho phép bạn giả vờ rằng trên cả hai máy chủ, thiết bị khối cục bộ là thiết bị chính).

Tùy thuộc vào cách bạn muốn thay đổi theo cả hai hướng được xử lý, bạn có thể thử tạo bản sao lưu của tệp bitmap (khi cả hai RAID bị dừng!) Và chỉ chạy đồng bộ theo cả hai hướng. Hoặc (nếu bạn chỉ muốn viết thay đổi theo một hướng), thậm chí tệ hơn, bạn chạy đồng bộ hóa, dừng RAID, thay thế bitmap cục bộ bằng từ xa và đồng bộ hóa lại (và đồng bộ hóa các tệp bitmap sau đó). Điều đó hứa hẹn sẽ rất vui.

Ảnh chụp nhanh LVM

Một cái gì đó tương tự có thể được thực hiện với ảnh chụp nhanh LVM.

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.