MongoDB Shending và các thực tiễn tốt nhất là gì?

Làm thế nào để mở rộng quy mô MongoDB? Các thực hành shending tốt nhất là gì?


Mặc dù lược đồ linh hoạt là cách mà hầu hết mọi người làm quen với MongoDB, nhưng nó cũng là một trong những cơ sở dữ liệu tốt nhất (thậm chí có thể là tốt nhất khi nói đến các ứng dụng hàng ngày) để xử lý các tập dữ liệu rất lớn. Mặc dù sự biện minh của lập luận này đòi hỏi cả một bài viết (tôi hy vọng tôi có thể tìm thấy thời gian cho nó vào một ngày nào đó!), Ý tưởng chung là các giải pháp dựa trên SQL không hỗ trợ shending và xây dựng nó trên cơ sở của bạn.

Điều tốt nhất bạn có thể hy vọng là tạo ra một cụm (không liên quan gì đến việc bảo vệ một cách cơ bản).

Trong bài viết này, chúng tôi sẽ xem xét một trong những kỹ thuật cần thiết cho mở rộng cơ sở dữ liệu theo chiều ngang: shending, cho MongoDB và đề xuất một số thực tiễn tốt nhất cho cùng. Tuy nhiên, tôi cảm thấy nó tốt hơn khi bắt đầu với những điều cơ bản về shending, bởi vì nhiều người đang tìm cách mở rộng quy mô MongoDB có thể không quen thuộc lắm với nó.

Tuy nhiên, nếu bạn biết về shending, hãy lướt qua phần tiếp theo.

Khái niệm cơ bản

Bạn có thể đã nhận thấy việc sử dụng từ ngữ ngang dọc trong đoạn cuối cùng từ phần trước. Không cần phóng vào một đường vòng lớn khác, tôi muốn nhanh chóng đưa điểm này lên. Chia tỷ lệ được coi là có hai loại: bạn có thể có một máy mạnh hơn với dung lượng lưu trữ cao hơn (theo chiều dọc) hoặc bạn kết nối một số máy tính nhỏ hơn và tạo thành một bộ sưu tập (ngang).

Bây giờ, do các máy chủ tốt nhất hiện tại không có nhiều hơn 256 GB RAM hoặc 16 TB ổ cứng, bạn sẽ sớm gặp phải một bức tường gạch khi cố gắng mở rộng theo chiều dọc (hoặc tăng tỷ lệ, theo thuật ngữ). Tuy nhiên, bạn có thể kết nối nhiều máy đơn lẻ với nhau (ít nhất là về mặt lý thuyết) và dễ dàng vượt qua giới hạn này.

Tất nhiên, thách thức bây giờ là phối hợp giữa tất cả các máy này.

Cơ sở dữ liệu

Thuật ngữ shending liền thường áp dụng cho cơ sở dữ liệu, ý tưởng là một máy duy nhất không bao giờ có thể đủ để chứa tất cả dữ liệu. Khi shending, cơ sở dữ liệu được chia nhỏ thành các khối riêng biệt nằm trên các máy khác nhau. Một ví dụ đơn giản có thể là: giả sử một doanh nghiệp có máy móc có thể lưu trữ tới 2 triệu mục dữ liệu khách hàng. Giờ đây, doanh nghiệp đang đạt đến điểm đột phá đó và có khả năng sẽ sớm vượt qua 2,5 triệu người dùng. Vì vậy, họ quyết định chia cơ sở dữ liệu của họ thành hai:

Và kỳ diệu thay, công suất hệ thống đã tăng gấp đôi!

Chà, nếu chỉ có cuộc sống là đơn giản! ��

Những thách thức trong việc bảo vệ cơ sở dữ liệu

Ngay khi bạn đang suy nghĩ một chút sâu sắc về việc bảo vệ, một số thách thức bất chính đằng sau cái đầu xấu xí của họ.

Không có khóa chính

Ngay khi bạn bước ra khỏi một cơ sở dữ liệu, các khóa chính sẽ mất đi ý nghĩa của chúng. Ví dụ: nếu các khóa chính của bạn được đặt thành tự động tăng và bạn di chuyển một nửa dữ liệu sang cơ sở dữ liệu khác, thì giờ đây, bạn sẽ có hai mục dữ liệu khác nhau cho mỗi khóa chính.

Không có khóa ngoại

Vì không có hỗ trợ trong cơ sở dữ liệu để trỏ đến các thực thể bên ngoài cơ sở dữ liệu hiện tại (tốt, ngay cả một cơ sở dữ liệu khác trên cùng một máy cũng không được hỗ trợ, vì vậy hãy quên cơ sở dữ liệu trên một máy khác), khái niệm khóa ngoại sẽ bị bỏ qua tốt. Đột nhiên, cơ sở dữ liệu trở nên ngu ngốc, dữ liệu và tính toàn vẹn dữ liệu là vấn đề của bạn.

Lỗi dữ liệu lạ

Nếu một máy bị hỏng, người dùng cuối có thể được hiển thị một Oops, một cái gì đó đã bị hỏng! Trang, chắc chắn sẽ gây khó chịu, nhưng cuộc sống sẽ đi đúng hướng sau một thời gian.

Bây giờ hãy xem xét những gì xảy ra trong một cơ sở dữ liệu phân chia. Giả sử cơ sở dữ liệu bị hủy trong ví dụ trước của chúng tôi là cơ sở dữ liệu ngân hàng và một khách hàng đang gửi tiền cho người khác. Chúng ta cũng giả sử dữ liệu khách hàng đầu tiên sống trong phân đoạn thứ nhất, trong khi dữ liệu của khách hàng thứ hai sống trong phân đoạn thứ hai (bạn thấy tôi đã đi đâu với điều này?!). Nếu máy chứa phân đoạn thứ hai không thành công, bạn có thể tưởng tượng hệ thống sẽ ở trạng thái nào không? Tiền giao dịch sẽ đi đâu? Người dùng đầu tiên sẽ nhìn thấy gì? Người dùng thứ hai sẽ nhìn thấy gì? Cả hai sẽ nhìn thấy gì khi các mảnh vỡ trở lại trực tuyến?

Quản lý giao dịch

Hãy cũng xem xét trường hợp quan trọng của quản lý giao dịch. Lần này, giả sử hệ thống đang hoạt động tốt 100%. Bây giờ, hai người (A và B) thanh toán cho người thứ ba (C). Nó rất có khả năng cả hai giao dịch sẽ đọc số dư tài khoản của C đồng thời, gây ra sự nhầm lẫn này:

  • Số dư tài khoản C sâu = $ 100.
  • Một giao dịch trên nền tảng đọc số dư của C: 100 đô la.
  • Giao dịch Bẻ đọc số dư C Cẩu: $ 100.
  • Một giao dịch trên cộng thêm $ 50 và số dư cập nhật: $ 100 + 50 = $ 150.
  • Giao dịch Bành thêm $ 50 và số dư cập nhật: $ 100 + 50 = $ 150.

Chỉ trích! $ 50 chỉ biến mất trong không khí mỏng!

Các hệ thống SQL truyền thống cứu bạn khỏi điều này bằng cách cung cấp quản lý giao dịch tích hợp, nhưng ngay khi bạn bước ra khỏi một máy duy nhất, bạn sẽ nướng bánh mì.

Quan điểm là, với các hệ thống như vậy, nó có thể dễ dàng gặp phải các vấn đề tham nhũng dữ liệu mà từ đó không thể phục hồi. Kéo tóc của bạn giành được sự giúp đỡ, một trong hai! ��

MongoDB Shending

Đối với các kiến ​​trúc sư phần mềm, sự phấn khích về MongoDB là rất nhiều trong lược đồ linh hoạt của nó, như trong hỗ trợ shending tích hợp của nó. Chỉ với một vài quy tắc và máy móc đơn giản được kết nối, bạn đã sẵn sàng để chạy một cụm MongoDB bị phân mảnh ngay lập tức.

Hình ảnh bên dưới cho thấy giao diện của ứng dụng web điển hình như thế nào.

Tín dụng hình ảnh: mongodb.com

Phần tốt nhất về sho MongoDB là việc cân bằng các phân đoạn là tự động. Đó là nếu bạn có năm phân đoạn và hai trong số chúng gần trống, bạn có thể nói với MongoDB để cân bằng lại mọi thứ theo cách mà tất cả các phân đoạn đều đầy đủ như nhau.

Là một nhà phát triển hoặc quản trị viên, bạn không cần phải lo lắng nhiều, vì MongoDB đằng sau hậu trường thực hiện hầu hết các công việc nặng nhọc. Tương tự như vậy đối với sự thất bại một phần của các nút; nếu bạn có các bộ bản sao được định cấu hình chính xác và chạy trên cụm của mình, việc ngừng hoạt động một phần sẽ giành được ảnh hưởng đến thời gian hoạt động của hệ thống.

Toàn bộ lời giải thích sẽ khá ngắn gọn, vì vậy tôi sẽ đóng phần này bằng cách nói rằng MongoDB có một số công cụ tích hợp để bảo vệ, sao chép và phục hồi, giúp các nhà phát triển xây dựng các ứng dụng quy mô lớn rất dễ dàng. Nếu bạn muốn có một hướng dẫn toàn diện hơn về các khả năng ngăn chặn MongoDB, thì tài liệu chính thức là nơi để được.

Bạn cũng có thể quan tâm đến điều này hoàn thành hướng dẫn nhà phát triển.

Thực hành tốt nhất của MongoDB Shending

Trong khi MongoDB và Google chỉ hoạt động ra khỏi hộp để shending, điều đó không có nghĩa là chúng ta có thể nghỉ ngơi trên vòng nguyệt quế của mình. Shending có thể thực hiện hoặc phá vỡ dự án của bạn mãi mãi, tùy thuộc vào mức độ nó được thực hiện tốt hay kém.

Hơn nữa, có rất nhiều chi tiết nhỏ để giải thích, thất bại trong đó, nó không phải là hiếm khi thấy các dự án sụp đổ. Mục đích không phải là làm bạn sợ, mà là để làm nổi bật nhu cầu lập kế hoạch và cực kỳ cẩn thận ngay cả với những quyết định nhỏ.

Khóa Shending chắc chắn kiểm soát shending trong MongoDB, vì vậy, thật lý tưởng khi chúng tôi bắt đầu cuộc khảo sát với điều đó.

Cardinality cao

Cardinality có nghĩa là số lượng biến thể. Chẳng hạn, một bộ sưu tập của một quốc gia yêu thích 1 triệu người sẽ có các biến thể thấp (chỉ có rất nhiều quốc gia trên thế giới!), Trong khi đó một bộ sưu tập các địa chỉ email của họ sẽ có (số lượng) cao. Tại sao nó quan trọng? Giả sử bạn chọn một lược đồ ngây thơ phân tách dữ liệu dựa trên tên người dùng.

Ở đây chúng tôi có một sự sắp xếp khá đơn giản; tài liệu đến được quét tên người dùng và tùy thuộc vào vị trí của chữ cái đầu tiên trong bảng chữ cái tiếng Anh, nó sẽ rơi vào một trong ba phân đoạn. Tương tự như vậy, việc tìm kiếm một tài liệu rất dễ dàng: ví dụ, các chi tiết cho (Peter Peter), chắc chắn sẽ có trong phân đoạn thứ hai.

Tất cả nghe có vẻ hay, nhưng vấn đề là, chúng tôi không thể kiểm soát tên của những người sử dụng tài liệu đến. Điều gì sẽ xảy ra nếu chúng ta chỉ nhận được tên trong phạm vi B đến F hầu hết thời gian? Nếu vậy, chúng tôi sẽ có cái mà Lừa gọi là một đoạn dữ liệu của Jumbo trong shard1: hầu hết dữ liệu hệ thống sẽ được tập trung ở đó, biến thiết lập thành một hệ thống cơ sở dữ liệu duy nhất.

Phương thuốc?

Chọn một khóa có số lượng thẻ cao – ví dụ: địa chỉ email của người dùng hoặc thậm chí bạn có thể sử dụng khóa phân đoạn tổng hợp, là sự kết hợp của nhiều trường.

Thay đổi đơn điệu

Một lỗi phổ biến trong shending MongoDB là sử dụng các phím tăng đơn điệu (hoặc tự động tăng, nếu bạn muốn) làm khóa shard.

Nói chung, khóa chính của tài liệu được sử dụng. Ý tưởng ở đây rất có ý nghĩa, cụ thể là, khi các tài liệu mới tiếp tục được tạo ra, chúng sẽ rơi đều vào một trong những mảnh vỡ có sẵn. Thật không may, một cấu hình như vậy là một sai lầm cổ điển. Điều này là như vậy bởi vì nếu khóa shard luôn tăng, sau khi dữ liệu điểm sẽ bắt đầu tích lũy ở phía giá trị cao của các phân đoạn, gây ra sự mất cân bằng trong hệ thống.

Tín dụng hình ảnh: mongodb.com

Như bạn có thể thấy trong hình ảnh, một khi chúng tôi vượt qua phạm vi 20, tất cả các tài liệu bắt đầu được thu thập trong Chunk C, gây ra một khối nguyên khối ở đó. Giải pháp là sử dụng lược đồ khóa băm băm, tạo ra khóa shending bằng cách băm một trong các trường được cung cấp và sử dụng nó để xác định khối.

Tín dụng hình ảnh: Mongodb.com

Một khóa shard băm trông như thế này:

{
"_Tôi" :"6b85117af532da651cc912cd"
}

. . . và có thể được tạo trong trình vỏ máy khách Mongo bằng cách sử dụng:

db.collection.create Index ({_id: hashedValue})

Sớm

Một trong những lời khuyên hữu ích trực tiếp từ các chiến hào là nên phân chia sớm, ngay cả khi bạn kết thúc với một cụm nhỏ hai khúc. Khi dữ liệu đã vượt quá 500 GB hoặc một cái gì đó, shending trở thành một quy trình lộn xộn trong MongoDB và bạn nên sẵn sàng cho những bất ngờ khó chịu. Bên cạnh đó, quá trình tái cân bằng sẽ tiêu tốn lượng băng thông mạng rất cao, có thể làm nghẹt hệ thống nếu bạn không cẩn thận.

Không phải tất cả mọi người là ủng hộ, mặc dù. Như một ví dụ thú vị (việc học thực sự nằm trong phần bình luận), hãy xem Percona tốt đẹp này Blog.

Chạy cân bằng

Một ý tưởng tốt khác là giám sát các mẫu lưu lượng truy cập của bạn và chỉ chạy bộ cân bằng phân đoạn trong thời gian lưu lượng thấp. Như tôi đã đề cập, việc tự cân bằng lại cần băng thông đáng kể, có thể nhanh chóng đưa toàn bộ hệ thống vào thu thập dữ liệu. Hãy nhớ rằng, các mảnh vỡ mất cân bằng không phải là một nguyên nhân cho sự hoảng loạn ngay lập tức. Chỉ cần duy trì sử dụng bình thường, chờ cơ hội lưu lượng truy cập thấp và để bộ cân bằng làm phần còn lại!

Đây là cách bạn có thể thực hiện điều này (giả sử bạn có lưu lượng truy cập thấp từ 3 giờ sáng đến 5 giờ sáng):

sử dụng cấu hình
db.sinstall.update (
{ _Tôi: "cân bằng" },
{$ set: {activeWindow: {start: "03:00", dừng lại : "05:00" }}},
{upsert: đúng}
)

Phần kết luận

Bảo vệ và nhân rộng bất kỳ cơ sở dữ liệu nào là một công việc khó khăn, nhưng may mắn thay MongoDB làm cho nó dễ quản lý hơn các cơ sở dữ liệu phổ biến khác ngoài kia.

Thực sự đã có lúc MongoDB không phải là lựa chọn phù hợp cho bất kỳ dự án nào (nhờ một số vấn đề quan trọng và hành vi mặc định của nó), nhưng những điều đó đã qua lâu rồi. Cùng với shending, tái cân bằng, tự động nén, khóa phân phối cấp độ tổng hợp và nhiều tính năng như vậy, MongoDB đã đi trước hàng ngày là kiến ​​trúc sư phần mềm, lựa chọn đầu tiên.

Tôi hy vọng bài viết này đã có thể làm sáng tỏ những gì shending trong MongoDB và những gì nhà phát triển phải quan tâm khi đi lên quy mô. Để tìm hiểu thêm, bạn có thể nhận được điều này khóa học trực tuyến để thành thạo MongoDB.

THẺ

  • Cơ sở dữ liệu

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map