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

Những điều cần biết khi bắt đầu làm việc với MongoDB trong sản xuất - Mười lời khuyên

Học MongoDB đòi hỏi rất nhiều tư duy chính xác. Việc cân nhắc rất ít thường không được thực hiện trong các cam kết thiết yếu có thể gây nguy hiểm cho hiệu suất của cơ sở dữ liệu trong chế độ sản xuất.

MongoDB là một DBMS NoSQL theo nghĩa đen theo một mẫu khác với cơ sở dữ liệu SQL, đặc biệt là dọc theo các dòng bảo mật và cấu trúc. Mặc dù một số tính năng được tích hợp phát huy hiệu suất của nó và làm cho nó trở thành một trong những tính năng tốt nhất trong thời gian gần đây, một số tính năng do đó gây ra các mối đe dọa tiềm ẩn có thể làm hỏng hiệu suất của nó nếu không được tính đến.

Trong trải nghiệm "trường hợp xấu nhất" gần đây, tôi đang cố gắng truy vấn bộ sưu tập với các tài liệu có mảng lớn và phải mất nhiều thời gian để tôi lấy lại kết quả. Tôi quyết định viết blog này vì tôi biết nếu ai đó gặp phải những vấn đề tương tự như vậy thì blog này sẽ giúp ích rất nhiều.

Những Cân nhắc Chính đối với MongoDB trong Sản xuất

  1. Bảo mật và xác thực.
  2. Lập chỉ mục tài liệu của bạn
  3. Sử dụng giản đồ trong bộ sưu tập của bạn
  4. Bộ sưu tập có giới hạn
  5. Kích thước tài liệu
  6. Kích thước mảng cho các tài liệu được nhúng
  7. Các giai đoạn của quy trình tổng hợp
  8. Thứ tự các khóa trong đối tượng băm
  9. "undefined" và "null" trong MongoDB
  10. Thao tác viết

Bảo mật và xác thực MongoDB

Dữ liệu khác nhau theo nhiều cách và bạn rõ ràng sẽ cần giữ bí mật một số thông tin. Theo mặc định, cài đặt MongoDB không đặt yêu cầu xác thực là bắt buộc nhưng điều đó không giúp bạn tiếp tục sử dụng nó, đặc biệt khi có liên quan đến dữ liệu bí mật như hồ sơ tài chính và y tế. Trên một máy trạm phát triển, đó không phải là vấn đề lớn nhưng vì có sự tham gia của nhiều người dùng trong chế độ sản xuất, nên việc thiết lập các chứng chỉ xác thực là một thông lệ tốt. Phương pháp phổ biến và dễ sử dụng nhất là thông tin đăng nhập Tên người dùng và Mật khẩu MongoDB mặc định.

Dữ liệu được ghi vào các tệp có thể được truy cập thông qua một công cụ của bên thứ ba nhiều hơn, vì vậy nếu chúng không được mã hóa. Dữ liệu có thể bị thay đổi mà bạn không biết nếu một số người ẩn danh truy cập vào các tệp hệ thống. Lưu trữ cơ sở dữ liệu trên một máy chủ chuyên dụng và chỉ định một người dùng duy nhất có toàn quyền truy cập vào các tệp dữ liệu sẽ giúp bạn tiết kiệm được thủ thuật.

Bảo vệ dữ liệu khỏi các cuộc tấn công từ bên ngoài cũng là một việc cần thiết. Một số toán tử như $ group, $ theo đó và các hoạt động mapReduce là javascript (js) được phát triển do đó dễ bị thao túng js. Do đó, để tránh bất kỳ trường hợp nào về tính toàn vẹn dữ liệu, bạn có thể tắt cài đặt JS tùy ý bằng cách định cấu hình tham số javascriptEnabled:false trong tệp cấu hình nếu bạn chưa sử dụng bất kỳ toán tử nào được đề cập. Hơn nữa, bạn có thể giảm nguy cơ truy cập dữ liệu do vi phạm mạng bằng cách sử dụng một số quy trình được đánh dấu trong Danh sách kiểm tra bảo mật của MongoDB.

Lập chỉ mục tài liệu của bạn

Lập chỉ mục thường chỉ định một giá trị nhận dạng duy nhất cho mỗi tài liệu trong bộ sưu tập MongoDB. Lập chỉ mục mang lại nâng cấp hiệu suất trong cả hoạt động đọc và ghi. Theo mặc định, nó được bật và người ta phải luôn duy trì cài đặt đó. Nếu không lập chỉ mục, cơ sở dữ liệu phải kiểm tra qua nhiều tài liệu từ đầu đến cuối và tiếc là hoạt động sẽ tốn thời gian đối với các tài liệu về cuối, gây ra độ trễ kém cho truy vấn. Tại một số điểm, trên phần cuối ứng dụng, người dùng có thể gặp phải tình trạng giật lag và có thể nghĩ rằng ứng dụng thực sự không hoạt động. Lập chỉ mục rất hữu ích trong các hoạt động truy vấn sắp xếp và tra cứu, không bỏ sót chính hoạt động tìm kiếm. Sắp xếp là một thao tác phổ biến đối với nhiều tài liệu được trả về. Nó thường được thực hiện như là giai đoạn cuối cùng sau khi tài liệu đã được lọc để có một lượng nhỏ dữ liệu cần được sắp xếp. Một chỉ mục trong trường hợp này sẽ giúp sắp xếp dữ liệu theo bản chất của mục nhập và hạn chế dữ liệu trả về ở giới hạn 32MB. Nếu không có lập chỉ mục, có khả năng giới hạn bộ nhớ 32 trên kích thước tổng hợp của các tài liệu được trả về sẽ bị vượt quá và bất cứ khi nào cơ sở dữ liệu đạt đến giới hạn này, nó sẽ gây ra lỗi bên cạnh việc trả về một tập hợp bản ghi trống.

$ thao tác tra cứu cũng được hỗ trợ tốt với việc lập chỉ mục tại chỗ. Chỉ mục về giá trị khóa được sử dụng làm khóa ngoại là điều cần thiết cho quá trình xử lý các giai đoạn trước.

Sử dụng Lược đồ trong Bộ sưu tập của bạn

MongoDB không cần xác định trường (cột) giống như nó có thể yêu cầu bạn thực hiện đối với dbms SQL. Tuy nhiên, bạn sẽ không cần phải xác định các trường, để tránh sự không nhất quán của dữ liệu và một số trở ngại có thể phát sinh, việc xác định một lược đồ luôn là một phương pháp hay. Thiết kế lược đồ cho phép bạn xác định loại dữ liệu nào chuyển đến một trường nhất định, trường nào phải được cung cấp giá trị và thường nâng cao xác thực dữ liệu trước khi nhập hoặc cập nhật, do đó thúc đẩy tính toàn vẹn và nhất quán của dữ liệu. Thiết kế lược đồ cũng sẽ hướng dẫn bạn xem nên tham chiếu hay nhúng dữ liệu. Là người mới bắt đầu, bạn có thể nghĩ rằng mô hình duy nhất sẽ là “One -to-N” sẽ tạo điều kiện cho người ta có các mục nhập mảng tài liệu phụ nhưng không phải vậy.

Bạn cần hiểu mối quan hệ cơ bản giữa các tài liệu trước khi tạo mô hình của mình. Một số quy tắc sẽ giúp bạn có một lược đồ tối ưu là:

  1. Để giảm số lượng truy vấn mà bạn sẽ cần thực hiện trước khi truy cập vào một số dữ liệu và nếu có liên quan đến một số trường hoặc phần tử mảng, thì bạn có thể nhúng các tài liệu con. Lấy ví dụ về mô hình dưới đây:
    1. {
       Name: ‘John Doh’,
       Age:20
       Addresses:[
         {street: ‘Moi Avenue’, city:’Nairobi’, countryCode: ‘KE’},
         {street: ‘Kenyatta Avenue’, city:’Nairobi’, countryCode: ‘KE’},
       ]
      }
      
  2. Đối với các tài liệu được cập nhật thường xuyên, hãy sử dụng chuẩn hóa. Nếu bất kỳ trường nào sẽ được cập nhật thường xuyên, thì sẽ có nhiệm vụ tìm tất cả các trường hợp cần được cập nhật. Điều này sẽ dẫn đến việc xử lý truy vấn chậm, do đó lấn át ngay cả những giá trị liên quan đến việc không chuẩn hóa.
  3. Các truy vấn phức tạp như kết hợp tổng hợp mất nhiều thời gian hơn để thực thi khi nhiều tài liệu con có liên quan và cần phải tìm nạp một tài liệu riêng.
  4. Rõ ràng là không nên nhúng các phần tử mảng có tập dữ liệu đối tượng lớn vì thực tế là chúng có thể phát triển và do đó vượt quá kích thước tài liệu.

Mô hình của một lược đồ thường được xác định bởi mẫu truy cập ứng dụng. Bạn có thể tìm thêm các quy trình có thể trợ giúp trong việc thiết kế mô hình của mình trong blog 6 Quy tắc ngón tay cái cho Thiết kế lược đồ MongoDB

Sử dụng Bộ sưu tập có Giới hạn cho Mức độ ưu tiên của Tài liệu Gần đây

MongoDB cung cấp rất nhiều tài nguyên như bộ sưu tập giới hạn. Thật không may, một số cuối cùng không được sử dụng. Bộ sưu tập có giới hạn có kích thước cố định và được biết là hỗ trợ các hoạt động thông lượng cao chèn và truy xuất tài liệu dựa trên thứ tự chèn. Khi không gian của nó được lấp đầy, các tài liệu cũ sẽ bị xóa để nhường chỗ cho những tài liệu mới.

Ví dụ về trường hợp sử dụng bộ sưu tập giới hạn:

  • Lưu vào bộ nhớ đệm dữ liệu được truy cập thường xuyên vì bản thân bộ sưu tập có dung lượng đọc hơn là ghi nhiều. Bạn cần đảm bảo bộ sưu tập luôn hoạt động hiệu quả.
  • Ghi nhật ký thông tin cho các hệ thống có khối lượng lớn. Bộ sưu tập có giới hạn thường không sử dụng chỉ mục và điều này có ưu điểm là tốc độ ghi khá nhanh giống như ghi vào tệp.

Chú ý đến Kích thước Tài liệu MongoDB

Mọi tài liệu MongoDB được giới hạn ở kích thước 16 megabyte. Tuy nhiên, việc tài liệu đạt hoặc đạt đến giới hạn này là tối ưu vì nó sẽ gây ra một số vấn đề về hiệu suất nghiêm trọng. Bản thân MongoDB hoạt động tốt nhất khi kích thước của tài liệu là vài kilobyte. Nếu tài liệu có kích thước đủ lớn, một yêu cầu chiếu phức tạp sẽ mất nhiều thời gian và truy vấn có thể hết thời gian.

Chú ý đến Kích thước Mảng của Tài liệu Nhúng

Người ta có thể đẩy các tài liệu con vào một trường trong tài liệu, do đó tạo ra một giá trị mảng trên trường này. Như đã đề cập trước đây, bạn cần giữ kích thước của các subocument thấp. Điều quan trọng không kém là đảm bảo số phần tử của mảng dưới bốn hình. Nếu không, tài liệu sẽ phát triển vượt quá kích thước của nó và nó sẽ cần được định vị lại trong đĩa. Một vấn đề khác liên quan đến hoạt động như vậy là mọi tài liệu sẽ cần được lập chỉ mục lại. Bên cạnh đó, mỗi tiểu tài liệu sẽ cần được lập chỉ mục lại. Điều này có nghĩa là sẽ có rất nhiều chỉ mục ghi dẫn đến hoạt động chậm. Đối với kích thước tài liệu con lớn, điều quan trọng hơn là giữ các bản ghi trong một bộ sưu tập mới hơn là nhúng.

Các giai đoạn của Đường ống Tổng hợp

Bên cạnh các hoạt động truy vấn MongoDB thông thường, có một khung tổng hợp được sử dụng để thao tác và trả về dữ liệu theo một số thông số kỹ thuật như sắp xếp và nhóm. MongoDB không có trình tối ưu hóa truy vấn do đó cần một trình tối ưu hóa truy vấn để sắp xếp các truy vấn một cách thích hợp. Với khuôn khổ tổng hợp, đảm bảo các giai đoạn đường ống được sắp xếp tốt. Bắt đầu bằng cách giảm lượng dữ liệu bạn xử lý bằng cách sử dụng toán tử $ match và cuối cùng có thể là $ sort nếu cần sắp xếp. Bạn có thể sử dụng các công cụ của bên thứ ba như Studio 3T để tối ưu hóa truy vấn tổng hợp trước khi tích hợp nó vào mã của bạn. Công cụ này cho phép bạn xem dữ liệu đầu vào và đầu ra trong bất kỳ giai đoạn nào, do đó biết bạn đang xử lý những gì.

Sử dụng $ giới hạn và $ sort sẽ luôn cho kết quả giống nhau mỗi khi thực thi truy vấn. Trong trường hợp bạn sử dụng $ limit, dữ liệu trả về sẽ không xác định và có thể gây ra một số vấn đề khó theo dõi.

Kiểm tra Thứ tự các Khóa trong Đối tượng Băm

Cân nhắc có hai tài liệu lớn với dữ liệu mẫu

{

   FirstName: ‘John’,

   LastName: ‘Doh’

}

Nếu bạn thực hiện thao tác tìm với truy vấn {FirstName:'John', LastName:'Doh'}, thao tác này không khớp với truy vấn {LastName:'Doh' FirstName:'John' }. Do đó, bạn cần duy trì thứ tự của các cặp tên và giá trị trong tài liệu của mình.

Tránh "undefined" và "null" trong MongoDB

MongoDB sử dụng định dạng BSON cho các tài liệu của nó. Với xác thực JSON, "undefined" không được hỗ trợ và bạn nên tránh sử dụng nó. $ null là một giải pháp nhưng bạn cũng nên tránh nó.

Cân nhắc Thao tác Viết

Bạn có thể đặt MongoDB để ghi tốc độ cao nhưng điều này gây ra một trở ngại trong đó, phản hồi được trả về ngay cả trước khi dữ liệu được ghi. Journalling nên được kích hoạt để tránh trường hợp này. Ngoài ra, trong trường hợp cơ sở dữ liệu bị hỏng, dữ liệu sẽ vẫn có sẵn và nó sẽ tạo ra một điểm kiểm tra có thể được sử dụng trong quá trình khôi phục. Cấu hình cho khoảng thời gian viết nhật ký có thể được đặt bằng tham số commitIntervalMs.

Kết luận

Hệ thống cơ sở dữ liệu cần đảm bảo tính toàn vẹn và nhất quán của dữ liệu bên cạnh khả năng chống lại sự cố và ác ý. Tuy nhiên, để đạt được các yếu tố này, người ta cần phải hiểu chính cơ sở dữ liệu và dữ liệu mà nó nắm giữ. MongoDB sẽ hoạt động tốt khi các yếu tố được đề cập ở trên được tính đến. Điều tối quan trọng của việc họ là sử dụng một lược đồ. Một lược đồ cho phép bạn xác thực dữ liệu của mình trước khi nhập hoặc cập nhật và cách bạn sẽ lập mô hình dữ liệu này. Mô hình hóa dữ liệu thường được điều khiển bởi mô hình trợ năng của ứng dụng. Tất cả những điều này được tổng hợp lại sẽ mang lại hiệu suất cơ sở dữ liệu tốt hơn.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB findAndModify ()

  2. Làm cách nào để đổi tên các trường khi thực hiện tìm kiếm / chiếu trong MongoDB?

  3. Sự khác biệt giữa id và _id trong mongoose là gì?

  4. Những lý do nên và không nên chuyển từ máy chủ SQL sang MongoDB

  5. Tổng quan về MongoDB Atlas:Phần thứ hai