2012-04-23 39 views
6

Một câu hỏi khác về NoSQL để chọn. Tuy nhiên, tôi chưa tìm thấy ai đó yêu cầu loại mục đích này, lưu trữ tin nhắn ...Nhóm NoSQL DB nào được sắp xếp cho mục đích Lưu trữ Thư?

Tôi có Máy chủ trò chuyện Erlang, tôi đã sử dụng MySQL để lưu trữ danh sách bạn bè và "THAM GIA" thông tin.

Tôi muốn lưu trữ Tin nhắn (Người dùng đó chưa nhận được vì anh ấy ngoại tuyến ...) và truy xuất chúng.

Tôi đã thực hiện lựa chọn trước NoSQL, tôi không thể sử dụng những thứ như MongoDB do đó là mô hình định hướng RAM và không kết hợp với những người khác. Tôi có xuống danh sách của tôi tới 3 lựa chọn Tôi đoán:

  • HBase
  • Riak
  • Cassandra

Tôi biết rằng mô hình của họ đang bỏ khác nhau, một sử dụng khóa/giá trị, khác sử dụng SuperColumns và co.

Cho đến bây giờ tôi đã có một sở thích cho Riak do đó là thư viện khách hàng ổn định cho Erlang.

tôi biết rằng tôi có thể sử dụng Cassandra với Thrift, nhưng có vẻ như không phải là rất ổn định với Erlang (Tôi đã không nhận được lợi nhuận tốt về nó)

tôi không thực sự biết gì về HBase ngay bây giờ, chỉ cần biết nó tồn tại và dựa trên Dynamo như Cassandra và Riak.

Vì vậy, đây là những gì tôi cần phải làm:

  • Store từ 1 tới thông điệp X cho mỗi người dùng đăng ký.
  • Nhận số lượng tin nhắn được lưu trữ cho mỗi người dùng.
  • truy xuất tất cả thư từ người dùng cùng một lúc.
  • xóa tất cả tin nhắn khỏi người dùng cùng một lúc.
  • xóa tất cả thông điệp mà lớn tuổi hơn tháng X

Ngay bây giờ, tôi thực sự mới để những NoSQL DB, tôi luôn luôn là một người hâm mộ MySQL, Đây là lý do tại sao tôi hỏi bạn câu hỏi này, như một Newbie , ai đó có nhiều kinh nghiệm hơn tôi có thể giúp tôi chọn cái nào tốt hơn, và sẽ để tôi làm mọi thứ tôi muốn mà không gặp nhiều rắc rối ...

Cảm ơn!

+0

@BrianRoach: Họ dường như không nghĩ như vậy về câu hỏi này http://stackoverflow.com/questions/2892729/mongodb-vs-cassandra đây là cùng một loại câu hỏi. – TheSquad

+1

thực tế là một câu hỏi không được bình chọn và đóng cửa vì nó đáng lẽ không ảnh hưởng đến thực tế là ... nó không thích hợp theo câu hỏi thường gặp và meta. Ngoài ra, đó là 2 năm trước đây - mọi thứ đã phát triển kể từ đó với việc bổ sung các trang web khác. –

Trả lời

7

Tôi không thể nói cho Cassandra hoặc HBase, nhưng hãy để tôi giải quyết phần Riak.

Có, Riak sẽ phù hợp với kịch bản của bạn (và tôi đã thấy một số công ty và mạng xã hội sử dụng nó cho một mục đích tương tự).

Để thực hiện điều này, bạn sẽ cần các thao tác Riak Key/Value đơn giản, cộng với một số loại công cụ lập chỉ mục. lựa chọn của bạn là (theo thứ tự thô tự ưu tiên):

  1. CRDT Thiết. Nếu kích thước bộ sưu tập 1-N của bạn có kích thước hợp lý (giả sử, có ít hơn 50 thư cho mỗi người dùng hoặc bất kỳ thứ gì), bạn có thể lưu trữ các khóa của bộ sưu tập con trong một CRDT Set Data Type.

  2. Riak tìm kiếm. Nếu kích thước bộ sưu tập của bạn lớn và đặc biệt nếu bạn cần tìm kiếm các đối tượng của mình trên các trường tùy ý, bạn có thể sử dụng Riak Search. Nó xoay Apache Solr ở chế độ nền và lập chỉ mục các đối tượng của bạn theo lược đồ mà bạn xác định. Nó có tìm kiếm, tập hợp và thống kê khá tuyệt vời, khả năng không gian địa lý, v.v.

  3. Chỉ mục phụ. Bạn có thể chạy Riak trên đầu trang của eLevelDB storage back end và bật chức năng Secondary Index (2i).

Chạy một vài thử nghiệm hiệu suất để chọn phương pháp nhanh nhất.

Theo như giản đồ, tôi khuyên bạn nên sử dụng hai nhóm (đối với thiết lập bạn mô tả): nhóm Người dùng và nhóm Thư.

Lập chỉ mục nhóm tin nhắn. (Hoặc bằng cách kết hợp chỉ mục Tìm kiếm với chỉ mục đó hoặc bằng cách lưu một user_key qua 2i). Điều này cho phép bạn làm tất cả các hoạt động cần thiết (và các bản ghi thông điệp không nhất thiết phải phù hợp với bộ nhớ):

  • Store từ 1 tới thông điệp X cho mỗi người dùng đăng ký - Khi bạn tạo ra một đối tượng người dùng và có được một khóa người dùng, lưu trữ số lượng thư tùy ý cho mỗi người dùng một cách dễ dàng, chúng sẽ được viết thẳng vào Thùng thư, mỗi thư lưu trữ user_key thích hợp làm chỉ mục phụ.
  • Nhận số tin nhắn được lưu trữ cho mỗi người dùng - Không sao cả. Lấy danh sách các phím tin nhắn thuộc về một người dùng (thông qua một truy vấn tìm kiếm, bằng cách truy xuất đối tượng Set nơi bạn đang giữ các khóa, hoặc thông qua một truy vấn 2i trên user_key). Điều này cho phép bạn nhận được số lượng ở phía khách hàng.
  • truy xuất tất cả thư từ người dùng cùng một lúc - Xem mục trước. Nhận danh sách các khóa của tất cả các tin nhắn thuộc về người dùng (thông qua Tìm kiếm, Bộ hoặc 2i), rồi tìm nạp các thông điệp thực tế cho các khóa đó bằng cách tìm nạp nhiều giá trị cho mỗi khóa (tất cả các khách hàng chính thức của Riak có khả năng multiFetch, phía khách hàng).
  • xóa tất cả thư từ người dùng cùng một lúc - Rất giống nhau. Nhận danh sách các phím tin nhắn cho người dùng, vấn đề Xóa chúng ở phía máy khách.
  • xóa tất cả các thư cũ hơn X tháng - Bạn có thể thêm chỉ mục vào Ngày. Sau đó, truy xuất tất cả các khóa tin nhắn cũ hơn X tháng (qua Tìm kiếm hoặc 2i) và phát hành Xóa phía máy khách cho chúng.
+0

Những điều thú vị trong cuộc sống ... 3 năm sau khi tôi đăng câu hỏi này, tôi bắt đầu một dự án khác và có một số câu hỏi tôi cần được trả lời. Tỷ lệ cược là bạn đã trả lời chúng!Vì vậy, ở đây 3 năm sau đó, một câu hỏi xác nhận và một +1 cho việc nắm giữ tương lai ;-) – TheSquad

+0

Vui mừng được giúp đỡ! :) –

+0

Tôi đã chỉnh sửa câu trả lời cho tài khoản cho một vài tính năng mới của Riak đã bắt đầu từ đó - cụ thể là Tìm kiếm và Loại dữ liệu. –

0

Tôi không thể nói chuyện với Riak chút nào, nhưng tôi muốn hỏi bạn lựa chọn loại bỏ Mongo. Nó khá tốt miễn là bạn để lại nhật ký tắt và không hoàn toàn đói nó cho RAM.

Tôi biết khá nhiều về HBase và có vẻ như nó sẽ đáp ứng nhu cầu của bạn một cách dễ dàng. Có thể là quá mức cần thiết tùy thuộc vào số lượng người dùng bạn có. Nó trivially hỗ trợ những thứ như lưu trữ nhiều tin nhắn cho mỗi người dùng, và có chức năng tự động hết hạn của viết. Tùy thuộc vào cách bạn kiến ​​trúc sư lược đồ của bạn nó có thể hoặc có thể không phải là nguyên tử, nhưng điều đó không quan trọng đối với trường hợp sử dụng của bạn.

Nhược điểm là có rất nhiều chi phí để thiết lập chính xác.Bạn cần phải biết Hadoop, hãy chạy HDFS, đảm bảo rằng nút tên của bạn là đáng tin cậy, v.v. trước khi đứng lên HBase.

+1

Tôi đoán MongoDB cũng sẽ là một lựa chọn tốt, nhưng tôi thực sự muốn có một mô hình dựa trên Dynamo (không có điểm thất bại nào), AFAIK MongoDB không dựa trên điều đó, nhưng tôi có thể sai, phải không? Điểm yếu của bạn về Cassandra là gì? – TheSquad

+0

Ý tưởng của tôi không dừng lại khi nói về loại bỏ MongoDB, nhưng ngay bây giờ, tôi đã không thực sự bị thuyết phục nó là giải pháp tốt nhất cho một DB nhóm ... có vẻ như là 3 tôi đã chọn bây giờ là tốt nhất trên hiệu trưởng này điểm, bạn không nghĩ sao? – TheSquad

+0

Khi được phân mảnh và với từng ngăn được nhân bản, Mongo không có SPOF. HBase thực hiện lệnh HDFS NameNode. Tôi không biết đủ về Cassandra để nói nhiều, khác hơn là không có SPOF và rất giống với khả năng của HBase. –

0

Tôi khuyên bạn nên sử dụng kho khóa/giá trị phân phối như Riak hoặc Couchbase và giữ toàn bộ nhật ký thư cho mỗi người dùng được tuần tự hóa (thành cụm từ nhị phân hoặc JSON/BSON) làm một giá trị.

Vì vậy, với usecases của bạn nó sẽ trông giống như:

  • Store từ 1 tới thông điệp X cho mỗi người dùng đăng ký - khi người dùng đến trực tuyến spawn một stateful gen_server, mà nhận được từ việc lưu trữ và deserializes toàn bộ thông điệp đăng nhập vào khởi động, nhận tin nhắn mới, gắn thêm vào đó là bản sao của nhật ký, vào cuối phiên nó chấm dứt, tuần tự hóa nhật ký đã thay đổi và gửi nó vào bộ nhớ.
  • Nhận số lượng tin nhắn được lưu trữ cho mỗi người dùng - nhận thông tin đăng xuất, deserialize, đếm; hoặc có thể lưu trữ cùng với một cặp k/v riêng biệt.
  • truy xuất tất cả thư từ người dùng cùng một lúc - chỉ cần kéo thư từ bộ nhớ.
  • xóa tất cả thư từ người dùng cùng một lúc - chỉ cần xóa giá trị khỏi bộ nhớ.
  • xóa tất cả các thư cũ hơn X tháng - nhận, lọc, đặt lại.

Nhật ký thông báo - giới hạn rõ ràng phải phù hợp với bộ nhớ.

Nếu bạn quyết định lưu trữ từng thư riêng biệt, nó sẽ yêu cầu từ cơ sở dữ liệu phân tán để sắp xếp chúng sau khi truy xuất nếu bạn muốn theo thứ tự thời gian, vì vậy sẽ khó giúp xử lý các tập dữ liệu lớn hơn bộ nhớ. Nếu nó là cần thiết - bạn sẽ anyway kết thúc với một số chương trình phức tạp hơn.

+0

Thật không may, nhật ký tin nhắn có một cơ hội tuyệt vời không phù hợp với bộ nhớ ... Đây là lý do tại sao tôi có thể đi với Cassandra nó là cơ sở dữ liệu định hướng cột trông đầy hứa hẹn, và nếu nó hoạt động cho tweet của twitter, nó sẽ làm việc cho tôi .. (có thể làm nhiều hơn, có thể làm ít hơn ;-) – TheSquad

+0

Bạn cũng có thể chia nhật ký thư thành các trang, trong đó một trang được lưu trữ dưới dạng một giá trị. Tôi không có kinh nghiệm cá nhân với điều này, nhưng nó được mô tả trong bài nói chuyện này của Voxer: http://vimeo.com/52827773 –