Tôi biết rằng MongoDB
chấp nhận và truy xuất các bản ghi dưới dạng các đối tượng JSON/BSON, nhưng làm thế nào để nó thực sự lưu trữ các tệp này trên đĩa? Chúng có được lưu trữ dưới dạng tập hợp các tệp *.json
riêng lẻ hay là một tệp lớn không? Tôi có một linh cảm về sau này, vì các tài liệu ____2 tuyên bố rằng nó hoạt động tốt nhất trên các hệ thống với ext4/xfs
, tốt hơn trong việc xử lý các tệp lớn. Bất cứ ai có thể xác nhận?
Hỏi ngày 8 tháng 11 năm 2010 lúc 19:44Nov 8, 2010 at 19:44
Mark Lemoinemark LemoineMark LeMoine
4.3383 Huy hiệu vàng34 Huy hiệu bạc51 Huy hiệu Đồng3 gold badges34 silver badges51 bronze badges
MongoDB lưu trữ dữ liệu trên đĩa dưới dạng BSON trong thư mục đường dẫn dữ liệu của bạn, thường là /dữ liệu /db. Cần có hai tệp trên mỗi bộ sưu tập ở đó, Collection.0, lưu trữ dữ liệu [và số nguyên đó sau đó được tăng lên dưới dạng nhu cầu] và thu thập.ns lưu trữ siêu dữ liệu đặt tên cho bộ sưu tập.
Đã trả lời ngày 8 tháng 11 năm 2010 lúc 20:00Nov 8, 2010 at 20:00
Jamie Rumbelowjamie RumbelowJamie Rumbelow
4.8672 Huy hiệu vàng28 Huy hiệu bạc42 Huy hiệu đồng2 gold badges28 silver badges42 bronze badges
1
Tài liệu chi tiết về định dạng BSON có thể được tìm thấy ở đây: //bsonspec.org/
Đã trả lời ngày 11 tháng 11 năm 2010 lúc 13:44Nov 11, 2010 at 13:44
MgriesbachmgriesbachMGriesbach
3442 Huy hiệu bạc6 Huy hiệu đồng2 silver badges6 bronze badges
Đã trả lời ngày 11 tháng 2 năm 2015 lúc 17:33Feb 11, 2015 at 17:33
1
Tài liệu về nhà → Hướng dẫn sử dụng MongoDB → MongoDB Manual
Trên trang này
- Nguyên tắc cơ bản của động cơ lưu trữ
- Bạn có thể trộn các công cụ lưu trữ trong một bộ bản sao không?
- Động cơ lưu trữ Wiredtiger
- Chẩn đoán lưu trữ dữ liệu
Tài liệu này giải quyết các câu hỏi phổ biến liên quan đến hệ thống lưu trữ của MongoDB.
Công cụ lưu trữ là một phần của cơ sở dữ liệu chịu trách nhiệm quản lý cách lưu trữ dữ liệu, cả trong bộ nhớ và trên đĩa. Nhiều cơ sở dữ liệu hỗ trợ nhiều công cụ lưu trữ, trong đó các công cụ khác nhau hoạt động tốt hơn cho khối lượng công việc cụ thể. Ví dụ, một công cụ lưu trữ có thể cung cấp hiệu suất tốt hơn cho khối lượng công việc nặng đọc và một công cụ khác có thể hỗ trợ thông lượng cao hơn cho các hoạt động ghi.
Mẹo
Xem thêm:
Đúng. Bạn có thể có các thành viên Set Replica sử dụng các công cụ lưu trữ khác nhau [WiredTiger và In-Memory]
Ghi chú
Bắt đầu từ phiên bản 4.2, MongoDB sẽ loại bỏ công cụ lưu trữ MMAPV1 không dùng.
Đúng. Nhìn thấy:
Thay đổi độc lập thành Wiredtiger
Thay đổi bản sao được đặt thành Wiredtiger
Thay đổi cụm Sharded thành Wiredtiger
Tỷ lệ dữ liệu nén so với dữ liệu không nén phụ thuộc vào dữ liệu của bạn và thư viện nén được sử dụng. Theo mặc định, dữ liệu thu thập trong WiredTiger sử dụng nén khối Snappy; Nén ZLIB và ZSTD cũng có sẵn. Chỉ số dữ liệu sử dụng nén tiền tố theo mặc định.
Với WiredTiger, MongoDB sử dụng cả bộ đệm bên trong WiredTiger và bộ đệm hệ thống tập tin.
Bắt đầu từ MongoDB 3.4, kích thước bộ nhớ cache bên trong WiredTiger mặc định là lớn hơn cả:
50% [RAM - 1 GB] hoặc
256 MB.
Ví dụ, trên một hệ thống có tổng số RAM 4GB, bộ đệm Wiredtiger sẽ sử dụng 1,5GB RAM [0.5 * [4 GB - 1 GB] = 1.5 GB
]. Ngược lại, một hệ thống có tổng số 1,25 GB RAM sẽ phân bổ 256 MB cho bộ đệm Wiredtiger vì đó là hơn một nửa tổng số RAM trừ đi một gigabyte [0.5 * [1.25 GB - 1 GB] = 128 MB < 256 MB
].
Ghi chú
Bắt đầu từ phiên bản 4.2, MongoDB sẽ loại bỏ công cụ lưu trữ MMAPV1 không dùng.
Đúng. Nhìn thấy:
Thay đổi độc lập thành Wiredtiger
Thay đổi bản sao được đặt thành Wiredtiger
Thay đổi cụm Sharded thành Wiredtiger
Tỷ lệ dữ liệu nén so với dữ liệu không nén phụ thuộc vào dữ liệu của bạn và thư viện nén được sử dụng. Theo mặc định, dữ liệu thu thập trong WiredTiger sử dụng nén khối Snappy; Nén ZLIB và ZSTD cũng có sẵn. Chỉ số dữ liệu sử dụng nén tiền tố theo mặc định.
Dữ liệu thu thập trong bộ đệm nội bộ Wiredtiger không bị nén và sử dụng một biểu diễn khác với định dạng trên đĩa. Nén khối có thể cung cấp tiết kiệm lưu trữ trên đĩa đáng kể, nhưng dữ liệu phải không bị nén để bị máy chủ thao túng.
Thông qua bộ đệm hệ thống tập tin, MongoDB tự động sử dụng tất cả bộ nhớ miễn phí không được sử dụng bởi bộ đệm WiredTiger hoặc bởi các quy trình khác.
Để điều chỉnh kích thước của bộ đệm nội bộ Wiredtiger, xem storage.wiredTiger.engineConfig.cacheSizeGB
và
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
0. Tránh tăng kích thước bộ đệm bên trong WiredTiger trên giá trị mặc định của nó.Ghi chú
storage.wiredTiger.engineConfig.cacheSizeGB
giới hạn kích thước của bộ đệm nội bộ Wiredtiger. Hệ điều hành sẽ sử dụng bộ nhớ miễn phí có sẵn cho bộ nhớ cache hệ thống tập tin, cho phép các tệp dữ liệu MongoDB được nén trong bộ nhớ. Ngoài ra, hệ điều hành sẽ sử dụng bất kỳ RAM miễn phí nào cho các khối hệ thống tệp và bộ đệm hệ thống tệp.
Để phù hợp với những người tiêu dùng RAM bổ sung, bạn có thể phải giảm kích thước bộ nhớ cache bên trong Wiredtiger.
Giá trị kích thước bộ đệm bên trong WiredTiger mặc định giả định rằng có một phiên bản
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
2 cho mỗi máy. Nếu một máy duy nhất chứa nhiều phiên bản MongoDB, thì bạn nên giảm cài đặt để phù hợp với các phiên bản db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
2 khác.Nếu bạn chạy
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
2 trong một container [ví dụ: db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
5, db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
6, Docker, v.v.] không có quyền truy cập vào tất cả RAM có sẵn trong hệ thống, bạn phải đặt storage.wiredTiger.engineConfig.cacheSizeGB
thành giá trị thấp hơn số lượng RAM có sẵn trong container . Số tiền chính xác phụ thuộc vào các quy trình khác chạy trong container. Xem db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
8Để xem số liệu thống kê về bộ đệm và tốc độ trục xuất, hãy xem trường
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
9 được trả về từ lệnh MongoDB
0.Mỗi kết nối sử dụng tối đa 1 megabyte của RAM.
Để tối ưu hóa việc sử dụng bộ nhớ cho các kết nối, hãy đảm bảo rằng bạn:
Giám sát số lượng kết nối mở để triển khai của bạn. Quá nhiều kết nối mở dẫn đến việc sử dụng RAM quá mức và giảm bộ nhớ có sẵn cho bộ hoạt động.
Các nhóm kết nối gần gũi khi chúng không còn cần thiết. Nhóm kết nối là bộ đệm của các kết nối cơ sở dữ liệu mở, sẵn sàng sử dụng được duy trì bởi trình điều khiển. Đóng các hồ bơi không cần thiết làm cho tài nguyên bộ nhớ bổ sung có sẵn.
Quản lý kích thước của nhóm kết nối của bạn. Tùy chọn chuỗi kết nối
MongoDB
1 Chỉ định số lượng kết nối mở tối đa trong nhóm. Theo mặc định, bạn có thể có tối đa 100 kết nối mở trong nhóm. GiảmMongoDB
1 làm giảm lượng RAM tối đa được sử dụng cho các kết nối.Mẹo
Đối với các thành viên tập hợp bản sao [thành viên chính và phụ],
Nếu có các hoạt động đang chờ các mục oplog. Các hoạt động có thể chờ các mục Oplog bao gồm:
Chuyển tiếp các truy vấn quét đối với oplog
Đọc các hoạt động được thực hiện như một phần của các phiên phù hợp nhân quả
Ngoài ra, đối với các thành viên thứ cấp, sau mỗi lần áp dụng hàng loạt các mục Oplog.
Nếu một hoạt động viết bao gồm hoặc ngụ ý mối quan tâm ghi của
MongoDB
3Ghi chú
storage.wiredTiger.engineConfig.cacheSizeGB
giới hạn kích thước của bộ đệm nội bộ Wiredtiger. Hệ điều hành sẽ sử dụng bộ nhớ miễn phí có sẵn cho bộ nhớ cache hệ thống tập tin, cho phép các tệp dữ liệu MongoDB được nén trong bộ nhớ. Ngoài ra, hệ điều hành sẽ sử dụng bất kỳ RAM miễn phí nào cho các khối hệ thống tệp và bộ đệm hệ thống tệp.Để phù hợp với những người tiêu dùng RAM bổ sung, bạn có thể phải giảm kích thước bộ nhớ cache bên trong Wiredtiger.
Giá trị kích thước bộ đệm bên trong WiredTiger mặc định giả định rằng có một phiên bản
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
2 cho mỗi máy. Nếu một máy duy nhất chứa nhiều phiên bản MongoDB, thì bạn nên giảm cài đặt để phù hợp với các phiên bản db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
2 khác.Nếu bạn chạy
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
2 trong một container [ví dụ: db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
5, db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
6, Docker, v.v.] không có quyền truy cập vào tất cả RAM có sẵn trong hệ thống, bạn phải đặt storage.wiredTiger.engineConfig.cacheSizeGB
thành giá trị thấp hơn số lượng RAM có sẵn trong container . Số tiền chính xác phụ thuộc vào các quy trình khác chạy trong container. Xem db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
8Để xem số liệu thống kê về bộ đệm và tốc độ trục xuất, hãy xem trường
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
9 được trả về từ lệnh MongoDB
0.Mỗi kết nối sử dụng tối đa 1 megabyte của RAM.*.json
0. The following example issues MongoDB
5 for the *.json
2 collection:
Để tối ưu hóa việc sử dụng bộ nhớ cho các kết nối, hãy đảm bảo rằng bạn:
Giám sát số lượng kết nối mở để triển khai của bạn. Quá nhiều kết nối mở dẫn đến việc sử dụng RAM quá mức và giảm bộ nhớ có sẵn cho bộ hoạt động.
Các nhóm kết nối gần gũi khi chúng không còn cần thiết. Nhóm kết nối là bộ đệm của các kết nối cơ sở dữ liệu mở, sẵn sàng sử dụng được duy trì bởi trình điều khiển. Đóng các hồ bơi không cần thiết làm cho tài nguyên bộ nhớ bổ sung có sẵn.
*.json
7 để trả về các kích thước chỉ mục tính bằng byte cho bộ sưu tập. Nếu một chỉ mục sử dụng nén tiền tố [là*.json
5], kích thước trả về phản ánh kích thước nén.
Tập lệnh sau đây in số liệu thống kê cho mỗi cơ sở dữ liệu:
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; printjson[mdb.stats[]]; }]
Tập lệnh sau đây in số liệu thống kê cho mỗi bộ sưu tập trong mỗi cơ sở dữ liệu:
db.adminCommand["listDatabases"].databases.forEach[function [d] { mdb = db.getSiblingDB[d.name]; mdb.getCollectionNames[].forEach[function[c] { s = mdb[c].stats[]; printjson[s]; }] }]
Để xem kích thước của dữ liệu được phân bổ cho từng chỉ mục, hãy sử dụng phương thức MongoDB
5 và kiểm tra trường MongoDB
0 trong tài liệu được trả về.
Nếu một chỉ mục sử dụng nén tiền tố [là MongoDB
1], kích thước được trả về cho chỉ số đó phản ánh kích thước nén.
Phương thức MongoDB
2 trong *.json
0 trả về trạng thái hiện tại của cơ sở dữ liệu "hoạt động". Để biết mô tả của các trường được trả về, xem đầu ra của DBSTATS.*.json
0 returns the current state of the "active" database. For the description of the returned fields, see
dbStats Output.