Hướng dẫn how does mongodb store files on disk? - làm thế nào để mongodb lưu trữ các tập tin trên đĩa?

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

Hướng dẫn how does mongodb store files on disk? - làm thế nào để mongodb lưu trữ các tập tin trên đĩa?

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: http://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

Hướng dẫn how does mongodb store files on disk? - làm thế nào để mongodb lưu trữ các tập tin trên đĩa?

1

Tài liệu về nhà → Hướng dẫn sử dụng MongoDBMongoDB 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

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 MongoDB0.

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 MongoDB1 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ảm MongoDB1 làm giảm lượng RAM tối đa được sử dụng cho các kết nối.

    Mẹo

CheckPointSstarting Trong phiên bản 3.6, MongoDB định cấu hình WiredTiger để tạo các điểm kiểm tra (nghĩa là viết dữ liệu ảnh chụp nhanh vào đĩa) trong khoảng thời gian 60 giây. Trong các phiên bản trước, MongoDB đặt các điểm kiểm tra xảy ra trong WiredTiger trên dữ liệu người dùng trong khoảng 60 giây hoặc khi 2 GB dữ liệu tạp chí đã được viết, tùy theo điều kiện nào xảy ra. :
  • Đố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 MongoDB3

    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 MongoDB0.

Mỗi kết nối sử dụng tối đa 1 megabyte của RAM.*.json0. The following example issues MongoDB5 for the *.json2 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.

  • *.json7 để 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à *.json5), 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 MongoDB5 và kiểm tra trường MongoDB0 trong tài liệu được trả về.

Nếu một chỉ mục sử dụng nén tiền tố (là MongoDB1), kích thước được trả về cho chỉ số đó phản ánh kích thước nén.

Phương thức MongoDB2 trong *.json0 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.*.json0 returns the current state of the "active" database. For the description of the returned fields, see dbStats Output.

Làm thế nào để MongoDB lưu trữ dữ liệu trên đĩa?

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 tin cho mỗi bộ sưu tập ở đó, bộ sưu tập. 0, lưu trữ dữ liệu (và số nguyên đó sau đó được tăng lên như 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.as BSON in your data path directory, which is usually /data/db. There should be two files per collection there, collection. 0, which stores the data (and that integer is then incremented as needs be) and collection. ns which stores the namespacing metadata for the collection.

MongoDB có lưu vào đĩa không?

Các tài liệu được lưu trữ trên đĩa bằng cách sử dụng nén khối để giảm sử dụng lưu trữ. Các tài liệu tự động không bị nén trong bộ nhớ khi được máy chủ MongoDB truy xuất. Mỗi bộ sưu tập & chỉ mục được lưu trữ trong một tệp riêng trong bộ lưu trữ.. Documents are automatically uncompressed in memory when retrieved by the MongoDB server. Each collection & index is stored in a separate file within the storage.

Làm thế nào các tập tin được lưu trữ trong MongoDB?

MongoDB lưu trữ các đối tượng ở định dạng nhị phân gọi là BSON.Bindata là loại dữ liệu BSON cho mảng byte nhị phân.Tuy nhiên, các đối tượng MongoDB thường bị giới hạn ở kích thước 16MB.Để đối phó với điều này, các tệp được "chia" thành nhiều đối tượng nhỏ hơn 255 kib mỗi đối tượng.in a binary format called BSON. BinData is a BSON data type for a binary byte array. However, MongoDB objects are typically limited to 16MB in size. To deal with this, files are "chunked" into multiple objects that are less than 255 KiB each.

MongoDB lưu trữ dữ liệu của nó ở đâu?

Theo mặc định Mongo lưu trữ dữ liệu của nó trong thư mục /dữ liệu /db.Bạn có thể chỉ định một thư mục khác nhau bằng tùy chọn - -DBPath.Nếu bạn đang chạy Mongo trên Windows thì thư mục sẽ là C: \ Data \ DB, trong đó C là ký tự ổ đĩa của thư mục làm việc mà Mongo được bắt đầu./data/db . You can specify a different directory using the --dbpath option. If you're running Mongo on Windows then the directory will be C:\data\db , where C is the drive letter of the working directory in which Mongo was started.