2009-06-03 40 views
12

chúng tôi đang thiết kế kiến ​​trúc tìm kiếm cho ứng dụng web của công ty. Chúng tôi sẽ sử dụng Lucene.net cho việc này. Các chỉ mục sẽ không lớn (khoảng 100.000 tài liệu), nhưng dịch vụ tìm kiếm phải luôn được cập nhật và luôn được cập nhật. Sẽ có các tài liệu mới được thêm vào chỉ mục tất cả thời gian và tìm kiếm đồng thời. Vì chúng ta phải có sẵn sàng cao cho hệ thống tìm kiếm, chúng tôi có 2 máy chủ ứng dụng hiển thị dịch vụ WCF để thực hiện tìm kiếm và lập chỉ mục (bản sao dịch vụ đang chạy trong mỗi máy chủ). Máy chủ sau đó sử dụng API lucene.net để truy cập vào các chỉ mục.Đồng bộ hóa các chỉ mục Lucene.net trên nhiều máy chủ ứng dụng

Vấn đề là, giải pháp nào tốt nhất để giữ cho các chỉ mục đồng bộ hóa mọi lúc? Chúng tôi đã xem xét một vài lựa chọn:

  • Sử dụng một máy chủ cho chỉ mục và có quyền truy cập máy chủ thứ 2 là chỉ qua SMB: không thể làm bởi vì chúng tôi có một điểm duy nhất của thất bại tình hình;

  • Lập chỉ mục cho cả hai máy chủ, về cơ bản viết mọi chỉ mục hai lần: có thể hiệu suất tệ hại và khả năng hủy bỏ nếu ví dụ. máy chủ 1 chỉ mục OK và máy chủ 2 chạy ra khỏi không gian đĩa hoặc bất cứ điều gì;

  • Sử dụng SOLR hoặc KATTA để truy cập vào các chỉ mục: không, chúng tôi không thể có tomcat hoặc chạy tương tự trên máy chủ, chúng tôi chỉ có IIS.

  • Lưu trữ chỉ mục trong cơ sở dữ liệu: Tôi thấy điều này có thể được thực hiện với phiên bản java của Lucene (mô-đun JdbcDirectory), nhưng tôi không thể tìm thấy bất kỳ điều gì tương tự cho Lucene.net. Ngay cả khi nó có nghĩa là một hit hiệu suất nhỏ, chúng tôi sẽ đi cho tùy chọn này bởi vì nó sẽ giải quyết vấn đề đồng thời và đồng bộ hóa với sự phát triển mininum.

  • Sử dụng Lucene.net Mô-đun phân phối tìm kiếm phân phối: Tôi không thể gửi liên kết đơn với tài liệu về điều này. Tôi thậm chí không biết bằng cách nhìn vào mã những gì mã này không, nhưng có vẻ như với tôi rằng nó thực sự chia tách chỉ mục trên nhiều máy, mà không phải là những gì chúng ta muốn.

  • rsync và bạn bè, sao chép chỉ mục qua lại giữa 2 máy chủ: điều này cảm thấy bị hack và dễ bị lỗi, và nếu chỉ số phát triển lớn, có thể mất một thời gian, và trong thời gian này, chúng tôi sẽ trả về dữ liệu bị hỏng hoặc không nhất quán cho khách hàng, vì vậy chúng tôi phải phát triển một số chính sách khóa quảng cáo, mà chúng tôi không muốn.

Tôi hiểu đây là một vấn đề phức tạp, nhưng tôi chắc chắn rất nhiều người đã phải đối mặt với nó trước đây. Bất kỳ trợ giúp được chào đón!

Trả lời

6

Dường như giải pháp tốt nhất là lập chỉ mục các tài liệu trên cả hai máy chủ vào bản sao chỉ mục của riêng chúng.

Nếu bạn lo lắng về việc lập chỉ mục thành công trên một máy chủ và bị lỗi trên máy chủ khác, bạn sẽ cần phải theo dõi thành công/lỗi cho mỗi máy chủ để bạn có thể thử lại các tài liệu không thành công sau khi sự cố xảy ra được giải quyết. Việc theo dõi này sẽ được thực hiện bên ngoài Lucene trong bất kỳ hệ thống nào bạn đang sử dụng để trình bày các tài liệu được lập chỉ mục cho Lucene. Tùy thuộc vào mức độ đầy đủ của chỉ mục đối với bạn, bạn cũng có thể phải xóa máy chủ không thành công khỏi bất kỳ trình cân bằng tải nào bạn đang sử dụng cho đến khi sự cố được khắc phục và lập chỉ mục đã xử lý lại mọi tài liệu chưa xử lý.

+0

Sean, đây hiện là tùy chọn ứng viên của chúng tôi. Tôi đồng ý với bạn và itsadok rằng nó có vẻ là sự lựa chọn tốt nhất. Tôi cũng đang cố gắng tìm các nguồn cho JdbcDirectory để xem một cổng đến .NET + SQL server có khả thi hay không. Sẽ tiếp tục mở câu hỏi trong một thời gian để xem có cách tiếp cận mới nào không, sẽ chấp nhận câu trả lời này theo cách khác. –

+0

Tôi đã kiểm tra cùng một điều. Nó không có vẻ giá trị nỗ lực như có một bó của DB giao dịch liên quan đến công cụ đó không phải là tầm thường để cổng để. Net. Cũng có những phàn nàn về tốc độ giảm sử dụng các công cụ JDBCDirectory. Nguồn nằm trong dự án Compass - http://svn.compass-project.org/svn/compass/trunk/src/main/src/org/apache/lucene/store/jdbc/ –

+2

Sau khi suy nghĩ, đây là những gì Tôi xem là giải pháp khả thi nhất: khi nhận được yêu cầu lập chỉ mục/deindexing, chèn một hàng vào bảng db được chia sẻ hoạt động như một hàng đợi. Thực hiện một dịch vụ win32 đơn giản chạy trong cả hai máy chủ ứng dụng và thăm dò hàng đợi mỗi X giây, lập chỉ mục nội dung cục bộ. Khi nội dung được lập chỉ mục thành công, dịch vụ sẽ đánh dấu mục đó là đã xử lý, nếu không nó sẽ tiếp tục cố gắng. –

1

+1 cho câu trả lời của Sean Carpenter. Lập chỉ mục trên cả hai máy chủ có vẻ giống như sự lựa chọn an toàn nhất và an toàn nhất.

Nếu tài liệu bạn lập chỉ mục phức tạp (Word/PDF và các loại), bạn có thể thực hiện một số tiền xử lý trên một máy chủ và sau đó cung cấp cho máy chủ lập chỉ mục, để tiết kiệm thời gian xử lý.

Giải pháp tôi đã sử dụng trước đây liên quan đến việc tạo một đoạn chỉ mục trên một máy chủ, sau đó nhập rsync vào máy chủ tìm kiếm và hợp nhất đoạn này vào từng chỉ mục, sử dụng IndexWriter.AddIndexesNoOptimize. Bạn có thể tạo một đoạn mới sau mỗi 5 phút hoặc bất cứ khi nào nó đạt đến một kích thước nhất định. Nếu bạn không phải có các chỉ mục cập nhật hoàn toàn thì đây có thể là giải pháp cho bạn.

1

trong thế giới java, chúng tôi đã giải quyết vấn đề này bằng cách đặt MQ trước chỉ mục. Việc chèn chỉ được hoàn thành khi đậu được lấy từ hàng đợi thành công, nếu không nó chỉ quay trở lại bất kỳ hành động nào, được đánh dấu trên tài liệu đang chờ xử lý và nó đã được thử lại sau

1

Tôi biết rằng đây là một câu hỏi cũ, nhưng tôi đã xem qua nó và muốn cho tôi 2 xu cho bất kỳ ai khác đang tìm kiếm lời khuyên về việc triển khai đa máy chủ.

Tại sao không giữ tệp chỉ mục trên thư mục NAS được chia sẻ? Làm thế nào nó khác với việc lưu trữ chỉ mục trong cơ sở dữ liệu mà bạn đang dự tính? Một cơ sở dữ liệu có thể được nhân rộng để có tính sẵn sàng cao, và do đó có thể là một NAS!

Tôi sẽ định cấu hình hai máy chủ ứng dụng mà bạn có đằng sau trình cân bằng tải. Bất kỳ yêu cầu chỉ mục nào đi vào sẽ lập chỉ mục các tài liệu trong thư mục máy cụ thể trên NAS. Tức là, sẽ có nhiều chỉ mục trên NAS như các máy chủ ứng dụng của bạn. Khi có yêu cầu tìm kiếm, bạn sẽ thực hiện tìm kiếm nhiều chỉ mục bằng Lucene. Lucene có cấu trúc (MultiSearcher) được tích hợp sẵn để thực hiện việc này và hiệu năng vẫn tuyệt vời.

+0

Tôi chưa xác minh xem điều này có đúng hay không, nhưng câu trả lời sau cho biết "một trong những khuyến nghị chính của Lucene là không sử dụng hệ thống tệp được nối mạng": http://stackoverflow.com/a/8562566/1145177 Lucerne FAQ đề cập đến "Sử dụng hệ thống tập tin cục bộ. Hệ thống tập tin từ xa thường chậm hơn một chút để tìm kiếm. Nếu chỉ mục phải ở xa, hãy thử gắn kết hệ thống tập tin từ xa với tư cách là chỉ đọc": http://wiki.apache.org/ lucene-java/ImproveSearchingSpeed –

0

Cách chúng tôi giữ các máy chủ cân bằng tải của chúng tôi đồng bộ, mỗi bản sao có Lucene riêng, có nhiệm vụ trên một máy chủ khác, chạy 5 phút một lần để chỉ định mỗi máy chủ cân bằng tải để cập nhật chỉ mục của chúng một dấu thời gian nhất định. Ví dụ: tác vụ gửi dấu thời gian của '12/1/2013 12: 35: 02.423 'đến tất cả các máy chủ cân bằng tải (nhiệm vụ đang gửi dấu thời gian qua chuỗi truy vấn đến một trang web trên mỗi trang web cân bằng tải), sau đó mỗi máy chủ sử dụng dấu thời gian đó để truy vấn cơ sở dữ liệu cho tất cả các bản cập nhật đã xảy ra kể từ lần cập nhật cuối cùng đến dấu thời gian đó và cập nhật chỉ mục Lucene cục bộ của chúng.

Mỗi máy chủ cũng lưu dấu thời gian trong db, do đó, nó biết khi nào mỗi máy chủ được cập nhật lần cuối. Vì vậy, nếu một máy chủ đi offline, khi nó trở lại trực tuyến, lần sau nó nhận được một lệnh dấu thời gian, nó sẽ lấy tất cả các bản cập nhật nó bị mất trong khi nó đang ngoại tuyến.

Các vấn đề liên quan