2013-02-04 51 views
6

Chúng tôi đang sử dụng MongoDB 2.2.0 tại nơi làm việc. DB chứa khoảng 51GB dữ liệu (tại thời điểm này) và tôi muốn thực hiện một số phân tích về dữ liệu người dùng mà chúng tôi đã thu thập từ trước đến nay. Vấn đề là, nó là cỗ máy sống và chúng ta không thể đủ khả năng cho một nô lệ khác vào lúc này. Tôi biết MongoDB có một khóa đọc mà có thể ảnh hưởng đến bất kỳ viết xảy ra đặc biệt là với các truy vấn phức tạp. Có cách nào để nói MongoDB để xử lý truy vấn (cụ thể) của tôi với ưu tiên thấp nhất?Đọc từ mongodb mà không cần khóa

+0

Ghi chú có thể có hiệu lực lần đọc nhưng nhưng đọc quá nhanh và động lực của nó là như vậy mà có một 1/1.000.000 cơ hội của một lần đọc có tác dụng viết opreation. Giống như việc sử dụng các khóa JS và các hoạt động ghi sai sẽ dẫn đến các vấn đề trong các truy vấn. Khi nói với MongoDB về các ưu tiên, tôi không tin có một phương thức nào là – Sammaye

Trả lời

6

Trong MongoDB lần đọc và ghi ảnh hưởng lẫn nhau. Đọc khóa được chia sẻ, nhưng đọc khóa khối viết khóa từ được mua lại và tất nhiên không có đọc hoặc viết khác đang xảy ra trong khi một khóa ghi được tổ chức. Các hoạt động của MongoDB mang lại định kỳ để giữ cho các luồng khác chờ đợi các khóa bị đói. Bạn có thể đọc thêm về các chi tiết của số đó here.

Điều đó có ý nghĩa gì đối với trường hợp sử dụng của bạn? Bởi vì không có cách nào để nói MongoDB truy cập dữ liệu mà không có khóa đọc, cũng không có cách nào để ưu tiên các yêu cầu (ít nhất là chưa) cho dù lần đọc có ảnh hưởng đáng kể đến hiệu năng ghi của bạn hay không phụ thuộc vào "khoảng không" có sẵn trong khi viết hoạt động đang diễn ra.

Một đề xuất mà tôi có thể thực hiện là tìm hiểu cách chạy phân tích, thay vì quét toàn bộ tập dữ liệu (ví dụ: thực hiện truy vấn tổng hợp trên tất cả dữ liệu lịch sử) thử chạy truy vấn tổng hợp nhỏ hơn trên lát thời gian ngắn. Điều này sẽ thực hiện hai điều:

  1. đọc công việc sẽ ngắn hơn và do đó sẽ nhanh hơn, điều này sẽ cho bạn cơ hội đánh giá tác động của truy vấn đến hiệu suất "trực tiếp".
  2. bạn sẽ không kéo tất cả dữ liệu cũ vào RAM cùng một lúc - bằng cách đặt ra các truy vấn phân tích theo thời gian, bạn sẽ giảm thiểu tác động trên hiệu suất ghi hiện tại.

Tùy thuộc vào những gì bạn không đủ khả năng để nhận một máy chủ khác - bạn có thể xem xét một trường hợp AWS ngắn ngủi có thể không mạnh mẽ nhưng sẽ có sẵn để chạy truy vấn phân tích dài dựa vào bản sao tập dữ liệu của bạn. Chỉ cần cẩn thận khi làm cho nó một bản sao dữ liệu của bạn - thực hiện đồng bộ hóa hoàn toàn hệ thống sản xuất sẽ đặt tải nặng vào nó (cách hiệu quả hơn là sử dụng ảnh chụp nhanh/sao lưu gần đây để tiếp tục).

+0

Cảm ơn câu trả lời của bạn. Tôi nghĩ phần cắt là một ý tưởng tuyệt vời. Tôi sẽ cho một phát bắn. Chúng tôi có chỉ mục trên trường _id, cách tốt nhất để chia dựa trên điều đó là gì? Tôi đang suy nghĩ viết một tập tin '.js' mà sẽ chấp nhận các tham số để cắt và sau đó kích hoạt thông qua một kịch bản shell hoặc một cái gì đó. Sửa tôi nếu tôi sai, nhưng tôi đoán việc chạy một tệp javascript trong mongo sẽ tạo khóa cho toàn bộ thời lượng của tập lệnh, do đó kịch bản lệnh shell gọi javascript. Bằng cách này tôi có thể chạy một kịch bản shell gọi mongo 100 lần, mỗi lần xử lý 1% dữ liệu –

+0

chạy một tệp javascript sẽ không tạo ra bất kỳ khóa nào (nó chỉ gọi vỏ không có khóa). Tôi giả định tệp js sẽ chứa truy vấn thực tế bạn muốn chạy (tham số hóa cho phạm vi?) _id trường dẫn bốn byte biểu diễn datetime của việc tạo giá trị ObjectId vì vậy bất kỳ phân đoạn tuần tự nào cũng hoạt động. –

2

Các hoạt động như vậy là tốt nhất còn lại cho các nô lệ của một bộ bản sao. Đối với một điều, đọc khóa có thể được chia sẻ để cho phép nhiều lần đọc cùng một lúc, nhưng viết khóa sẽ chặn đọc. Và, trong khi bạn không thể ưu tiên truy vấn, mongodb mang lại các truy vấn đọc/ghi dài chạy. Their concurrency docs sẽ giúp

Nếu bạn không thể mua một máy chủ khác, bạn có thể thiết lập một nô lệ trên cùng một máy, với điều kiện bạn có một số khoảng trống RAM/đĩa. Bạn phải cẩn thận mặc dù, đĩa I/O của bạn sẽ tăng lên đáng kể.

+0

Trong khi hầu hết quan sát của bạn là chính xác, hãy đọc khóa * làm * chặn viết - không thể có khóa ghi nếu có khóa đọc (nếu không đọc thì không thể được đảm bảo là nhất quán!) –

+0

@AsyaKamsky, anh ấy nói "khóa đọc không chặn viết" nhưng chúng có đúng không? Tôi có nghĩa là làm thế nào bạn có thể đánh giá, như bạn đã nói, sự nhất quán của một đọc. Tôi không chắc chắn nếu nó là như vậy tốt để chỉ đạo cho tôi câu trả lời này – Sammaye

+0

@AsyaKamsky, tôi đứng sửa chữa. – Adil

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