MongoDB - Sharding: Hướng dẫn cho người mới bắt đầu

Xin chào các bạn, những nhà法师 cơ sở dữ liệu tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của MongoDB sharding. Đừng lo lắng nếu bạn là người mới bắt đầu lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ khám phá chủ đề này từng bước một. Cuối cùng của bài hướng dẫn này, bạn sẽ sharding như một chuyên gia! Hãy cùng bắt đầu!

MongoDB - Sharding

Tại sao lại cần Sharding?

Hãy tưởng tượng bạn đang quản lý một thư viện đông đúc. Khi bộ sưu tập sách của bạn ngày càng lớn, bạn nhận ra rằng việc giữ tất cả các sách trong một phòng lớn đang trở nên phức tạp. Nó trở nên chật chội, và việc tìm kiếm sách mất nhiều thời gian hơn. Bạn sẽ làm gì? Bạn có thể xem xét mở rộng vào nhiều phòng khác nhau, mỗi phòng chứa các thể loại sách khác nhau. Đây chính là điều mà sharding làm cho cơ sở dữ liệu!

Sharding là phương pháp phân phối dữ liệu trên nhiều máy. Nó giống như cho cơ sở dữ liệu của bạn siêu năng lực, cho phép nó xử lý nhiều dữ liệu hơn và xử lý nhiều yêu cầu hơn mà một máy duy nhất có thể quản lý.

Dưới đây là những lý do chính chúng ta sử dụng sharding:

  1. Scalability: Khi dữ liệu của bạn tăng lên, bạn có thể thêm nhiều máy để xử lý nó.
  2. Hiệu suất: Các truy vấn có thể được xử lý song song trên nhiều máy.
  3. Cao khả dụng: Nếu một máy bị故障, các máy khác vẫn có thể phục vụ yêu cầu.

Sharding trong MongoDB

Bây giờ chúng ta đã hiểu tại sao sharding lại quan trọng, hãy cùng xem MongoDB triển khai nó như thế nào.

Khái niệm Cơ bản

Trước khi chúng ta nhảy vào mã, hãy làm quen với một số thuật ngữ quan trọng:

  1. Shard: Một máy duy nhất hoặc bộ replica set lưu trữ một phần dữ liệu.
  2. Shard Key: Trường (hoặc các trường) được sử dụng để phân phối dữ liệu trên các shard.
  3. Chunk: Một dải liên tục của giá trị shard key.
  4. Config Servers: Các instance MongoDB đặc biệt lưu trữ metadata về cluster.
  5. Mongos: Dịch vụ định tuyến rằng hướng dẫn các yêu cầu đến shard phù hợp.

Cài đặt một Cluster Sharded

Hãy cùng đi qua quá trình cài đặt một cluster sharded cơ bản. Đừng lo lắng nếu điều này có vẻ phức tạp ban đầu - chúng ta sẽ phân tích nó từng bước!

Bước 1: Khởi động Config Servers

Trước hết, chúng ta cần khởi động các config server. Trong môi trường sản xuất, bạn thường có ba máy, nhưng trong ví dụ này, chúng ta sẽ sử dụng một:

mongod --configsvr --replSet configReplSet --port 27019 --dbpath /data/configdb

Lệnh này khởi động một instance MongoDB như một config server, sử dụng cổng 27019 và lưu trữ dữ liệu trong /data/configdb.

Bước 2: Khởi động Config Server Replica Set

Bây giờ, hãy khởi động replica set cho config server:

rs.initiate({
_id: "configReplSet",
members: [{ _id: 0, host: "localhost:27019" }]
})

Lệnh này thiết lập config server của chúng ta là một replica set một thành viên.

Bước 3: Khởi động Shard Servers

Tiếp theo, chúng ta sẽ khởi động hai shard server:

mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/shard1
mongod --shardsvr --replSet shard2 --port 27020 --dbpath /data/shard2

Những lệnh này khởi động hai instance MongoDB như shard server trên các cổng khác nhau.

Bước 4: Khởi động Shard Replica Sets

Đối với mỗi shard, chúng ta cần khởi động replica set của nó:

// Cho shard1
rs.initiate({
_id: "shard1",
members: [{ _id: 0, host: "localhost:27018" }]
})

// Cho shard2
rs.initiate({
_id: "shard2",
members: [{ _id: 0, host: "localhost:27020" }]
})

Bước 5: Khởi động Mongos Router

Bây giờ, hãy khởi động router mongos:

mongos --configdb configReplSet/localhost:27019 --port 27017

Lệnh này khởi động instance mongos, cho biết nơi tìm thấy config servers.

Bước 6: Thêm Shards vào Cluster

Cuối cùng, chúng ta sẽ thêm các shard vào cluster:

sh.addShard("shard1/localhost:27018")
sh.addShard("shard2/localhost:27020")

Những lệnh này thông báo cho mongos về các shard của chúng ta.

Kích hoạt Sharding cho Database và Collection

Bây giờ cluster sharded của chúng ta đã được thiết lập, hãy kích hoạt sharding cho một database và collection:

// Kích hoạt sharding cho cơ sở dữ liệu 'mydb'
sh.enableSharding("mydb")

// Shard collection 'users' sử dụng trường 'username' làm shard key
sh.shardCollection("mydb.users", { "username": 1 })

Điều này kích hoạt sharding cho cơ sở dữ liệu 'mydb' và shard collection 'users' dựa trên trường 'username'.

Chèn và Truy vấn Dữ liệu

Bây giờ chúng ta có thiết lập sharded, hãy chèn một số dữ liệu và xem nó hoạt động như thế nào:

// Kết nối đến mongos
mongo --port 27017

// Chuyển đến cơ sở dữ liệu của chúng ta
use mydb

// Chèn một số người dùng
for (let i = 0; i < 10000; i++) {
db.users.insertOne({ username: "user" + i, age: Math.floor(Math.random() * 100) })
}

// Truy vấn một người dùng cụ thể
db.users.find({ username: "user5000" })

Khi chúng ta chạy truy vấn này, mongos sẽ định tuyến yêu cầu đến shard phù hợp dựa trên shard key (username).

Phương pháp Sharding

MongoDB cung cấp nhiều phương pháp sharding để phân phối dữ liệu trên các shard:

Phương pháp Mô tả Trường hợp sử dụng
Range Sharding Chia dữ liệu thành các dải dựa trên giá trị shard key Tốt cho shard keys có tính phân biệt cao và không thay đổi thường xuyên
Hash Sharding Sử dụng hash của shard key để phân phối dữ liệu Đảm bảo phân phối dữ liệu đều, tốt cho shard keys tăng dần
Zone Sharding Cho phép liên kết các dải shard key với các shard cụ thể Hữu ích cho tính địa phương dữ liệu hoặc lưu trữ phân cấp

Kết luận

Chúc mừng! Bạn vừa mới bước những bước đầu tiên vào thế giới của MongoDB sharding. Chúng ta đã xem xét tại sao sharding lại quan trọng, cách thiết lập một cluster sharded cơ bản và cách làm việc với các collection sharded.

Nhớ rằng, sharding là một công cụ mạnh mẽ, nhưng nó cũng thêm复杂性 vào thiết lập cơ sở dữ liệu của bạn. Luôn cân nhắc kỹ lưỡng xem bạn có cần sharding cho trường hợp sử dụng cụ thể của mình hay không. Khi bạn tiếp tục hành trình với MongoDB, bạn sẽ gặp nhiều khái niệm và kỹ thuật sharding nâng cao hơn.

Tiếp tục thực hành, 保持好奇心, và trước khi bạn biết, bạn sẽ trở thành một chuyên gia sharding! Chúc may mắn, những kiến trúc sư cơ sở dữ liệu tương lai!

Credits: Image by storyset