Các chỉ mục Mongodb được lưu trữ trên đĩa như thế nào?


7

Vì vậy, trước tiên hãy để tôi bắt đầu câu hỏi với sự hiểu biết của tôi về cách MongoDb lưu trữ dữ liệu trên đĩa: Vì vậy, khi bạn tạo cơ sở dữ liệu trong mongodb, nó sẽ phân bổ một tệp lớn có tên <databasename>.0và trong tệp đó phân bổ các khu vực tiếp giáp với dữ liệu cụ thể bộ sưu tập hoặc chỉ số cụ thể.

Tại điểm mà tệp dữ liệu này được điền, nó tạo ra một tệp mới được gọi <databasename>.1và điền vào nó theo cách tương tự. Do đó, có vẻ hợp lý khi giả định rằng dữ liệu được chèn gần đây nhất vào cơ sở dữ liệu cụ thể sẽ nằm trong tệp được đánh số cao nhất (và các kiểm tra hiệu suất của tôi xác nhận điều này).

Tuy nhiên, tôi không thể thấy điều này có thể đúng với các chỉ số như thế nào ... vì chúng ta đang nói về một bTree, dường như không thể / có thể có bTree này nằm rải rác trên các tệp theo cùng một cách. Vì Mongo đang thực hiện bảo trì cho một chỉ mục, toàn bộ chỉ mục có sống ở một mức độ cho đến khi nó vượt xa nó tại điểm mà nó được di chuyển đến hiện tại (tệp dữ liệu được đánh số cao nhất) không?

Điều này đã trở nên quan trọng đối với tôi khi bắt đầu một cơ sở dữ liệu từ ảnh chụp nhanh Amazon EBS, có vẻ như có một chi phí rất lớn để đánh vào các tệp dữ liệu này cho đến khi âm lượng nóng lên. Tôi chỉ quan tâm đến một tập hợp con của các tài liệu N gần đây nhất từ ​​một bộ sưu tập. Nếu tôi có thể chắc chắn rằng tôi sẽ chỉ cần một vài tệp dữ liệu gần đây nhất thì tôi có thể kiểm tra trước các tệp này bằng cách đọc tuần tự trước khi bắt đầu mongod.

Câu trả lời:


7

Sự chậm trễ mà bạn đang thấy khi tải từ ảnh chụp nhanh không phải do cách lập chỉ mục trên đĩa, rất có thể bạn sẽ thấy độ trễ vì khi bạn bắt đầu một bản sao từ ảnh chụp nhanh, dữ liệu chỉ được tải trong lần sử dụng đầu tiên và sẽ chậm hơn đáng kể so với các lần sử dụng tiếp theo - đó là một hạn chế cơ bản của việc sử dụng ảnh chụp nhanh theo cách này và thực sự không liên quan gì đến ứng dụng đang cố truy cập đĩa. Đó là lý do tại sao bạn sẽ thấy hướng dẫn về "cách làm nóng âm lượng EBS" và tương tự (cũng có hình phạt khi viết lần đầu tiên). Nếu bạn làm điều đó (làm nóng đĩa với một ứng dụng khác ddchẳng hạn) và vấn đề hiệu năng sẽ biến mất, thì bạn có bằng chứng khá rõ ràng rằng bố cục dữ liệu không liên quan gì đến vấn đề này.

Dọc theo những dòng đó, MongoDB có lệnh cảm ứng cho phép bạn làm nóng dữ liệu trước khi bạn sử dụng nó trong sự tức giận (bạn có thể chạm vào dữ liệu, dữ liệu và chỉ mục hoặc chỉ mục lục). Một lần nữa, sau khi bạn ban đầu gắn âm lượng, nó sẽ chậm và cảm ứng sẽ mất một lúc, nhưng ít nhất sau giai đoạn khởi động đó, kết quả của bạn sẽ có phần nhất quán.

Về cách mọi thứ được lưu trữ trên đĩa, bạn có những điều cơ bản chính xác về phân bổ tệp nhưng có một cấu trúc logic trong các tệp, phạm vi, đó là các đơn vị lưu trữ thực sự. Điều đó và xa hơn nữa được trình bày chi tiết bởi bài thuyết trình này của Mathias Stearn - một trong những nhà phát triển nhân tại MongoDB.

Các chỉ mục chỉ là một dạng dữ liệu (có cấu trúc) khác trong MongoDB và chúng được lưu trữ trong các phạm vi được liên kết trong toàn bộ tệp. Sự phân mảnh có thể trở thành một vấn đề (đó là lệnh rút gọn dành cho) vì không gian đĩa có thể được sử dụng ( lệnh sửa chữa được sử dụng để lấy lại) nhưng bạn đã mô tả một khối lượng công việc sẽ ngay lập tức khiến tôi nghĩ rằng bạn đang gặp phải sự cố phân mảnh tại sao tôi nghi ngờ điều gì khác (như hình phạt sử dụng đầu tiên) là nguyên nhân gốc rễ của bạn.


Tôi đã chấp nhận câu trả lời này vì nó được viết tốt và tăng thêm sự hiểu biết của tôi tuy nhiên tôi tin rằng cách các chỉ mục được lưu trữ trên đĩa có liên quan trong kịch bản khởi động EBS khi thấy sự nóng lên của âm lượng liên quan đến việc nhắm mục tiêu các tệp cụ thể. Đối với bản ghi, tôi đã tìm thấy cho ứng dụng của mình tiền xử lý hai tệp dữ liệu mongodb cuối cùng của cơ sở dữ liệu có liên quan trên EBS (bằng cách sao chép chúng vào / dev / null!) Đạt được tốc độ khá tốt khi chỉ bắt đầu lạnh.
John Greenall

1
Bạn sẽ nhấn tất cả các khối có liên quan cho các chỉ mục bằng cách sử dụng lệnh cảm ứng với tùy chọn chỉ mục, điều này sẽ loại bỏ mọi nghi ngờ về những gì bạn đã phân trang. Nếu bạn muốn xem chính xác những gì đã thực hiện, hãy kiểm tra công cụ này: eng.wish.com/mongomem-memory-usage-by-collection-in-mongodb
Adam C

Ah đã bỏ lỡ điều đó. Mẹo hàng đầu!
John Greenall
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.