Tùy chọn để đồng bộ hóa hiệu quả 1 triệu tệp với máy chủ từ xa?


27

Tại một công ty tôi làm việc cho chúng tôi có một thứ gọi là "danh sách phát" là các tệp nhỏ ~ 100-300 byte mỗi tệp. Có khoảng một triệu người trong số họ. Khoảng 100.000 trong số họ được thay đổi mỗi giờ. Các danh sách phát này cần được tải lên 10 máy chủ từ xa khác trên các lục địa khác nhau mỗi giờ và nó cần diễn ra nhanh chóng trong vòng dưới 2 phút lý tưởng. Điều rất quan trọng là các tệp bị xóa trên bản gốc cũng bị xóa trên tất cả các bản sao. Chúng tôi hiện đang sử dụng Linux cho cơ sở hạ tầng của chúng tôi.

Tôi đã suy nghĩ về việc thử rsync với tùy chọn -W để sao chép toàn bộ tệp mà không so sánh nội dung. Tôi chưa thử nhưng có lẽ những người có nhiều kinh nghiệm hơn với rsync có thể cho tôi biết nếu đó là một lựa chọn khả thi?

Những lựa chọn khác là đáng xem xét?

Cập nhật: Tôi đã chọn tùy chọn lsyncd làm câu trả lời nhưng chỉ vì nó là phổ biến nhất. Các lựa chọn thay thế được đề xuất khác cũng có giá trị theo cách riêng của họ.


1
Bạn có nhật ký cho biết tập tin nào đã bị thay đổi hoặc bị xóa không?
Oliver

3
Nếu chỉ có danh sách phát là bản ghi mysql. Sau đó, bạn có thể sử dụng sao chép cơ sở dữ liệu và nhận mysql để tìm ra những gì cần gửi / nhận.
Matt

@oliver chúng tôi làm. Tuy nhiên, sau đó bạn cần tin tưởng rằng nhật ký đó có nghĩa là mã tạo ra nó phải chính xác và sau đó bạn cần mã tùy chỉnh để xử lý nhật ký đó cũng cần phải chính xác. Tôi muốn tránh sử dụng mã xây dựng trong nhà để làm điều đó đối với một cái gì đó đã được cộng đồng thử nghiệm rộng rãi.
Zilvinas

Bạn có muốn thay đổi chỉ được áp dụng mỗi giờ? Hoặc là nhân rộng ngay lập tức cũng được chấp nhận?
mạo

1
Đừng đánh giá thấp thời gian rsync cần để hoạt động thông qua một triệu tệp. Chỉ cần thử nó và bạn sẽ thấy những gì bạn đang làm. Nếu bạn có nhật ký đó, hãy sử dụng nó hoặc thử bất kỳ giải pháp nào được đề xuất.
Oliver

Câu trả lời:


39

Vì cập nhật tức thì cũng được chấp nhận, bạn có thể sử dụng lsyncd .
Nó xem các thư mục (inotify) và sẽ rsyncthay đổi thành nô lệ.
Khi khởi động, nó sẽ thực hiện đầy đủ rsync, do đó sẽ mất một thời gian, nhưng sau đó chỉ có những thay đổi được truyền đi.
Có thể xem đệ quy các thư mục, nếu máy chủ nô lệ ngừng hoạt động, đồng bộ hóa sẽ được thử lại cho đến khi nó quay trở lại.

Nếu đây là tất cả trong một thư mục (hoặc một danh sách tĩnh các thư mục), bạn cũng có thể sử dụng incron .
Hạn chế ở đây là nó không cho phép xem đệ quy các thư mục và bạn cần tự thực hiện chức năng đồng bộ hóa.


Lại một mẹo tuyệt vời :)
Zilvinas

1
+1 Đây thực chất là một vấn đề liên kết bộ nhớ cache, màn hình đẩy các thay đổi là giải pháp dễ nhất. lsyncdthực hiện rằng ...
Chris S

1
Tôi sẽ điều tra lsyncdinotifysâu sắc như áp dụng cho hệ điều hành máy chủ cụ thể của bạn. Có giới hạn về số lượng đồng hồ inotify có sẵn. Tôi tin rằng mặc định là khoảng 1500 hoặc 8000 tùy thuộc vào phiên bản Linux cụ thể của bạn. Hầu hết các hạt nhân cho phép bạn tăng giới hạn, nhưng giám sát 1 triệu tệp có thể nhiều hơn là thực tế. Nó không hoạt động với tôi trong năm 2008. Ngoài ra, hàng đợi sự kiện inotify có thể tràn ra khiến bạn mất các sự kiện và bạn cần có cách để phục hồi từ đó. Việc lsyncdtriển khai được điều chỉnh cẩn thận cộng với việc hàng ngày rsynccó thể hoạt động ngay trong năm 2012 để trang trải các căn cứ của bạn.
Old Pro

2
Trên thực tế, nó không có iontifytrong thư mục chứ không phải các tệp riêng lẻ. Bạn có thể xem bao nhiêu thư mục? Kiểm tra /proc/sys/fs/inotify/max_user_watches(thường là 8192).
mạo

2
Với ~ 50k thư mục inotify sẽ có thể không có quy mô tốt. Khi chúng tôi thử một cách tiếp cận tương tự vào năm 2009 với các thư mục 100k, phải mất nhiều thời gian để đăng ký vào tất cả các thư mục. Đối với @OldPro, nó không hoạt động với chúng tôi.
neovatar

11

Xem xét sử dụng một hệ thống tập tin phân tán, chẳng hạn như GlusterFS . Được thiết kế với mục đích nhân rộng và song song, GlusterFS có thể mở rộng tới 10 máy chủ trơn tru hơn nhiều so với các giải pháp đặc biệt liên quan đến inotify và rsync.

Đối với trường hợp sử dụng cụ thể này, người ta có thể xây dựng khối lượng GlusterFS 10 máy chủ gồm 10 bản sao (tức là 1 bản sao / cục gạch trên mỗi máy chủ), để mỗi bản sao sẽ là một bản sao chính xác của mọi bản sao khác trong khối lượng. GlusterFS sẽ tự động tuyên truyền các bản cập nhật hệ thống tập tin cho tất cả các bản sao.

Khách hàng ở mỗi vị trí sẽ liên hệ với máy chủ cục bộ của họ, vì vậy việc đọc quyền truy cập vào tệp sẽ nhanh chóng. Câu hỏi chính là liệu độ trễ ghi có thể được giữ ở mức chấp nhận thấp hay không. Cách duy nhất để trả lời đó là thử nó.


+1 cho Glusterfs
Tom O'Connor

8

Tôi nghi ngờ rsyncsẽ làm việc này theo cách thông thường, bởi vì quét một triệu tệp và so sánh nó với hệ thống từ xa 10 lần sẽ mất nhiều thời gian. Tôi sẽ cố gắng thực hiện một hệ thống với một cái gì đó giống như inotifygiữ một danh sách các tệp đã sửa đổi và đẩy chúng đến các máy chủ từ xa (nếu những thay đổi này không được ghi lại theo cách khác). Sau đó, bạn có thể sử dụng danh sách này để nhanh chóng xác định các tệp cần chuyển - thậm chí có thể với rsync (hoặc tốt hơn 10 trường hợp song song của nó).

Chỉnh sửa: Với một chút công việc, bạn thậm chí có thể sử dụng phương pháp theo dõi inotify / log này để sao chép các tập tin ngay khi sửa đổi xảy ra.


5

Một số lựa chọn khác:

  • Chèn một công việc vào RabbitMQ hoặc Gearman để tắt không đồng bộ và xóa (hoặc thêm) cùng một tệp trên tất cả các máy chủ từ xa bất cứ khi nào bạn xóa hoặc thêm một tệp trên máy chủ chính.
  • Lưu trữ các tệp trong cơ sở dữ liệu và sử dụng bản sao để giữ cho các máy chủ từ xa được đồng bộ hóa.
  • Nếu bạn có ZFS, bạn có thể sử dụng bản sao ZFS .
  • Một số SAN có sao chép tập tin. Tôi không biết nếu điều này có thể được sử dụng qua Internet.

4

Đây có vẻ là một trường hợp sử dụng sách truyện lý tưởng cho MongoDB và có thể là GridFS . Vì các tệp tương đối nhỏ, chỉ riêng MongoDB là đủ, mặc dù có thể thuận tiện khi sử dụng API GridFS.

MongoDB là một cơ sở dữ liệu nosql và GridFS là một bộ lưu trữ tệp được xây dựng trên nó. MongoDB có rất nhiều tùy chọn tích hợp để nhân rộngshending , vì vậy nó sẽ mở rộng rất tốt trong trường hợp sử dụng của bạn.

Trong trường hợp của bạn, bạn có thể sẽ bắt đầu với một bộ bản sao bao gồm chủ nằm trong trung tâm dữ liệu chính của bạn (có thể là thứ hai, trong trường hợp bạn muốn chuyển đổi dự phòng trên cùng một vị trí) và mười "nô lệ" của bạn được phân phối trên toàn thế giới. Sau đó thực hiện kiểm tra tải để kiểm tra xem hiệu suất ghi có đủ không và kiểm tra thời gian sao chép vào các nút của bạn. Nếu bạn cần nhiều hiệu suất hơn, bạn có thể biến thiết lập thành một phân đoạn (chủ yếu để phân phối tải ghi cho nhiều máy chủ hơn). MongoDB đã được thiết kế với việc mở rộng các thiết lập khổng lồ với phần cứng "giá rẻ", vì vậy bạn có thể ném vào một loạt các máy chủ rẻ tiền để cải thiện hiệu suất.


0

Tôi sẽ sử dụng một Phần cuối S3 và sau đó chỉ cần gắn nó trên tất cả các máy chủ mà tôi cần - Bằng cách đó, mọi người đều đồng bộ ngay lập tức


Mặc dù bộ nhớ sẽ được đồng bộ hóa, bạn phải thông báo cho ứng dụng, vì vậy bạn sẽ quay lại quảng trường hoặc ứng dụng sẽ phải thăm dò bộ nhớ mỗi khi có ai đó truy cập vào danh sách phát này. Hiệu suất sẽ là khủng khiếp trong cả hai trường hợp.
Chris S

Ứng dụng không cần phải thăm dò bộ nhớ mỗi khi ai đó truy cập vào danh sách phát, chỉ cần đủ thời gian trong giờ để đảm bảo ứng dụng đang chạy mà không có dữ liệu cũ. Ngoài ra, nếu S3 được sử dụng làm phụ trợ, tại sao ứng dụng cần phải thăm dò các tệp ở vị trí đầu tiên? Họ sẽ luôn được cập nhật
Mister IT Guru

0

Một tùy chọn dường như chưa được đề cập đến là lưu trữ tất cả các tệp vào một tệp nén. Điều này sẽ làm giảm đáng kể tổng kích thước và loại bỏ tất cả chi phí bạn có được khi xử lý hàng triệu tệp riêng lẻ. Bằng cách thay thế toàn bộ tập tin trong một bản cập nhật lớn, bạn cũng có thể yên tâm rằng các tệp đã xóa được xóa trên bản sao.

Nhược điểm tất nhiên là bạn đang chuyển nhiều tệp không cần thiết. Điều đó có thể hoặc không thể được cân bằng bởi kích thước giảm nhờ nén. Ngoài ra tôi không biết sẽ mất bao lâu để nén nhiều tệp đó.

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.