Mongodb có được lưu trữ trong bộ nhớ không?

Trong hầu hết các cơ sở dữ liệu, càng nhiều dữ liệu được lưu trong bộ nhớ cache trong RAM càng tốt. Tương tự trong MongoDB. Tuy nhiên, bộ đệm cạnh tranh với các quy trình sử dụng nhiều bộ nhớ khác cũng như các quy trình nhân

Để tăng tốc hiệu suất, nhiều người chỉ cần phân bổ tài nguyên cho vấn đề dễ thấy nhất. Tuy nhiên, trong trường hợp của MongoDB, đôi khi việc phân bổ nhiều bộ nhớ hơn thực sự ảnh hưởng đến hiệu suất. Sao có thể như thế được? . Bộ đệm của hệ điều hành thường được các sysadins, dba và devs coi là "Chưa phân bổ". Điều này có nghĩa là chúng đánh cắp bộ nhớ từ hệ điều hành và phân bổ nó bên trong cho MongoDB. Tại sao điều này có khả năng là một điều xấu?

Cách MongoDB sử dụng bộ nhớ để lưu trữ dữ liệu

Bất cứ khi nào bạn chạy truy vấn, một số trang sẽ được sao chép từ các tệp vào bộ đệm bộ nhớ trong của quy trình mongod để sử dụng lại trong tương lai. Một phần dữ liệu và chỉ mục của bạn có thể được lưu vào bộ đệm và truy xuất rất nhanh khi cần. Đây là những gì WiredTiger Cache (WTC) làm. Mục tiêu của WTC là lưu trữ các trang được sử dụng thường xuyên và gần đây nhất để cung cấp quyền truy cập nhanh nhất vào dữ liệu của bạn. Điều đó thật tuyệt vời để cải thiện hiệu suất của cơ sở dữ liệu

Theo mặc định, quy trình mongod sử dụng tối đa 50% RAM khả dụng cho bộ đệm đó. Cuối cùng, bạn có thể thay đổi kích thước của WTC bằng cách sử dụng biến cấu hình  storage.wiredTiger.engineConfig.cacheSizeGB

Hãy nhớ rằng dữ liệu được nén trên các tệp đĩa trong khi bộ đệm lưu trữ thay vì các trang không nén

Khi WTC gần đầy, nhiều vụ trục xuất có thể xảy ra. Trục xuất xảy ra khi các trang được yêu cầu không có trong bộ đệm và mongod phải loại bỏ các trang hiện có để nhường chỗ và đọc các trang đến từ hệ thống tệp. Thuật toán đi bộ loại bỏ thực hiện một số việc khác (sắp xếp danh sách trang LRU và đối chiếu trang WT) cũng như đánh dấu các trang ít được sử dụng gần đây nhất có sẵn để sử dụng lại và tổng thể điều này có thể gây ra sự chậm chạp tại một số điểm do IO chuyên sâu hơn

Dựa trên cách thức hoạt động của WTC, ai đó có thể nghĩ rằng nên gán thậm chí 80%/90% bộ nhớ cho nó (nếu bạn đã quen thuộc với MySQL, bạn cũng làm như vậy khi định cấu hình Nhóm bộ đệm cho InnoDB). Hầu hết thời gian đây là một sai lầm và để hiểu tại sao bây giờ chúng ta hãy xem một cách khác mà mongod sử dụng bộ nhớ

Cách MongoDB sử dụng bộ nhớ cho bộ đệm tệp

Thay đổi chủ đề đột ngột. thay vào đó chúng ta sẽ nói về hệ điều hành một chút. Hệ điều hành cũng lưu vào bộ nhớ cache các khối đĩa hệ thống tệp thông thường để tăng tốc độ truy xuất nếu chúng được yêu cầu nhiều lần. Tính năng này được cung cấp bởi hệ thống bất kể ứng dụng nào đang sử dụng nó và nó thực sự hữu ích khi ứng dụng cần truy cập thường xuyên vào đĩa. Khi thao tác IO được kích hoạt, dữ liệu có thể được trả về bằng cách đọc các khối từ bộ nhớ thay vì truy cập đĩa thực. Sau đó, yêu cầu sẽ được phục vụ nhanh hơn. Loại bộ nhớ này do hệ điều hành quản lý được gọi là bộ nhớ cache, như bạn thấy trong /proc/meminfo. Chúng ta cũng có thể gọi nó là “Bộ đệm tệp”

Vỏ bọc

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# mèo /proc/meminfo

MemTotal.         1882064 kB

MemFree.          1376380 kB

Có sẵn.     1535676 kB

Bộ đệm.             2088 kB

Đã lưu trong bộ nhớ đệm.            292324 kB

SwapCached.             0 kB

Đang hoạt động.            152944 kB

Không hoạt động.          252628 kB

Đang hoạt động(không hoạt động).      111328 kB

Không hoạt động(không hoạt động).     16508 kB

Đang hoạt động(tệp).       41616 kB

Không hoạt động(tệp).    236120 kB

Không thể tránh khỏi.            0 kB

Mlocked.                0 kB

SwapTotal.        2097148 kB

Miễn phí hoán đổi.         2097148 kB

Bẩn.                         40 kB

Ghi lại.              0 kB

AnonPages.         111180 kB

Đã ánh xạ.             56396 kB

.. .

[cắt bớt]

Hãy nhớ rằng MongoDB hoàn toàn dựa vào Hệ điều hành để đệm tệp

Trên một máy chủ chuyên dụng, nơi chạy một quy trình mongod duy nhất, miễn là bạn sử dụng cơ sở dữ liệu, nhiều khối đĩa sẽ được lưu vào bộ nhớ. Cuối cùng, gần như tất cả các trường “được lưu trong bộ nhớ cache” + “bộ đệm” trong đầu ra chỉ số bộ nhớ được hiển thị ở trên sẽ được sử dụng riêng cho các khối đĩa được yêu cầu bởi mongod

Một điều quan trọng là bộ nhớ cache lưu các khối đĩa chính xác như chúng vốn có. Vì các khối đĩa được nén vào các tệp WT, nên các khối vào bộ nhớ cũng được nén. Do tính năng nén, bạn có thể lưu trữ rất nhiều dữ liệu và chỉ mục MongoDB của mình

Giả sử bạn có tỷ lệ nén 4x, trong bộ đệm tệp bộ nhớ 10 GB (bộ nhớ đệm), bạn có thể lưu trữ tới 40 GB dữ liệu thực. Đó là nhiều hơn nữa, miễn phí

Đặt mọi thứ lại với nhau

Hình ảnh sau đây cung cấp cho bạn tổng quan sơ bộ về việc sử dụng bộ nhớ

Mongodb có được lưu trữ trong bộ nhớ không?

Giả sử chúng ta có một máy RAM 64 GB chuyên dụng và bộ dữ liệu 120 GB. Do nén, cơ sở dữ liệu sử dụng khoảng 30 GB dung lượng lưu trữ, giả sử tỷ lệ nén 4x, khá phổ biến

Nếu không thay đổi bất cứ điều gì về cấu hình, thì khoảng 32 GB sẽ được WTC sử dụng để tiết kiệm 32 GB dữ liệu không nén. Bộ nhớ còn lại sẽ được HĐH và các ứng dụng khác sử dụng một phần và giả sử nó là 4GB. RAM còn lại là 28GB và nó sẽ được sử dụng chủ yếu cho bộ đệm tệp. Trong 28 GB đó, chúng tôi có thể lưu trữ gần như toàn bộ cơ sở dữ liệu đã nén. Hiệu suất tổng thể của MongoDB sẽ rất tuyệt vì hầu hết thời gian nó sẽ không đọc từ đĩa. Chỉ 2GB dữ liệu tệp nén không được lưu trữ trên Bộ đệm tệp. Hoặc 8GB trong số 120GB không nén như một cách nhìn khác. Vì vậy, khi có quyền truy cập trên một trang không nằm trong số 32 GB trong  WTC tại thời điểm đó, IO sẽ đọc một khối đĩa rất có thể từ Bộ đệm tệp thay vì thực hiện truy cập đĩa thực. Độ trễ tốt hơn ít nhất gấp 10 lần, có thể là 100 lần. Điều đó thật tuyệt vời

Nhiều mongod trên cùng một máy là xấu

Như tôi đã đề cập, mọi người ghét nhìn thấy bộ nhớ (dường như) chưa được cấp phát đó trên hệ thống của họ. Không phải ai có quan niệm sai lầm đó đều tăng WTC, đôi khi họ coi đây là cơ hội để thêm các mongod khác vào cùng một hộp, để sử dụng bộ nhớ không sử dụng đó

Nhiều quy trình mongod cũng muốn tất cả nội dung tệp đĩa của chúng được hệ điều hành lưu vào bộ nhớ cache. Bạn có thể giới hạn kích thước của WTC, nhưng bạn không thể ảnh hưởng đến các yêu cầu đối với đĩa và việc sử dụng bộ đệm tệp. Điều này gây ra ít bộ nhớ hơn được sử dụng cho bộ đệm tệp cho bất kỳ quy trình mongod nào kích hoạt IO đĩa thực hơn. Ngoài ra, các quy trình sẽ cạnh tranh để truy cập các tài nguyên khác, như CPU

Một vấn đề khác là nhiều quy trình mongod làm cho việc khắc phục sự cố trở nên phức tạp hơn. Sẽ không đơn giản để xác định nguyên nhân cốt lõi của bất kỳ vấn đề nào. Mongodb nào đang sử dụng nhiều bộ nhớ hơn cho bộ đệm tệp?

Việc khắc phục sự cố có thể được giải quyết dễ dàng hơn trên một máy chuyên dụng khi chạy một mongod duy nhất

Nếu một trong các mongod bị điên và sử dụng nhiều thời gian và bộ nhớ CPU hơn, thì tất cả các mongod trên máy sẽ chậm lại do có ít tài nguyên hơn trong hệ thống

Cuối cùng, đừng bao giờ triển khai nhiều mongod trên cùng một máy. Cuối cùng, bạn có thể xem xét Docker container. Chạy mongod trong vùng chứa, bạn có thể giới hạn dung lượng bộ nhớ mà nó có thể sử dụng. Trong trường hợp như vậy, hãy tính toán tổng dung lượng bộ nhớ bạn cần cho máy chủ và dung lượng bộ nhớ dự trữ cho bất kỳ vùng chứa nào để có được hiệu suất tốt nhất có thể cho mongod

Không nên có WTC rất lớn

Tăng WTC đáng kể, hơn 50% mặc định, cũng là một thói quen xấu

Với bộ đệm lớn hơn, bạn có thể lưu trữ nhiều dữ liệu không nén hơn nhưng đồng thời, bạn để lại một ít bộ nhớ cho bộ đệm tệp. Nhiều truy vấn hơn có thể được hưởng lợi từ WTC lớn hơn nhưng khi bị trục xuất, mongod có thể kích hoạt nhiều truy cập đĩa thực làm chậm cơ sở dữ liệu

Vì lý do này, trong hầu hết các trường hợp, không nên tăng WTC cao hơn 50% mặc định. Mục tiêu là tiết kiệm đủ dung lượng để đệm các khối đĩa vào bộ nhớ. Điều này có thể giúp bạn có được hiệu suất rất tốt và ổn định hơn

Phần kết luận

Khi bạn nghĩ về mongod, bạn phải coi đó là quá trình duy nhất đang vận hành trong vũ trụ. Nó cố gắng sử dụng nhiều bộ nhớ nhất có thể. Nhưng có hai bộ đệm – bộ đệm WT (tài liệu không nén) và bộ đệm tệp (của các tệp nén của WiredTiger) và hiệu suất sẽ bị ảnh hưởng nếu bạn bỏ đói cái này cho cái kia

Không bao giờ triển khai nhiều mongods vào cùng một hộp hoặc ít nhất là xem xét các thùng chứa. Đối với WTC, hãy nhớ rằng hầu hết thời gian kích thước mặc định (tối đa 50% RAM) hoạt động tốt

Phân phối Percona cho MongoDB là giải pháp thay thế cơ sở dữ liệu MongoDB có sẵn miễn phí, cung cấp cho bạn một giải pháp duy nhất kết hợp các thành phần doanh nghiệp quan trọng và tốt nhất từ ​​cộng đồng nguồn mở, được thiết kế và thử nghiệm để hoạt động cùng nhau

MongoDB có lưu trữ dữ liệu trong bộ nhớ không?

Bắt đầu từ MongoDB Enterprise phiên bản 3. 2. 6, công cụ lưu trữ trong bộ nhớ là một phần của tính khả dụng chung (GA) trong các bản dựng 64 bit. Ngoài một số siêu dữ liệu và dữ liệu chẩn đoán, công cụ lưu trữ trong bộ nhớ không duy trì bất kỳ dữ liệu nào trên đĩa, bao gồm dữ liệu cấu hình, chỉ mục, thông tin đăng nhập của người dùng, v.v.

Dữ liệu MongoDB được lưu trữ ở đâu?

Để kiểm tra tương tự, bạn có thể tìm cài đặt dbPath trong tệp cấu hình mongodb. .
Trên Linux, vị trí là /etc/mongod. conf , nếu bạn đã sử dụng trình quản lý gói để cài đặt MongoDB. .
On Windows, the location is /bin/mongod. .. .
Trên macOS, vị trí là /usr/local/etc/mongod

Dữ liệu MongoDB được lưu trữ như thế nào?

MongoDB lưu trữ dữ liệu và chỉ mục trên đĩa ở định dạng nhị phân được nén .

MongoDB đang sử dụng bao nhiêu bộ nhớ?

Và theo mặc định, MongoDB sẽ dự trữ 50% bộ nhớ khả dụng – 1 GB cho bộ đệm WiredTiger hoặc 256 MB, tùy theo giá trị nào lớn hơn . Ví dụ: một hệ thống có 16 GB RAM, sẽ có kích thước bộ đệm WiredTiger là 7. 5 GB. Kích thước của bộ đệm này rất quan trọng để đảm bảo WiredTiger hoạt động hiệu quả.