cải thiện hiệu suất sao lưu rsync


8

Các kỹ thuật tốt nhất để cải thiện rsync trên ssh phản chiếu giữa các hộp unix là gì, giả sử rằng một hệ thống sẽ luôn có bản sao chính và hệ thống khác sẽ luôn có một bản sao gần đây (dưới 48 giờ)

Ngoài ra, người ta sẽ phải làm gì để mở rộng phương pháp tiếp cận đó để xử lý hàng tá máy móc có được những thay đổi đó?

Câu trả lời:


6

Nếu :

  • Thời gian sửa đổi các tập tin của bạn là đúng
  • Các tập tin không thực sự lớn
  • Không thể bỏ qua đẩy (hoặc có một số loại xử lý tồn đọng)

Bạn có thể sử dụng find -ctimehoặc file -cnewerđể tạo một danh sách các tệp đã thay đổi kể từ lần thực hiện cuối cùng và chỉ sao chép các tệp đã sửa đổi (Chỉ cần một cú đẩy khác biệt được tôn vinh).

Điều này tự dịch khá độc đáo cho nhiều máy chủ: chỉ cần thực hiện một tar khác biệt trên nguồn và gỡ nó trên tất cả các máy chủ.

Nó cung cấp cho bạn một cái gì đó như thế:

find -type f -cnewer /tmp/files_to_send.tar.gz > /tmp/files_to_send.txt
tar zcf /tmp/files_to_send.tar.gz --files-from /tmp/files_to_send.txt 
for HOST in host1 host2 host3 ...
do
    cat /tmp/files_to_send.tar.gz | ssh $HOST "tar xpf -"
done

Kịch bản đã được tinh chỉnh, nhưng bạn có ý tưởng.


Rất tiếc: một cách sử dụng mèo vô dụng khác :-)
Steve Schnepp

Trên thực tế, điều này có thể được thực hiện gần như chính xác như thế này; giả sử các quyền hạn sẽ ổn với việc thêm quyền này để chạy ngay sau các tập lệnh duy trì các tệp dữ liệu
sal

4

Giả sử rằng dữ liệu bạn đang kết nối chưa được nén, bật tính năng nén (-z) sẽ giúp truyền tốc độ, với chi phí của một số CPU ở hai đầu.


nén đã được bật thông qua ssh
sal

3
Nén qua rsync thường hiệu quả hơn nén trong đường hầm SSH. Lý do là rsync có nhiều kiến ​​thức hơn và có thể tận dụng lợi thế của nó. Ví dụ, nén của nó có thể tham chiếu các phần của tệp không được chuyển.
derobert

5
@derobert chuyển nén từ ssh sang rsync cải thiện hiệu suất gần 20%
sal

2

Nếu bạn đang truyền các tệp rất lớn với nhiều thay đổi, hãy sử dụng các tùy chọn --inplace và --whole-file, tôi sử dụng các tệp này cho hình ảnh VM 2Gb của mình và nó giúp ích rất nhiều (chủ yếu là giao thức rsync không hoạt động nhiều với việc truyền dữ liệu gia tăng với các tệp này). Tôi không đề nghị các tùy chọn này cho hầu hết các trường hợp mặc dù.

sử dụng --stats để xem các tệp của bạn được truyền tốt như thế nào bằng giao thức gia tăng rsync.


2

Một chiến lược khác là làm cho ssh và rsync nhanh hơn. Nếu bạn đang truy cập một mạng đáng tin cậy (đọc: riêng tư), thì việc mã hóa tải trọng thực tế là không cần thiết. Bạn có thể sử dụng ssh HPN . Phiên bản này của ssh chỉ mã hóa xác thực. Ngoài ra, rsync phiên bản 3 bắt đầu chuyển tệp trong khi xây dựng danh sách tệp. Tất nhiên đây là một khoản tiết kiệm thời gian rất lớn so với phiên bản rsync 2. Tôi không biết đó có phải là thứ bạn đang tìm kiếm hay không, nhưng tôi hy vọng nó có ích. Ngoài ra, rsync không hỗ trợ phát đa hướng theo một cách nào đó, mặc dù tôi sẽ không giả vờ hiểu làm thế nào.


Quay trở lại một số năm trước, khi tôi đang sử dụng các hệ thống có bộ xử lý chậm hơn nhiều, tôi đã điểm chuẩn tất cả các phương pháp nén OpenSSH có sẵn và vượt qua "arcfour" là nhanh nhất. Điều đó, kết hợp với bật khung hình khổng lồ nếu sử dụng gig-e, kết thúc cải thiện đáng kể tốc độ truyền.
Derek Pressnall

2

Khi bạn kết nối như một phương thức sao lưu, vấn đề lớn nhất bạn sẽ gặp phải là nếu bạn có nhiều tệp bạn đang sao lưu. Rsync có thể xử lý các tệp lớn mà không gặp sự cố nhưng nếu số lượng tệp bạn đang sao lưu quá lớn thì bạn sẽ thấy rằng rsync sẽ không hoàn thành trong một khoảng thời gian hợp lý. Nếu điều này xảy ra, bạn sẽ cần chia bản sao lưu thành các phần nhỏ hơn và sau đó lặp qua các phần đó, vd

find /home -mindepth 1 -maxdepth 1 -print0 | xargs -0 -n 1 -I {} -- rsync -a -e ssh {} backup@mybackupserver:/backup/

hoặc bỏ tập tin xuống để giảm số lượng tập tin.

Đối với việc có hàng tá máy móc phản ánh những thay đổi đó, nó phụ thuộc vào mức độ mới của bản sao lưu. Một cách tiếp cận là phản ánh các thay đổi từ máy chủ chính sang máy chủ dự phòng và sau đó các máy chủ khác rút các thay đổi của chúng khỏi máy chủ dự phòng bằng một daemon rsync trên máy chủ sao lưu ban đầu và sau đó lên lịch cho các máy chủ khác kéo nhẹ thời gian khác nhau hoặc bằng cách sử dụng tập lệnh sử dụng ssh không mật khẩu để kết nối với từng máy chủ và bảo họ lấy một bản sao lưu mới giúp ngăn chặn máy chủ sao lưu ban đầu của bạn - nhưng liệu bạn có gặp phải nhiều rắc rối hay không trên bao nhiêu máy khác mà bạn đã lấy một bản sao lưu.


Bạn có biết sự khác biệt giữa: for f in /Backup/*.bak; làm rsync -e ssh $ f sao lưu @ mybackupserver; đã hoàn thành và rsync -re ssh /Backup/*.bak sao lưu @ mybackupserver?
Osama ALASSIRY

Đối với tôi, sự khác biệt chỉ là cái đầu tiên sẽ chạy rsync cho mỗi tệp .bak (giả sử * .bak chỉ là các tệp phù hợp) trong thư mục / Sao lưu / trong khi thứ hai sẽ chạy một rsync để chuyển tất cả chúng. Nếu * .bak có nghĩa là khớp với các thư mục, thì thư mục đầu tiên sẽ không lặp lại trong các thư mục con (giả sử rằng bạn đã rời khỏi mục đích -r). Nói chung, bạn sẽ muốn làm cái thứ hai chứ không phải cái thứ nhất cho đến khi bạn có quá nhiều tệp để nó xử lý độc đáo.
Rodney Amato

1
Xin lưu ý rằng việc sử dụng ngoại hình để lặp qua các thư mục hoặc tệp nói chung không phải là một ý tưởng hay. Nó sẽ phá vỡ khủng khiếp nếu nó chạm vào một thư mục hoặc tệp có khoảng trắng trong đó.
Nathan

@Nathan, vậy thì find /Backup/ -name '*.bak' -print0 | xargs -0 -n 1 rsync -e sshsao?
kêu

Tôi đã cập nhật ví dụ để sử dụng phương pháp xargs. Tôi chưa bao giờ phải tự làm việc này vì tôi chưa bao giờ có một thư mục bên dưới / nhà có một khoảng trống trong đó nhưng chúng ta nên có ví dụ tốt nhất ở đó.
Rodney Amato

2

rsync có cách thực hiện các bản sao bị ngắt kết nối . Nói cách khác, rsync có thể (theo lý thuyết) diff một cây thư mục và tạo ra một bản vá tập tin mà bạn rồi sau đó có thể áp dụng trên mọi số lượng file được trùng với nguồn gốc.

Nó yêu cầu bạn gọi rsync với chủ và nhân với --write-batch; nó tạo ra một tập tin Sau đó, bạn chuyển tệp này sang bất kỳ số lượng mục tiêu nào khác và sau đó bạn áp dụng lô cho từng mục tiêu đó bằng cách sử dụng --read-batch.

Nếu bạn giữ một bản sao cục bộ của trạng thái rsynced cuối cùng (tức là bản sao của các gương trông giống như bây giờ) trên cùng một máy với chủ, bạn có thể tạo "bản vá" này trên bản gốc mà không cần liên hệ với bất kỳ gương nào:

Về chủ:

rsync --write-batch=my-batch.rsync /master/data /current/mirror

Thêm bất cứ lựa chọn nào khác mà bạn muốn. Điều này sẽ làm hai việc:

  1. Nó sẽ /current/mirrorthay đổi để phản ánh/master/data
  2. Nó sẽ tạo một tệp vá nhị phân (hoặc tệp bó) được gọi my-batch.rsyncđể sử dụng sau.

Chuyển my-batch.rsynctệp từ bản gốc sang tất cả các gương của bạn, rồi trên gương, áp dụng bản vá để nói:

rsync --read-batch=my-batch.rsync /local/mirror

Lợi ích của phương pháp này:

  • chủ nhân không bị đầm lầy
  • không cần phối hợp / có quyền truy cập vào máy chủ / gương cùng một lúc
  • những người khác nhau với các đặc quyền khác nhau có thể thực hiện công việc trên chủ và gương.
  • không cần phải có kênh TCP (ssh, netcat, bất cứ điều gì; tệp có thể được gửi qua e-mail ;-))
  • gương ngoại tuyến có thể được đồng bộ hóa sau (chỉ cần mang chúng trực tuyến và áp dụng bản vá)
  • tất cả các gương được đảm bảo giống hệt nhau (vì chúng áp dụng cùng một "miếng vá")
  • tất cả các gương có thể được cập nhật đồng thời (vì --read-batchchỉ cpu / io chuyên sâu trên chính gương)
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.