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

Hướng dẫn dành cho nhà phát triển về MongoDB Sharding

Sự tăng trưởng lớn của dữ liệu đi kèm với chi phí của các hoạt động thông lượng giảm, đặc biệt là khi được phục vụ bởi một máy chủ duy nhất. Tuy nhiên, bạn có thể cải thiện hiệu suất này bằng cách tăng số lượng máy chủ và cũng phân phối dữ liệu của bạn trên nhiều số lượng máy chủ này. Trong bài viết này, bộ Replica trong MongoDB, chúng tôi đã thảo luận chi tiết về cách các hoạt động thông lượng có thể được cải thiện bên cạnh việc đảm bảo tính sẵn sàng cao của dữ liệu. Quá trình này không thể đạt được hoàn toàn nếu không đề cập đến Sharding trong MongoDB.

Sharding trong MongoDB là gì

MongoDB được thiết kế theo cách linh hoạt để bạn có thể mở rộng quy mô để chạy trong một cụm trên một nền tảng phân tán. Trong nền tảng này, dữ liệu được phân phối trên một số máy chủ để lưu trữ. Quá trình này được gọi là sharding. Nếu một máy chủ duy nhất phải chịu một lượng lớn dữ liệu để lưu trữ, bạn có thể hết dung lượng lưu trữ. Ngoài ra, các hoạt động thông lượng rất quan trọng như đọc và ghi có thể bị ảnh hưởng ở một mức độ lớn. Tính năng chia tỷ lệ ngang trong MongoDB cho phép chúng tôi phân phối dữ liệu trên nhiều máy với kết quả cuối cùng là cải thiện cân bằng tải.

MongoDB Shards

Một phân đoạn có thể được coi là một tập hợp bản sao lưu trữ một số tập hợp con dữ liệu được sử dụng trong một phân đoạn được phân đoạn. Đối với một phiên bản mongod nhất định với một số tập dữ liệu, dữ liệu được chia nhỏ và phân phối trên một số cơ sở dữ liệu trong trường hợp này là các phân đoạn. Về cơ bản, một số phân đoạn khác nhau đóng vai trò là cơ sở dữ liệu độc lập nhưng tựu chung lại chúng tạo nên một cơ sở dữ liệu logic. Các phân đoạn làm giảm khối lượng công việc được thực hiện bởi toàn bộ cơ sở dữ liệu bằng cách giảm số lượng hoạt động mà một phân đoạn phải xử lý bên cạnh lượng dữ liệu ít hơn mà phân đoạn này sẽ lưu trữ. Số liệu này cung cấp chỗ cho việc mở rộng một cụm theo chiều ngang. Một kiến ​​trúc đơn giản của sharding được hiển thị bên dưới.

Dữ liệu được gửi từ ứng dụng khách bị trình điều khiển máy chủ chặn và sau đó được cung cấp cho bộ định tuyến. Sau đó, bộ định tuyến sẽ tham khảo cấu hình máy chủ để xác định vị trí áp dụng thao tác đọc hoặc ghi trên các máy chủ phân đoạn. Tóm lại, đối với một hoạt động như ghi, nó có một số chỉ mục sẽ chỉ định phân đoạn nào là bản ghi sẽ là máy chủ lưu trữ. Giả sử một cơ sở dữ liệu có dung lượng dữ liệu 1TB được phân phối trên 4 phân đoạn, mỗi phân đoạn sẽ chứa 256GB dữ liệu này. Với lượng dữ liệu giảm mà một phân đoạn có thể xử lý, các hoạt động có thể được thực hiện khá nhanh. Bạn nên cân nhắc sử dụng cụm phân đoạn trong cơ sở dữ liệu của mình khi:

  1. Bạn mong đợi lượng dữ liệu sẽ vượt quá dung lượng lưu trữ phiên bản duy nhất của mình trong tương lai.
  2. Nếu các thao tác ghi không được thực hiện bởi một phiên bản MongodB duy nhất
  3. Bạn sử dụng hết RAM của Bộ nhớ truy cập ngẫu nhiên với cái giá là kích thước của nhóm hoạt động đang hoạt động tăng lên.

Sharding đi kèm với sự phức tạp tăng lên trong kiến ​​trúc bên cạnh các tài nguyên bổ sung. Tuy nhiên, bạn nên thực hiện sharding ở giai đoạn đầu trước khi dữ liệu của bạn phát triển nhanh hơn vì làm như vậy khá tẻ nhạt khi dữ liệu của bạn vượt quá dung lượng.

Khóa phân đoạn MongoDB

Như chúng ta đã biết, một tài liệu trong MongoDB có các trường để lưu giữ các giá trị. Khi bạn đang triển khai sharding, bạn sẽ được yêu cầu chọn một trường từ bộ sưu tập mà bạn sẽ sử dụng để tách dữ liệu. Trường bạn đã chọn là khóa phân đoạn xác định cách bạn sẽ tách các tài liệu trong bộ sưu tập thành một số phân đoạn. Trong một ví dụ đơn giản, dữ liệu của bạn có thể có tên trường là sinh viên, giáo viên lớp và điểm. Bạn có thể quyết định một tập hợp phân đoạn để chứa các tài liệu với sinh viên chỉ mục, một giáo viên khác và điểm. Tuy nhiên, bạn có thể yêu cầu dữ liệu của mình được phân phối ngẫu nhiên do đó sử dụng khóa phân đoạn được băm. Có một loạt các khóa phân đoạn được sử dụng để tách dữ liệu bên cạnh khóa phân đoạn được băm nhưng hai danh mục chính là trường được lập chỉ mục và trường ghép được lập chỉ mục.

Chọn khóa phân đoạn

Để có chức năng, khả năng và hiệu suất tốt hơn của chiến lược sharding, bạn sẽ cần chọn khóa phân đoạn thích hợp. Tiêu chí lựa chọn phụ thuộc vào 2 yếu tố:

  1. Cấu trúc lược đồ của dữ liệu của bạn. Ví dụ, chúng ta có thể xem xét một trường mà giá trị của nó có thể tăng hoặc giảm (thay đổi đơn điệu). Điều này rất có thể sẽ ảnh hưởng đến việc phân phối các phần chèn vào một phân đoạn duy nhất trong một cụm.
  2. Cách cấu hình truy vấn của bạn được đặc trưng để thực hiện các thao tác ghi.

Khóa phân đoạn băm là gì

Điều này sử dụng một chỉ mục được băm của một trường duy nhất làm khóa phân đoạn. Chỉ mục được băm là một chỉ mục duy trì các mục nhập với các giá trị băm của một trường được lập chỉ mục. I.e

{
    "_id" :"5b85117af532da651cc912cd"
}

Để tạo chỉ mục băm, bạn có thể sử dụng lệnh này trong mongo shell.

db.collection.createIndex( { _id: hashedValue } )

Trong đó biến hashedValue đại diện cho một chuỗi giá trị băm được chỉ định của bạn. Hashed sharding thúc đẩy phân phối dữ liệu đồng đều trên một cụm phân đoạn, do đó làm giảm các hoạt động mục tiêu. Tuy nhiên, các tài liệu có các khóa phân đoạn gần như giống nhau có thể không nằm trên cùng một phân đoạn, do đó yêu cầu phiên bản mongo thực hiện thao tác truyền phát để đáp ứng một tiêu chí truy vấn nhất định.

Khóa phân đoạn dựa trên phạm vi

Trong danh mục này, tập dữ liệu được phân vùng dựa trên phạm vi giá trị của khóa trường đã chọn do đó có phạm vi phân vùng cao. I E. nếu bạn có một khóa số có giá trị chạy từ âm vô cùng đến dương vô cùng, mỗi khóa phân đoạn sẽ rơi vào một điểm nhất định trong dòng đó. Dòng này được chia thành các đoạn với mỗi đoạn có một phạm vi giá trị nhất định. Chính xác là, những tài liệu có khóa phân đoạn gần như tương tự nhau được lưu trữ trong cùng một đoạn. Ưu điểm của kỹ thuật này là nó hỗ trợ một loạt các truy vấn vì bộ định tuyến sẽ chọn phân đoạn với phân đoạn cụ thể.

Đặc điểm của Khóa phân đoạn tối ưu

  1. Một khóa phân đoạn lý tưởng phải có thể nhắm mục tiêu một phân đoạn duy nhất để nâng cao chương trình mongos để trả về các hoạt động truy vấn từ một phiên bản mongod duy nhất. Khóa là trường chính đặc trưng cho điều này. I E. không có trong tài liệu nhúng.
  2. Có mức độ ngẫu nhiên cao. Điều này có nghĩa là, trường nên có sẵn trong hầu hết các tài liệu. Điều này sẽ đảm bảo các hoạt động ghi được phân phối trong một phân đoạn.
  3. Có thể dễ dàng phân chia. Với một khóa phân đoạn có thể phân chia dễ dàng, việc phân phối dữ liệu sẽ tăng lên do đó sẽ có nhiều phân đoạn hơn.
Vài người trở thành MongoDB DBA - Đưa MongoDB vào Sản xuất Tìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng MongoDBDownload miễn phí

Các thành phần của Triển khai Cụm sản xuất

Về kiến ​​trúc được hiển thị ở trên, cụm sản xuất phải có:

  • Bộ định tuyến Mongos / Truy vấn. Đây là các phiên bản mongo hoạt động như một máy chủ giữa các trình điều khiển ứng dụng và chính cơ sở dữ liệu. Trong quá trình triển khai, bộ cân bằng tải được định cấu hình để cho phép kết nối từ một ứng dụng khách để truy cập cùng một mongos.
  • Các mảnh. Đây là các phân vùng mà các tài liệu chia sẻ cùng một định nghĩa khóa phân đoạn được lưu trữ trong đó. Bạn nên có ít nhất 2 cái để tăng tính khả dụng của dữ liệu.
  • Máy chủ định cấu hình:bạn có thể có 3 máy chủ định cấu hình riêng biệt trong các máy khác nhau hoặc một nhóm chúng nếu bạn có nhiều cụm phân đoạn.

Triển khai một cụm được chia nhỏ

Các bước sau sẽ cung cấp cho bạn định hướng rõ ràng để triển khai cụm phân đoạn của bạn.

  1. Tạo máy chủ cho các máy chủ cấu hình. Theo mặc định, các tệp máy chủ có sẵn trong thư mục / data / configdb nhưng bạn luôn có thể đặt tệp này thành thư mục ưa thích của mình. Lệnh để tạo thư mục dữ liệu là:

    $ mkdir /data/configdb
  2. Khởi động máy chủ cấu hình bằng cách xác định cổng và đường dẫn tệp cho mỗi máy chủ bằng cách sử dụng lệnh

    $ mongod --configsvr --dbpath /data/config --port 27018

    Lệnh này sẽ khởi động tệp cấu hình trong thư mục dữ liệu với tên cấu hình trên cổng 27018. Theo mặc định, tất cả các máy chủ MongoDB chạy trên cổng 27017.

  3. Bắt đầu một phiên bản mongos bằng cú pháp:

    $ mongo --host hostAddress --port 27018.

    Biến hostAddress sẽ có giá trị cho tên máy chủ hoặc địa chỉ ip của máy chủ lưu trữ của bạn.

  4. Khởi động mongod trên máy chủ phân đoạn và khởi tạo nó bằng lệnh:

    mongod --shardsvr --replSet
    rs.initiate()
  5. Khởi động mongos của bạn trên bộ định tuyến bằng lệnh:

    mongos --configdb rs/mongoconfig:27018
  6. Thêm phân đoạn vào cụm của bạn. Giả sử chúng tôi có cổng mặc định là 27017 làm cụm của chúng tôi, chúng tôi có thể thêm phân đoạn trên cổng 27018 như sau:

    mongo --host mongomaster --port 27017
    sh.addShard( "rs/mongoshard:27018")
    { "shardAdded" : "rs", "ok" : 1 }
  7. Bật tính năng sharding cho cơ sở dữ liệu bằng cách sử dụng tên phân đoạn bằng lệnh:

    sh.enableSharding(shardname)
    { "ok" : 1 }

    Bạn có thể kiểm tra trạng thái của phân đoạn bằng lệnh:

    sh.status()

    Bạn sẽ được cung cấp thông tin này

    sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("59f425f12fdbabb0daflfa82")
    }
    shards:
    { "_id" : "rs", "host" : "rs/mongoshard:27018", "state" : 1 }
    active mongoses:
    "3.4.10" : 1
    autosplit:
    Currently enabled: yes
    balancer:
    Currently enabled: yes
    Currently running: no
    NaN
    Failed balancer rounds in last 5 attempts: 0
    Migration Results for the last 24 hours:
    No recent migrations
    databases:
    { "_id" : shardname, "primary" : "rs", "partitioned" : true }

Cân bằng mảnh

Sau khi thêm một phân đoạn vào một cụm, bạn có thể nhận thấy rằng một số phân đoạn có thể vẫn đang lưu trữ nhiều dữ liệu hơn các phân đoạn khác và để an toàn hơn, phân đoạn mới sẽ không có dữ liệu. Do đó, bạn cần phải chạy một số kiểm tra nền để đảm bảo cân bằng tải. Cân bằng là cơ sở để dữ liệu được phân phối lại trong một cụm. Bộ cân bằng sẽ phát hiện sự phân bố không đồng đều do đó di chuyển các phần từ phân đoạn này sang phân đoạn khác cho đến khi đạt đến đại số cân bằng.

Quá trình cân bằng tiêu tốn nhiều băng thông bên cạnh chi phí tải công việc và điều này sẽ ảnh hưởng đến hoạt động của cơ sở dữ liệu của bạn. Quá trình cân bằng tốt hơn bao gồm:

  • Di chuyển từng đoạn một.
  • Thực hiện việc cân bằng khi đạt đến ngưỡng di chuyển, đó là khi sự khác biệt giữa số lượng phần thấp nhất của một bộ sưu tập nhất định và số lượng phần cao nhất trong bộ sưu tập đã phân đoạn.

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào tôi có thể sử dụng các tweet từ api phát trực tuyến của Twitter và lưu trữ chúng trong mongodb

  2. MongoDB - Nhập dữ liệu

  3. Cài đặt MongoDB trên CentOS 7

  4. .updateOne trên MongoDB không hoạt động trong Node.js

  5. Khu dân cư Mongoose được nhúng