2011-02-04 24 views
8

Tôi đang làm việc trên một dự án mà chúng tôi thu thập định kỳ số lượng lớn e-mail qua IMAP hoặc POP, thực hiện phân tích trên đó (chẳng hạn như phân nhóm thành các cuộc hội thoại, trích xuất các câu quan trọng, v.v.) và sau đó trình bày các lượt xem qua web cho người dùng cuối.Làm thế nào để MonogoDB xếp chồng lên các tập dữ liệu rất lớn mà chỉ một số dữ liệu dễ bay hơi

Chế độ xem chính sẽ là trang tiểu sử giống như facebook cho mỗi liên hệ của cuộc hội thoại gần đây nhất (20 hoặc hơn) mà mỗi người trong số họ đã có từ e-mail mà chúng tôi chụp.

Đối với chúng tôi, điều quan trọng là bạn có thể truy xuất trang tiểu sử và 20 mục gần đây một cách thường xuyên và nhanh chóng. Chúng tôi cũng có thể thường xuyên chèn các e-mail gần đây vào nguồn cấp dữ liệu này. Đối với điều này, lưu trữ tài liệu và viết nguyên tử chi phí thấp của MongoDB có vẻ khá hấp dẫn.

Tuy nhiên, chúng tôi cũng sẽ có một lượng lớn các cuộc hội thoại e-mail cũ sẽ không được truy cập thường xuyên (vì chúng sẽ không xuất hiện trong 20 mục gần đây nhất, mọi người sẽ chỉ nhìn thấy chúng nếu họ tìm kiếm chúng , sẽ tương đối hiếm). Hơn nữa, kích thước của dữ liệu này sẽ phát triển nhanh hơn so với cửa hàng liên lạc theo thời gian. Từ những gì tôi đã đọc, MongoDB dường như ít nhiều đòi hỏi toàn bộ dữ liệu được đặt trong RAM, và cách duy nhất để giải quyết vấn đề này là sử dụng bộ nhớ ảo, có thể mang lại một chi phí đáng kể. Đặc biệt nếu Mongo không thể phân biệt giữa dữ liệu dễ bay hơi (profile/feed) và dữ liệu không bay hơi (email cũ), điều này có thể sẽ khá khó chịu (và vì nó dường như phân phối cấp phát bộ nhớ ảo cho hệ điều hành, Tôi không thấy Mongo sẽ làm được điều này như thế nào. Có vẻ như các lựa chọn duy nhất là (a) mua đủ RAM để lưu trữ mọi thứ, điều này là tốt cho dữ liệu dễ bay hơi, nhưng hầu như không hiệu quả về chi phí để chụp TB e-mail, hoặc (b) sử dụng ảo bộ nhớ và xem lần đọc/ghi trên dữ liệu dễ bay hơi của chúng tôi chậm để thu thập thông tin.

Điều này có đúng không, hoặc tôi có thiếu gì đó không? MongoDB có phù hợp với vấn đề cụ thể này không? Nếu vậy, cấu hình sẽ trông như thế nào?

Trả lời

2

MongoDB sử dụng mmap để ánh xạ tài liệu vào bộ nhớ ảo (không phải RAM vật lý). Mongo không yêu cầu toàn bộ tập dữ liệu được trong RAM nhưng bạn sẽ muốn 'bộ làm việc' của bạn trong bộ nhớ (bộ làm việc nên là một tập con của toàn bộ tập dữ liệu của bạn).

Nếu bạn muốn tránh ánh xạ lượng lớn email vào bộ nhớ ảo, bạn có thể có tài liệu hồ sơ của mình bao gồm một mảng ObjectIds tham chiếu đến các email được lưu trữ trong bộ sưu tập riêng biệt.

+0

Cảm ơn câu trả lời này. Có công bằng để giả định rằng các bộ sưu tập là mức độ chi tiết nhất của việc quản lý bộ nhớ đệm (ví dụ: một bộ sưu tập cho dữ liệu dễ bay hơi sẽ được đọc/ghi thường xuyên và một bộ sưu tập riêng biệt thường nằm trên đĩa)? –

-7

Và điều gì sẽ xảy ra nếu máy tính của bạn gặp phải tất cả những thứ Mongo có trong bộ nhớ. Tôi đoán rằng nó không có nhật ký nên câu trả lời có lẽ là may mắn.

+0

'đoán' sẽ không giúp bất kỳ ai làm câu trả lời. –

+1

Mongo vẫn tồn tại trên đĩa, nhưng không phải trên mỗi ghi (để duy trì hiệu suất ghi cao). Có một khả năng mất dữ liệu nhỏ giữa khi ghi được cam kết vào bộ nhớ và sau đó vào đĩa, đã được thảo luận tốt và không phải là một mối quan tâm ở đây. Tuy nhiên, toàn bộ DB cũng được lưu trong RAM, có thể là RAM vật lý hoặc ảo tùy thuộc vào dung lượng lưu trữ dữ liệu lớn. Câu hỏi của tôi là về thông minh và mong muốn tìm ra phần nào của dữ liệu đó trong RAM vật lý và RAM ảo. –

+1

MongoDB 1.7.5 thêm độ bền thông qua một tạp chí. Tính năng này sẽ có bản phát hành 1.8 ổn định. Ngoài ra, khi bạn viết vào MongoDB, bạn có thể yêu cầu nó fsync vào đĩa. Vì vậy, bạn có thể chọn hiệu suất so với độ bền-off. Tuy nhiên, một lời chỉ trích dễ hiểu là nó mặc định không ghi vào đĩa (hoặc thậm chí chờ đợi phản hồi từ máy chủ), điều này khiến mọi người ngạc nhiên nếu họ không đọc tài liệu. –

1

@Andrew J Thông thường bạn cần đủ RAM để giữ bộ làm việc của bạn, điều này đúng với MongoDB vì nó dành cho RDBMS. Vì vậy, nếu bạn muốn giữ 20 email cuối cùng cho tất cả người dùng mà không cần chuyển sang đĩa, thì bạn cần có nhiều bộ nhớ. Nếu điều này vượt quá bộ nhớ trên một hệ thống, thì bạn có thể sử dụng tính năng tích trữ MongoDB để truyền dữ liệu trên nhiều máy, do đó tổng hợp băng thông bộ nhớ, CPU và IO của các máy trong cụm.

@mP MongoDB cho phép bạn làm nhà phát triển ứng dụng chỉ định độ bền của bài viết của bạn, từ một nút trong bộ nhớ tới nhiều nút trên đĩa. Sự lựa chọn là tùy thuộc vào nhu cầu của bạn và mức độ quan trọng của dữ liệu; không phải tất cả dữ liệu đều được tạo ra như nhau. Ngoài ra trong MongoDB 1.8, bạn có thể chỉ định --dur, điều này viết một tệp nhật ký cho tất cả các ghi. Điều này tiếp tục cải thiện độ bền của viết và tăng tốc độ phục hồi nếu có sự cố.

3

MongoDB thực hiện không "yêu cầu toàn bộ dữ liệu được đặt trong RAM". Xem http://www.mongodb.org/display/DOCS/Caching để biết giải thích tại sao/cách nó sử dụng bộ nhớ ảo như thế nào.

Sẽ tốt cho ứng dụng này. Ví dụ, nếu sắp xếp và lọc của bạn phức tạp hơn, bạn muốn sử dụng thao tác Map-Reduce để tạo bộ sưu tập "hiển thị sẵn sàng" nhưng cho một ngày đơn giản được đặt, các chỉ mục hiện tại sẽ hoạt động tốt.

+0

Câu hỏi của tôi là làm thế nào để bộ nhớ đệm của monogdb (trong thực tế là bộ nhớ đệm của hệ điều hành) biết dữ liệu nào để giữ trong RAM vật lý và RAM ảo. Tôi có thể chắc chắn rằng, ví dụ, trên bộ dữ liệu 500GB trên máy có RAM 20 GB, dữ liệu dễ bay hơi như danh bạ được ưu tiên giữ trong RAM 20 GB và dữ liệu không bay hơi khó đọc được (email cũ) điều đầu tiên để chuyển sang đĩa? –

+1

Chỉ có RAM vật lý, mọi thứ khác được gọi là "đĩa". Không có những thứ như "RAM ảo". Như thế nào bộ nhớ ảo hoạt động bạn thực sự không cần phải biết. Để bắt đầu hiểu nó, bạn cần phải xem MongoDB xử lý các chỉ mục cũng như cách nó xử lý các bộ sưu tập như thế nào. Chia bộ sưu tập thành 'cũ' và 'mới' sẽ là một cơn đau đầu nếu bạn muốn tìm kiếm hoặc sắp xếp nó. MongoDB sẽ không tải toàn bộ thứ vào bộ nhớ - đừng lo! Chỉ cần điểm chuẩn nó, bạn sẽ tìm thấy nó ràng buộc nhanh chóng! –

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