MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Sửa lỗi trang trong MongoDB

Lỗi trang là một lỗi phổ biến chủ yếu xảy ra trong một ứng dụng lớn liên quan đến dữ liệu lớn. Nó diễn ra khi cơ sở dữ liệu MongoDB đọc dữ liệu từ bộ nhớ vật lý chứ không phải từ bộ nhớ ảo. Lỗi lỗi trang xảy ra tại thời điểm MongoDB muốn lấy dữ liệu không có sẵn trong bộ nhớ hoạt động của cơ sở dữ liệu do đó buộc phải đọc từ đĩa. Điều này tạo ra độ trễ lớn cho các hoạt động thông lượng làm cho các truy vấn trông giống như bị trễ.

Điều chỉnh hiệu suất của MongoDB bằng cách điều chỉnh là một thành phần quan trọng giúp tối ưu hóa việc thực thi ứng dụng. Cơ sở dữ liệu được cải tiến để làm việc với thông tin được lưu trên đĩa, tuy nhiên nó thường lưu vào bộ nhớ cache một lượng lớn dữ liệu trong RAM để cố gắng truy cập vào đĩa. Việc lưu trữ và truy cập dữ liệu từ cơ sở dữ liệu rất tốn kém, do đó thông tin phải được lưu trữ trước trong đĩa trước khi cho phép các ứng dụng truy cập. Do thực tế là đĩa chậm hơn so với bộ nhớ cache dữ liệu RAM, do đó quá trình tiêu tốn một lượng thời gian đáng kể. Do đó, MongoDB được thiết kế để báo cáo sự cố xảy ra trên trang dưới dạng tóm tắt tất cả các sự cố trong một giây

Cấu trúc liên kết chuyển động dữ liệu trong MongoDB

Dữ liệu từ máy khách di chuyển đến bộ nhớ ảo nơi bộ đệm trang đọc nó khi nó được ghi, dữ liệu sau đó được lưu trữ trong đĩa như thể hiện trong sơ đồ bên dưới.

Cách Tìm Lỗi Trang MongoDB

Lỗi trang có thể được phát hiện thông qua khóa hiệu suất để đảm bảo tính nhất quán của dữ liệu trong MongoDB. Khi một hoạt động nhất định xếp hàng hoặc chạy trong một thời gian dài thì hiệu suất MongoDB giảm và hoạt động chậm lại khi chờ khóa. Điều này dẫn đến sự chậm lại vì sự chậm trễ liên quan đến khóa diễn ra lẻ tẻ và đôi khi ảnh hưởng đến hiệu suất của ứng dụng. Khóa ảnh hưởng đến hiệu suất của một ứng dụng khi các khóa được phân chia (lock.timeAcquiringMicros bởi lock.acquireWaitCount), điều này mang lại thời gian trung bình để chờ một chế độ khóa nhất định. Locks.deadLockCount cung cấp tổng số tất cả các bế tắc mua lại khóa đã trải qua. Cho rằng globalLock.totalTime cao một cách hài hòa thì có rất nhiều yêu cầu mong đợi một khóa. Khi nhiều yêu cầu chờ khóa hơn, RAM được tiêu thụ nhiều hơn và điều này dẫn đến Lỗi trang.

Bạn cũng có thể sử dụng mem.mapped để cho phép các nhà phát triển xem xét kỹ lưỡng tổng bộ nhớ mà mongod đang sử dụng. Mem.mapped là một nhà điều hành máy chủ để kiểm tra dung lượng bộ nhớ tính bằng megabyte (MB) trong công cụ lưu trữ MMAPv1. Nếu toán tử mem.mapped hiển thị một giá trị lớn hơn tổng dung lượng bộ nhớ hệ thống thì sẽ xảy ra lỗi trang vì sử dụng lượng bộ nhớ lớn như vậy sẽ dẫn đến lỗi trang trong cơ sở dữ liệu.

Cách các lỗi trang xảy ra trong MongoDB

Tải trang trong MongoDB phụ thuộc vào khả năng cung cấp của bộ nhớ trống, trong trường hợp thiếu bộ nhớ trống thì hệ điều hành phải:

  1. Tìm trang mà cơ sở dữ liệu đã ngừng sử dụng và ghi trang đó vào đĩa nhớ.
  2. Tải trang được yêu cầu vào bộ nhớ sau khi đọc từ đĩa.

Hai hoạt động này diễn ra khi các trang đang tải và do đó tiêu tốn rất nhiều thời gian so với việc đọc trong bộ nhớ đang hoạt động dẫn đến việc xảy ra lỗi trang.

Giải quyết Lỗi Trang MongoDB

Sau đây là một số cách có thể giải quyết các lỗi trang:

  1. Chia tỷ lệ theo chiều dọc cho các thiết bị có đủ RAM hoặc chia theo chiều ngang:Khi không có đủ RAM cho một tập dữ liệu nhất định thì cách tiếp cận đúng là tăng bộ nhớ RAM bằng cách mở rộng theo chiều dọc cho các thiết bị có nhiều RAM hơn để thêm nhiều tài nguyên hơn vào máy chủ. Chia tỷ lệ dọc là một trong những cách tốt nhất và dễ dàng để tăng hiệu suất MongoDB bằng cách không phân tán tải giữa nhiều máy chủ. Inasmuch khi mở rộng theo chiều dọc sẽ bổ sung nhiều RAM hơn, mở rộng theo chiều ngang cho phép thêm nhiều phân đoạn hơn vào một cụm phân đoạn. Nói một cách dễ hiểu, chia tỷ lệ theo chiều ngang là nơi cơ sở dữ liệu được chia thành nhiều phần khác nhau và được lưu trữ trong nhiều máy chủ. Việc mở rộng quy mô theo chiều ngang cho phép nhà phát triển thêm nhiều máy chủ hơn và điều này làm tăng hiệu suất cơ sở dữ liệu lên rất nhiều vì nó không phải chịu thời gian chết bằng không. Tỷ lệ theo chiều dọc và tỷ lệ theo chiều ngang làm giảm khả năng xảy ra lỗi của trang bằng cách tăng bộ nhớ mà một trang hoạt động trong khi làm việc với cơ sở dữ liệu.
  2. Lập chỉ mục dữ liệu đúng cách:Sử dụng các chỉ mục thích hợp để đảm bảo rằng có các truy vấn hiệu quả mà không gây ra việc quét thu thập. Việc lập chỉ mục phù hợp đảm bảo rằng cơ sở dữ liệu không lặp lại từng tài liệu trong một bộ sưu tập và do đó giải quyết được lỗi lỗi trang có thể xảy ra. Quét bộ sưu tập gây ra lỗi lỗi trang vì toàn bộ bộ sưu tập được công cụ truy vấn kiểm tra khi nó được đọc vào RAM. Hầu hết các tài liệu trong quá trình quét bộ sưu tập không được trả lại trong ứng dụng và do đó gây ra các lỗi trang không cần thiết cho mỗi truy vấn tiếp theo mà không dễ gì tránh được. Ngoài ra, chỉ số dư thừa cũng có thể dẫn đến việc sử dụng RAM không hiệu quả điều này có thể dẫn đến lỗi lỗi trang. Do đó, lập chỉ mục thích hợp là điều tối quan trọng nếu một nhà phát triển có ý định giải quyết các lỗi lỗi trang. MongoDB cung cấp hỗ trợ trong việc xác định các chỉ mục mà người ta nên triển khai khi sử dụng cơ sở dữ liệu. Họ cung cấp cả Trình phân tích truy vấn chậm cung cấp thông tin cần thiết về cách lập chỉ mục cho người dùng và người dùng được chia sẻ.
  3. Di chuyển sang phiên bản MongoDB mới nhất, sau đó chuyển ứng dụng sang WiredTiger. Điều này là cần thiết nếu bạn có ý định tránh gặp phải lỗi lỗi trang vì lỗi trang chỉ phổ biến trong các công cụ lưu trữ MMAPv1 chứ không phải các phiên bản mới hơn và WiredTiger. Công cụ lưu trữ MMAPv1 đã không được dùng nữa và MongoDB không còn hỗ trợ nó nữa. WiredTiger là công cụ lưu trữ mặc định hiện tại trong MongoDB và nó có MultiVersion Concurrency Control, điều này làm cho nó tốt hơn nhiều so với công cụ lưu trữ MMAPv1. Với WiredTiger MongoDB có thể sử dụng cả bộ đệm ẩn của hệ thống tệp và bộ đệm bên trong WiredTiger có kích thước rất lớn là 1GB (50% 0f (RAM - 1GB)) hoặc 256 MB.
  4. Theo dõi tổng số RAM có sẵn để sử dụng trong hệ thống của bạn. Điều này có thể được thực hiện bằng cách sử dụng các dịch vụ như Giám sát di tích mới của Google Cloud Giám sát. Hơn nữa, BindPlane có thể được sử dụng với các dịch vụ giám sát đám mây đã đề cập. Sử dụng hệ thống giám sát là một biện pháp chủ động cho phép người ta chống lại các lỗi trang trước khi chúng xảy ra thay vì phản ứng với các lỗi trang xảy ra. BindPlane cho phép người giám sát thiết lập cảnh báo liên tục khi xảy ra lỗi trang, cảnh báo cũng giúp người xem biết số lượng chỉ mục, kích thước chỉ mục và kích thước tệp.
  5. Đảm bảo rằng dữ liệu được định cấu hình thành bộ hoạt động phổ biến và sẽ không sử dụng nhiều RAM hơn mức khuyến nghị. MongoDB là một hệ thống cơ sở dữ liệu hoạt động tốt nhất khi dữ liệu được truy cập thường xuyên và các chỉ mục có thể hoàn toàn phù hợp trong Bộ nhớ được gán. Kích thước RAM là một khía cạnh quan trọng khi tối ưu hóa hiệu suất của cơ sở dữ liệu, do đó người ta phải đảm bảo rằng luôn có đủ bộ nhớ RAM trước khi triển khai ứng dụng.
  6. Phân phối tải giữa các phiên bản mongod bằng cách thêm các phân đoạn hoặc triển khai một cụm phân đoạn. Điều quan trọng là cho phép tạo bóng ở nơi đặt bộ sưu tập được nhắm mục tiêu. Đầu tiên, kết nối với mongos trong mongo shell và sử dụng phương pháp bên dưới.
    1. sh.shardCollection()

      Sau đó, tạo một chỉ mục bằng phương pháp này.

      ​db.collection.createIndex(keys, options)
      Chỉ mục được tạo hỗ trợ khóa phân đoạn, nghĩa là nếu bộ sưu tập được tạo đã nhận hoặc lưu trữ một số dữ liệu. Tuy nhiên, nếu bộ sưu tập không có dữ liệu (trống) thì hãy sử dụng phương pháp bên dưới để lập chỉ mục nó như một phần của ssh.shardCollection:sh.shardCollection ()
    2. Tiếp theo là một trong hai chiến lược do mongoDB cung cấp.
      1. Tô bóng băm
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. Đổ bóng dựa trên phạm vi
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

Cách Ngăn Lỗi Trang MongoDB

  1. Thêm phân đoạn hoặc triển khai cụm phân đoạn để phân phối tải
  2. Có đủ RAM cho ứng dụng của bạn trước khi triển khai nó
  3. Di chuyển sang phiên bản MongoDB mới hơn, sau đó chuyển sang WiredTiger
  4. Chia tỷ lệ theo chiều dọc hoặc chiều ngang cho thiết bị có nhiều RAM hơn
  5. Sử dụng RAM được đề xuất và theo dõi dung lượng RAM đã sử dụng

Kết luận

Một số lỗi trang (Một mình) mất một thời gian ngắn. Tuy nhiên, trong tình huống có nhiều lỗi trang (tổng hợp), đó là dấu hiệu cho thấy cơ sở dữ liệu đang đọc một số lượng lớn dữ liệu trong Cái đĩa. Khi tổng hợp xảy ra, sẽ có nhiều khóa đọc MongoBD hơn dẫn đến lỗi trang.

Khi sử dụng MongoDB, dung lượng RAM của hệ thống và số lượng truy vấn có thể ảnh hưởng lớn đến hiệu suất ứng dụng. Hiệu suất của một ứng dụng trong MongoDB phụ thuộc rất nhiều vào RAM có sẵn trên bộ nhớ vật lý, điều này ảnh hưởng đến thời gian ứng dụng thực hiện một truy vấn duy nhất. Với đủ RAM, khả năng xảy ra lỗi trang sẽ giảm và hiệu suất ứng dụng được nâng cao.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB giới hạn độ sâu trường đối tượng lồng nhau

  2. Các phương pháp hay nhất để sao lưu cơ sở dữ liệu

  3. Làm cách nào để xóa các bản sao dựa trên một khóa trong Mongodb?

  4. Định cấu hình Xác thực MongoDB-CR làm Mặc định trên MongoDB 3.x

  5. Khớp với một trường mảng có chứa bất kỳ kết hợp nào của mảng được cung cấp trong MongoDB