Đồng bộ hóa cấu trúc thư mục rất lớn


14

Chúng tôi có cấu trúc thư mục trên mạng nội bộ của chúng tôi chứa khoảng 800.000 tệp được chia thành khoảng 4.000 thư mục. Chúng tôi cần đồng bộ hóa điều này với một cụm máy nhỏ trong DMZ của chúng tôi. Độ sâu của cấu trúc rất nông (nó không bao giờ vượt quá hai cấp độ sâu).

Hầu hết các tệp không bao giờ thay đổi, mỗi ngày có một vài nghìn tệp được cập nhật và 1-2 nghìn tệp mới. Dữ liệu là dữ liệu báo cáo lịch sử được duy trì trong đó dữ liệu nguồn đã bị xóa (tức là đây là các báo cáo được hoàn thiện mà dữ liệu nguồn đã đủ cũ để chúng tôi lưu trữ và xóa dữ liệu đó). Đồng bộ hóa một lần mỗi ngày là đủ để nó có thể xảy ra trong một khung thời gian hợp lý. Báo cáo được tạo qua đêm và chúng tôi đồng bộ hóa điều đầu tiên vào buổi sáng như một nhiệm vụ theo lịch trình.

Rõ ràng vì rất ít các tập tin thay đổi một cách thường xuyên, chúng tôi có thể hưởng lợi rất nhiều từ bản sao tăng dần. Chúng tôi đã thử Rupync, nhưng có thể mất đến tám đến mười hai giờ chỉ để hoàn thành thao tác "danh sách tệp xây dựng". Rõ ràng là chúng tôi đang nhanh chóng vượt xa khả năng của rsync (khung thời gian 12 giờ là quá dài).

Chúng tôi đã sử dụng một công cụ khác có tên RepliWeb để đồng bộ hóa các cấu trúc và nó có thể thực hiện chuyển khoản gia tăng trong khoảng 45 phút. Tuy nhiên, dường như chúng tôi đã vượt quá giới hạn, nó đã bắt đầu thấy các tệp hiển thị dưới dạng xóa khi chúng không hoạt động (có thể một số cấu trúc bộ nhớ trong đã cạn kiệt, chúng tôi không chắc chắn).

Có ai khác chạy vào một dự án đồng bộ hóa quy mô lớn của loại này? Có một cái gì đó được thiết kế để xử lý các cấu trúc tệp lớn như thế này để đồng bộ hóa?


Bạn đã thử chia nhỏ công việc qua nhiều phiên bản rsync đang chạy cùng một lúc chưa? Tôi không có một hình ảnh thực sự tốt về cấu trúc thư mục nhưng bạn có thể chia nó theo tên thư mục hoặc tên tệp.
Ly hợp

Chúng tôi đã nghĩ về điều đó, nhưng với cấu trúc phẳng như vậy, thật khó để tìm ra những đường phân chia tốt để phân chia công việc. Điều này phức tạp bởi thực tế là các thư mục được đặt tên rất giống nhau (có một quy ước đặt tên khiến hầu hết các thư mục bắt đầu với cùng một bộ 6 ký tự ban đầu).
MightyE

Bạn đã bao giờ tìm thấy một giải pháp tốt, Dave? Tôi đang xem xét lsyncd cho một thư mục với 65535 thư mục con, mỗi thư mục có thể có 65 ^ 16 tệp.
Mike Diehn

1
@MikeDiehn Tôi chưa bao giờ tìm thấy một công cụ mà tôi hoàn toàn hài lòng ở đây. Chúng tôi đã có công cụ RepliWeb độc quyền đó để sửa lỗi trong đó họ thấy các tệp là xóa mà không phải, đó là một cấu trúc bên trong bị tràn. Tôi đã rời bỏ công việc đó nhiều năm trước, tôi cho rằng họ vẫn đang sử dụng nó. Đối với mục đích của bạn, nếu thư mục của bạn được phân phối hợp lý, bạn có thể đi với một cái gì đó như giải pháp của Ryan. Nó sẽ không nhận thấy xóa cấp cao nhất, nhưng 65535 thư mục con gợi ý cho tôi rằng bạn có thể không có chúng.
MightyE

Câu trả lời:


9

Nếu bạn có thể tin tưởng vào dấu thời gian được sửa đổi lần cuối của hệ thống tệp, bạn có thể tăng tốc mọi thứ bằng cách kết hợp Rsync với tiện ích 'find' UNIX / Linux. 'find' có thể tập hợp một danh sách tất cả các tệp hiển thị thời gian được sửa đổi lần cuối trong ngày hôm qua, sau đó chuyển CHỈ danh sách các tệp / thư mục được rút ngắn thành Rupync. Điều này nhanh hơn nhiều so với việc Rupync so sánh siêu dữ liệu của mỗi tệp trên người gửi so với máy chủ từ xa.

Nói tóm lại, lệnh sau sẽ thực thi CHỈ CÓ trên danh sách các tệp và thư mục đã thay đổi trong 24 giờ qua: (Rupync sẽ KHÔNG bận tâm kiểm tra bất kỳ tệp / thư mục nào khác.)

find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.

Trong trường hợp bạn không quen với lệnh 'find', nó sẽ đệ quy thông qua một cây con thư mục cụ thể, tìm kiếm các tệp và / hoặc thư mục đáp ứng bất kỳ tiêu chí nào bạn chỉ định. Ví dụ: lệnh này:

find . -name '\.svn' -type d -ctime -0 -print

sẽ bắt đầu trong thư mục hiện tại (".") và lặp lại qua tất cả các thư mục con, tìm kiếm:

  • bất kỳ thư mục nào ("-type d"),
  • được đặt tên là ".svn" ("-name '.svn'"),
  • với siêu dữ liệu được sửa đổi trong 24 giờ qua ("-ctime -0").

Nó in tên đường dẫn đầy đủ ("-print") của bất kỳ thứ gì phù hợp với các tiêu chí đó trên đầu ra tiêu chuẩn. Các tùy chọn '-name', '-type' và '-ctime' được gọi là "tests" và tùy chọn '-print' được gọi là "hành động". Trang hướng dẫn 'tìm' có một danh sách đầy đủ các bài kiểm tra và hành động.

Nếu bạn muốn thực sự khéo léo, bạn có thể sử dụng thử nghiệm 'tìm kiếm' lệnh 'tìm kiếm', thay vì 'thời gian' để làm cho quá trình này trở nên dễ chịu và linh hoạt hơn. '-cnewer' kiểm tra xem mỗi tệp / thư mục trong cây có siêu dữ liệu được sửa đổi gần đây hơn một số tệp tham chiếu hay không. Sử dụng 'touch' để tạo tệp tham chiếu của NEXT chạy vào đầu mỗi lần chạy, ngay trước khi 'find ... | Lệnh rsync ... 'thực thi. Đây là cách thực hiện cơ bản:

#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file

Kịch bản lệnh này tự động biết khi nào nó được chạy lần cuối và nó chỉ chuyển các tệp được sửa đổi kể từ lần chạy cuối cùng. Mặc dù điều này phức tạp hơn, nhưng nó bảo vệ bạn trước các tình huống mà bạn có thể đã bỏ lỡ khi chạy công việc trong hơn 24 giờ, do thời gian chết hoặc một số lỗi khác.


Đây là một giải pháp cực kỳ thông minh! Tôi đang nghĩ bạn có nghĩa là touch $next_ref_filecuối cùng? Nó sẽ khiến chúng ta không có khả năng đối phó với các đường dẫn đã bị xóa (ngay cả những báo cáo lưu trữ tĩnh này cuối cùng cũng đủ cũ để chúng được lưu trữ và xóa). Đó có thể không phải là một điểm dừng chương trình mặc dù.
MightyE

Tôi đang tìm thấy mặc dù chỉ find . -ctime 0là khá chậm trên cấu trúc thư mục này (vẫn đang chờ nó hoàn thành để báo cáo thời gian của nó). Điều đó thực sự làm tôi thất vọng một chút vì có vẻ như đây có thể là một hoạt động cấp thấp khá có thể đặt ra thanh công việc nhanh nhất mà chúng tôi mong đợi công việc này sẽ hoàn thành. Có thể trường hợp đĩa I / O là yếu tố giới hạn ở đây.
MightyE

Đối với scriptlet đó, vâng, tôi đã phạm sai lầm. Tôi có nghĩa là chạy 'chạm' vào 'next_Vf_file' (KHÔNG phải 'current_Vf_file') ngay trước khi chạy 'find ... | lệnh rsync ... '. (Tôi sẽ sửa câu trả lời của mình.)
Ryan B. Lynch

3
Đối với lệnh 'find' chậm: Bạn đang sử dụng loại hệ thống tập tin nào? Nếu bạn đang sử dụng Ext3, bạn có thể muốn xem xét hai điều chỉnh FS: 1) Chạy 'Tune2fs -O dir_index <DEVICE_NODE>' để bật tính năng 'dir_index' của Ext3, để tăng tốc độ truy cập vào các thư mục có số lượng tệp lớn. 2) Chạy 'mount -o remount, noatime, gật đầu' để tắt cập nhật thời gian truy cập, giúp tăng tốc độ đọc, nói chung. 'dumpe2fs -h <DEVICE_NODE> | grep dir_index 'cho bạn biết nếu' dir_index 'đã được bật (trên một số bản phát hành, đó là mặc định) và' mount | grep <DEVICE_NODE> 'cho bạn biết về cập nhật thời gian truy cập.
Ryan B. Lynch

Đáng buồn thay, đó là NTFS - Windows 2003 Server sử dụng Cygwin cho lệnh find. Tôi sẽ nhớ các tùy chọn điều chỉnh đó (lời khuyên tuyệt vời) cho ext3 trong trường hợp chúng tôi từng gặp phải điều gì đó tương tự trên một trong các cụm Debian của chúng tôi.
MightyE

7

Hãy thử unison , nó được thiết kế đặc biệt để giải quyết vấn đề này bằng cách giữ các danh sách thay đổi (danh sách tệp xây dựng), cục bộ cho từng máy chủ, tăng tốc thời gian để tính toán delta và giảm số lượng được gửi qua dây sau đó.


Tôi đang thử Unison. Hiện tại, nó đã chạy được khoảng 2 giờ ở giai đoạn "Tìm kiếm thay đổi" và dựa trên các tệp mà nó hiện đang hoạt động, có vẻ như đã hoàn thành được một nửa (vì vậy có thể tổng cộng 4 giờ trước khi bắt đầu chuyển). Có vẻ như nó sẽ tốt hơn rsync, nhưng vẫn nằm ngoài cửa sổ hoạt động mong muốn của chúng tôi.
MightyE

2
Lần đầu tiên bạn tạo một chỉ mục ở cả hai bên, thời gian xây dựng lại tương tự như rsync vì nó phải băm từng tệp. Khi điều này được thực hiện, unison sử dụng thời gian sửa đổi cuối cùng của thư mục để xác định khi nào một tệp đã thay đổi và chỉ phải quét tệp đó để thay đổi.
Dave Cheney

Đáng buồn thay, tôi là nạn nhân của một quản trị viên hoạt động quá nhiệt tình, người đã kết thúc phiên của tôi trước khi danh mục được hoàn thành (chúng tôi giới hạn số lượng đăng nhập đồng thời vào các máy chủ sản xuất). Tôi đã mất tiến độ đã đạt được khi xây dựng danh mục ban đầu, vì vậy tôi phải bắt đầu lại từ đầu. Tôi sẽ cho bạn biết làm thế nào nó đi.
MightyE

Mất khoảng 2 giờ để danh mục ban đầu được xây dựng để quét các thay đổi. Tôi khá ngạc nhiên khi Unison sử dụng bao nhiêu RAM cho việc này. Đối với bộ sưu tập tệp của chúng tôi, máy chủ nguồn đang sử dụng 635M và máy khách từ xa đang sử dụng 366M. Để đồng bộ hóa một số máy trong một cụm sẽ là một dấu chân khá lớn, đặc biệt là đối với máy chủ nguồn!
MightyE

1
Bạn có thể cấu trúc dữ liệu của mình theo cách giúp dễ dàng xác định dữ liệu đã thay đổi gần đây không? Tức là, lưu trữ nó ở định dạng năm / tháng / ngày / ...?
Dave Cheney


2

Nếu bạn đang sử dụng công tắc -z trên rsync, hãy thử chạy mà không có nó. Vì một số lý do, tôi đã thấy điều này tăng tốc ngay cả việc liệt kê các tập tin ban đầu.


Chúng tôi đã thử với và không có cờ -z. Nó dường như không có tác động đến thời gian thực hiện "danh sách tập tin xây dựng".
MightyE

2

Việc rút -z ra khỏi lệnh rsync không nén được khiến "danh sách tệp nhận" đi nhanh hơn rất nhiều và chúng tôi phải chuyển khoảng 500 GB. Trước khi nó mất một ngày với công tắc -z.

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.