+58

[MongoDB P4] Cài đặt MongoDB Sharded Cluster có khả năng scale và tính dự phòng cao

Lời mở đầu

Hello các bạn trở lại với series bài viết "Những gì mình biết về MongoDB", series nói về một NoSQL DB cực kỳ phổ biến là MongoDB.

Trong phần trước mình đã giới thiệu cách cài đặt MongoDB dạng standalone khá đơn giản và phù hợp với môi trường dev. Tuy nhiên khi lên Production thì sẽ chúng ta sẽ cần quan tâm tới các yếu tố sau:

  • Khả năng mở rộng (scalable)
  • Khả năng sẵn sàng cao (high availability)
  • Khả năng chịu lỗi

Và để giải quyết các vấn đề trên, chúng ta sẽ thực hiện cài đặt một cụm mongodb shard cluster!

Mô hình triển khai

Điểm lại một chút thì chúng ta sẽ có 3 thành phần chính trong một cụm mongodb gồm: router (mongos), config-server và shard-server.

Để giải quyết việc mở rộng khả năng xử lý của cluster, chúng ta sẽ sử dụng sharding, nghĩa là có thể chia database thành nhiều phần (shard) để cùng xử lý dữ liệu được tốt hơn. Khi cần tăng khả năng xử lý của hệ thống chúng ta có thể add thêm shard-server vào cluster.

Để xây dựng hệ thống có tính HA, thì mỗi shard-server hay config-server chúng ta sẽ cài đặt dưới dạng replicaset. Nghĩa là sẽ có nhiều instance chạy cùng chức năng để một trong các instance bị lỗi thì dịch vụ sẽ không bị ảnh hưởng.

Trong bài hướng dẫn hôm nay mình sẽ xây dựng cụm mongodb với 3 shard và mỗi shard sẽ có 3 replicas.

Mô hình triển khai sẽ có dạng như sau: image.png

Phân tích một chút, để triển khai được theo kiến trúc trên ta cần cài đặt 9 service mongod cho phần shard-server (3 shard, mỗi shard có 3 replicas và mỗi replicas này là một service mongod). Và ta cũng cần thêm 3 service cho phần Config-Server (mỗi replicas cho Config-Server là một service mongod). Cuối cùng là một service cho router (chạy service mongos).

Như vậy suy nghĩ thông thường ta sẽ cần sơ bộ 13 server để cài đặt cho mô hình trên. Theo đó, ta có thể thiết kế một hệ thống như sau: image.png

Tuy nhiên lưu ý khi đó chỉ có 4 server chạy các primary replicas và mongos là thực sự chạy tải chính. Do đó ta có thể tối ưu một chút về tài nguyên triển khai bằng cách gói gọn lại như sau: image.png

Với mô hình triển khai mới này chúng ta ghép chung một số các secondary replicas vào cùng server với Primary Replicas để tiết kiệm và tối ưu về tài nguyên. Và như vậy chúng ta chỉ cần 4 máy chủ, thậm chí việc cài service mongos có thể cài đặt chung trên các máy chủ application. Tuy nhiên đến đây lại gặp một vấn đề phát sinh đó là: Toàn bộ các replicas của một Shard-server đang chạy trên cùng một server. Điều đó có nghĩa là nếu một server bị lỗi thì đồng nghĩa với việc toàn bộ các replicas của 1 shard-server cũng bị lỗi hết. Vậy nên việc cấu hình replication để đảm bảo HA cũng không còn ý nghĩa gì nữa.

Để giải quyết vấn đề trên, thì ta sẽ setup để các replicas của cùng một shard-server sẽ không chạy chung trên cùng một server. Mô hình sẽ được cập nhật như sau: image.png

Các bạn hãy để ý mô hình đã thay đổi so với mô hình trước, đó là 3 replicas của Shard-1 đã nằm trên 3 server khác nhau. Và tương tự cho Shard-2 và Shard-3 cũng vậy. image.png Như vậy với mô hình này, giả sử server-01 bị lỗi thì mỗi Shard sẽ bị lỗi đúng 1 replicas và không ảnh hưởng gì tới dịch vụ bởi mỗi shard này sẽ vẫn luôn đảm bảo có 1 replicas chạy với vai trò primary.

Triển khai

Mô hình đã có, chúng ta cùng bắt tay vào cài đặt cụm cluster này nhé! Trong bài này mình sẽ không sử dụng công cụ tự động nào (terraform hay ansible) mà sẽ làm thủ công để giúp các bạn hiểu được bản chất hơn các công việc mình cần làm. Khi đã hiểu thì các bạn hoàn toàn có thể sử dụng các công cụ IaC để build hệ thống một cách tự động.

Trong phạm vi bài hướng dẫn này mình sẽ sử dụng các máy chủ EC2 của AWS, đơn giản là vì tạo VM nó nhanh và vì mình có credit nên tội gì không dùng cho tiện 😄. Hệ điều hành mình sẽ dùng Ubuntu 20.04. Các phiên bản hệ điều hành khác cơ bản cũng không khác biệt quá nhiều.

Các bạn nếu không có tài khoản AWS hay chưa quen dùng thì có thể cài đặt các VM của một provider bất kỳ như Digital Ocean, Azure, Google hoặc cài VM trên onprem bằng VMware hay Vagrant.. Miễn là output là 04 máy chủ Ubuntu là được nhé!

Các bước triển khai

Mình sẽ tóm tắt các bước chúng ta cần thực hiện để dễ nắm bắt như sau:

  • Cài đặt 04 máy chủ để cài đặt
  • Cấu hình trên từng máy chủ: Tạo thư mục chứa data, log, cài đặt mongodb
  • Cài đặt replicaset cho configsvr
  • Cài đặt replicaset cho từng shard
  • Cài đặt router (router sẽ cần kết nối tới configsvr)
  • Kết nối vào router và add các shard
  • Test dịch vụ

Plan triển khai

Các máy chủ EC2 sẽ được cấp Private IP trong CIDR của VPC mặc định, mình plan chi tiết sẵn cho từng máy chủ như sau (mình plan sẵn Port cho từng service của mongod): image.png

Cài đặt máy chủ

Phần này mình sẽ mô tả sơ qua các bước tạo EC2 trên AWS như sau:

  • Dùng VPC mặc định trong Region
  • Tạo Security Group để mở các kết nối như SSH vào các EC2, mở port cho các replicaset giao tiếp với nhau
  • Mở port cho app từ bên ngoài kết nối vào mongos (router)

Lấy thông tin VPC

Mình sử dụng VPC mặc định và nó đang có cấu hình CIDR là 172.31.0.0/16. Thông tin này sẽ dùng để cấu hình Security Group ở bước sau. image.png

Tạo Security Group để mở kết nối

Trong phạm vi bài lab này mình sẽ mở kết nối SSH và port 27017 để từ public có thể SSH và kết nối vào mongodb. Còn dải port 27017-27023 mở cho nội bộ các IP trong VPC có thể kết nối được, phục vụ cho các replicas giao tiếp với nhau.

Cấu hình rule cho SG như sau: image.png

Kết quả tạo SG: image.png

Tạo máy chủ EC2

Mình sẽ tạo các EC2 với thông tin như sau:

  • Region: ap-southeast-1
  • AMI: ami-08be951cec06726be
  • Instance type: t2.medium (2vCPU và 4GiB Memory)
  • Network: Sử dụng VPC mặc định của Region (như thông tin bên trên nó sử dụng CIDR là 172.31.0.0/16)
  • Storage: 16GiB gp2
  • Số lượng EC2: 4
  • Keypair: Các bạn tạo trước keypair và gán vào đây để sau này dùng để SSH vào server nhé Thông tin tạo EC2: image.png

image.png

Kết quả tạo được 4 máy chủ EC2: image.png

Mình sẽ lần lượt đổi lại tên các EC2 cho đúng với quy hoạch cho dễ quản lý: image.png Như các bạn thấy máy chủ mongodb-svr01 có Public IP là 13.251.125.136 và Private IP là 172.31.5.83. Mình sẽ SSH vào từng server này để đổi tên hostname cho nó mapping đúng với tên của instance bên ngoài:

ubuntu@ip-172-31-5-83:~$ sudo hostnamectl set-hostname mongodb-svr01
ubuntu@ip-172-31-5-83:~$ bash
ubuntu@mongodb-svr01:~$

Tương tự đổi tên hostname cho các EC2 còn lại đúng với quy hoạch ban đầu.

ubuntu@ip-172-31-2-242:~$ sudo hostnamectl set-hostname mongodb-svr02
ubuntu@ip-172-31-2-242:~$ bash
ubuntu@mongodb-svr02:~$

ubuntu@ip-172-31-10-61:~$ sudo hostnamectl set-hostname mongodb-svr03
ubuntu@ip-172-31-10-61:~$ bash
ubuntu@mongodb-svr03:~$

ubuntu@ip-172-31-8-102:~$ sudo hostnamectl set-hostname mongos-svr
ubuntu@ip-172-31-8-102:~$ bash
ubuntu@mongos-svr:~$

Như vậy tới đây cơ bản mình đã có 4 máy chủ để cài đặt với thông tin như sau: image.png

Cài đặt MongoDB

Có một số bước cần thực hiện chung trên cả 4 server nên mình sẽ dùng mobaxterm để có thể gõ lệnh đồng thời trên 4 server cho nhanh.

Mình sẽ thực hiện cài đặt mongodb lên các server này như sau (thực hiện trên 4 server):

sudo apt update -y
sudo apt install -y software-properties-common gnupg apt-transport-https ca-certificates
sudo apt install -y mongodb

Kết quả cài đặt mongodb lên 4 server: image.png

Tiếp theo ta sẽ disable service mongod mặc định khi cài mongodb, vì chúng ta sẽ thực hiện config các service mongod thủ công (thực hiện trên cả 4 server):

sudo systemctl stop mongodb.service
sudo systemctl disable mongodb.service

Cấu hình file hosts cho các server theo Private IP như sau (thêm nội dung vào file /etc/hosts):

172.31.5.83 mongodb-svr01
172.31.2.242 mongodb-svr02
172.31.10.61 mongodb-svr03
172.31.8.102 mongos-svr

Tạo thư mục cài đặt (thực hiện trên 3 server mongodb-svr1,2,3)

Thực hiện tạo thư mục chứa data cho các shard-replicas như sau (thực hiện trên 3 server):

sudo mkdir -p /data/mongo-shard1
sudo mkdir -p /data/mongo-shard2
sudo mkdir -p /data/mongo-shard3
sudo mkdir -p /data/cfg_metadata

sudo chown -R mongodb:mongodb /data/mongo-shard1
sudo chown -R mongodb:mongodb /data/mongo-shard2
sudo chown -R mongodb:mongodb /data/mongo-shard3
sudo chown -R mongodb:mongodb /data/cfg_metadata/

Sau bước này thì trên mỗi server sẽ có 4 thư mục chứa data cho các shard-replicas và configsvr-replicas.

Cài đặt configsvr (thực hiện trên 3 server mongodb-svr1,2,3)

Cấu hình configsvr

Tạo file config cho service /etc/configsvr.conf:

sharding:
   clusterRole: configsvr
replication:
   replSetName: configsvr-rs
systemLog:
   destination: file
   path: "/var/log/mongodb/configsvr.log"
   logAppend: true
storage:
   dbPath: /data/cfg_metadata
   journal:
      enabled: true
processManagement:
   fork: true
net:
   bindIp: 0.0.0.0
   port: 27020
setParameter:
   enableLocalhostAuthBypass: false

Chạy config-server:

sudo mongod --config /etc/configsvr.conf &

Cấu hình cho config-server chạy khi khởi động OS bằng cách thêm nội dung sau vào file /etc/rc.local:

sudo mongod --config /etc/configsvr.conf &
exit 0;

Kiểm tra trạng thái của configserver bằng cách check process mongod:

ubuntu@mongodb-svr03:~$ ps -ef |grep mongo |grep -v grep
root       20644       1  2 04:34 ?        00:00:00 mongod --config /etc/configsvr.conf

Tạo replicaset cho configsvr

Sau bước trên chúng ta đã setup được 3 instance mongod chạy với role là configsvr . Giờ ta cần thực hiện khởi tạo replicaset cho configsvr bằng cách add 3 instance trên vào replicaset config của configsvr.

Đầu tiên ta đứng từ server mongodb-svr01 và kết nối vào configsvr trên node này:

mongo --host mongodb-svr01 --port 27020

Sau đó cấu hình replicaset như sau:

cfg = { _id : "configsvr-rs" , configsvr : true , members : [ { _id : 0, host : "mongodb-svr01:27020"}, {_id : 1, host : "mongodb-svr02:27020"}, {_id : 2, host : "mongodb-svr03:27020"}] };
rs.initiate(cfg)

Trong đó:

  • mongodb-svr01:27020 chính là configsvr chạy trên node mongodb-svr01
  • mongodb-svr02:27020 chính là configsvr chạy trên node mongodb-svr03
  • mongodb-svr03:27020 chính là configsvr chạy trên node mongodb-svr03 Kết quả có dạng như sau:
> cfg = { _id : "configsvr-rs" , configsvr : true , members : [ { _id : 0, host : "mongodb-svr01:27020"}, {_id : 1, host : "mongodb-svr02:27020"}, {_id : 2, host : "mongodb-svr03:27020"}] };
{
        "_id" : "configsvr-rs",
        "configsvr" : true,
        "members" : [
                {
                        "_id" : 0,
                        "host" : "mongodb-svr01:27020"
                },
                {
                        "_id" : 1,
                        "host" : "mongodb-svr02:27020"
                },
                {
                        "_id" : 2,
                        "host" : "mongodb-svr03:27020"
                }
        ]
}
> rs.initiate(cfg)
{
        "ok" : 1,
        "operationTime" : Timestamp(1681274662, 1),
        "$gleStats" : {
                "lastOpTime" : Timestamp(1681274662, 1),
                "electionId" : ObjectId("000000000000000000000000")
        },
        "$clusterTime" : {
                "clusterTime" : Timestamp(1681274662, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
configsvr-rs:OTHER>

Sau bước này ta đã setup xong một Config-Server chạy dưới dạng replicaset với 3 replicas.

Cài đặt các Shard (thực hiện trên 3 server mongodb-svr1,2,3)

Mục tiêu của chúng ta là cần tạo ra 3 shard, với mỗi shard sẽ có 3 replicas thì như vậy sẽ có tổng số 9 replicas. Mỗi replicas này là một service mongod.

Ta sẽ cấu hình để chạy các service mongod này dưới dạng service của hệ điều hành. Trên mỗi server sẽ có đúng 3 service mongod tương ứng với 1 replicas của shard1, 1 replicas của shard2 và 1 replicas của shard3.

Cấu hình các service

Cấu hình cho shard1

Tạo file config cho process mongod /etc/shard1-rs.conf có nội dung như sau:

storage:
  dbPath: /data/mongo-shard1
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongo-shard1.log
net:
  port: 27021
  bindIp: 0.0.0.0
replication.oplogSizeMB: 50
replication.replSetName: shard1-rs
sharding.clusterRole: shardsvr

Lưu ý các thông tin storage.dbPath, systemLog.pathreplication.replSetName đặt đúng như chúng ta đã plan ban đầu.

Tạo file /lib/systemd/system/shard1-rs.service để cấu hình process mongod này chạy như service của OS:

[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/shard1-rs.conf
PIDFile=/var/run/mongodb/shard1-rs.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

Khởi chạy service này:

sudo systemctl enable shard1-rs.service
sudo systemctl start shard1-rs.service
sudo systemctl status shard1-rs.service

Lặp lại các bước này cho shard2 và shard3 để cấu hình service.

Cấu hình cho shard2

Tạo file config cho process mongod /etc/shard2-rs.conf có nội dung như sau:

storage:
  dbPath: /data/mongo-shard2
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongo-shard2.log
net:
  port: 27022
  bindIp: 0.0.0.0
replication.oplogSizeMB: 50
replication.replSetName: shard2-rs
sharding.clusterRole: shardsvr

Lưu ý các thông tin storage.dbPath, systemLog.pathreplication.replSetName đặt đúng như chúng ta đã plan ban đầu.

Tạo file /lib/systemd/system/shard2-rs.service để cấu hình process mongod này chạy như service của OS:

[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/shard2-rs.conf
PIDFile=/var/run/mongodb/shard2-rs.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

Khởi chạy service này:

sudo systemctl enable shard2-rs.service
sudo systemctl start shard2-rs.service
sudo systemctl status shard2-rs.service

Cấu hình cho shard3

Tạo file config cho process mongod /etc/shard3-rs.conf có nội dung như sau:

storage:
  dbPath: /data/mongo-shard3
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongo-shard3.log
net:
  port: 27023
  bindIp: 0.0.0.0
replication.oplogSizeMB: 50
replication.replSetName: shard3-rs
sharding.clusterRole: shardsvr

Lưu ý các thông tin storage.dbPath, systemLog.pathreplication.replSetName đặt đúng như chúng ta đã plan ban đầu.

Tạo file /lib/systemd/system/shard3-rs.service để cấu hình process mongod này chạy như service của OS:

[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/shard3-rs.conf
PIDFile=/var/run/mongodb/shard3-rs.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

Khởi chạy service này:

sudo systemctl enable shard3-rs.service
sudo systemctl start shard3-rs.service
sudo systemctl status shard3-rs.service

Cấu hình replicaset cho các Shard

*Bước trên ta đã tạo ra các service trên các server như sau:

Server service shard replicaset Port
mongodb-svr01 shard1-rs shard1-rs 27021
mongodb-svr02 shard1-rs shard1-rs 27021
mongodb-svr03 shard1-rs shard1-rs 27021
mongodb-svr01 shard2-rs shard2-rs 27022
mongodb-svr02 shard2-rs shard2-rs 27022
mongodb-svr03 shard2-rs shard2-rs 27022
mongodb-svr01 shard3-rs shard3-rs 27023
mongodb-svr02 shard3-rs shard3-rs 27023
mongodb-svr03 shard3-rs shard3-rs 27023

Ta sẽ cần cấu hình cho các service mongod2 này join replicaset của shard.

Cấu hình replicaset cho Shard1

Shard1 sẽ được tạo replicaset từ các service shard1-rs trên server mongodb-svr01, shard1-rs trên server mongodb-svr02shard1-rs trên server mongodb-svr03.

Từ server mongodb-svr01 thực hiện:

sudo mongo --host mongodb-svr01 --port 27021

Port 27021 là port của service shard1-rs, ở đây là chúng ta đang kết nối tới 1 replicas của shard1 để khai báo các replicas khác và replicaset

cfg = { _id : "shard1-rs" , members : [ { _id : 0, host : "mongodb-svr01:27021"}, {_id : 1, host : "mongodb-svr02:27021"}, {_id : 2, host : "mongodb-svr03:27021"}] };
rs.initiate(cfg);

Cấu hình replicaset cho Shard2

Từ server mongodb-svr01 thực hiện:

sudo mongo --host mongodb-svr01 --port 27022
cfg = { _id : "shard2-rs" , members : [ { _id : 0, host : "mongodb-svr01:27022"}, {_id : 1, host : "mongodb-svr02:27022"}, {_id : 2, host : "mongodb-svr03:27022"}] };
rs.initiate(cfg);

Cấu hình replicaset cho Shard3

Từ server mongodb-svr01 thực hiện:

sudo mongo --host mongodb-svr01 --port 27023
cfg = { _id : "shard3-rs" , members : [ { _id : 0, host : "mongodb-svr01:27023"}, {_id : 1, host : "mongodb-svr02:27023"}, {_id : 2, host : "mongodb-svr03:27023"}] };
rs.initiate(cfg);

Các bạn có thể kiểm tra kết quả tạo replicaset bằng lệnh:

rs.status()

Cài đặt mongos (thực hiện trên server mongos-svr)

Cấu hình service mongos

Tạo file cấu hình của service /etc/mongos.conf:

systemLog:
 destination: file
 logAppend: true
 path: /var/log/mongodb/mongos.log

net:
 port: 27017
 bindIp: 0.0.0.0
sharding:
 configDB: configsvr-rs/mongodb-svr01:27020,mongodb-svr02:27020,mongodb-svr03:27020

Tạo file cấu hình cho để mongos chạy dưới dạng service của OS /lib/systemd/system/mongos.service:

[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=root
Group=root
ExecStart=/usr/bin/mongos --config /etc/mongos.conf
PIDFile=/var/run/mongodb/mongos.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

Start service của mongos:

sudo systemctl enable mongos
sudo systemctl start mongos
sudo systemctl status mongos

Add các Shard vào cluster

Ta đã tạo được 3 shard server chạy dạng replicaset, giờ ta sẽ add 3 shard này vào cluster.

Kết nối vào database bằng lệnh:

mongo --host mongos-svr --port 27017

Thực hiện add shard vào database:

sh.addShard("shard1-rs/mongodb-svr01:27021")
sh.addShard("shard2-rs/mongodb-svr01:27022")
sh.addShard("shard3-rs/mongodb-svr01:27023")
sh.status()

Kết quả add shard thành công như sau:

mongos> sh.addShard("shard1-rs/mongodb-svr01:27021")
{
        "shardAdded" : "shard1-rs",
        "ok" : 1,
        "operationTime" : Timestamp(1681284918, 9),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1681284918, 9),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Để xem thông tin các Shard trong cluster ta dùng lệnh sh.status():

mongos> sh.status()
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("6436373353dcc94e1c013f6a")
  }
  shards:
        {  "_id" : "shard1-rs",  "host" : "shard1-rs/mongodb-svr01:27021,mongodb-svr02:27021,mongodb-svr03:27021",  "state" : 1 }
        {  "_id" : "shard2-rs",  "host" : "shard2-rs/mongodb-svr01:27022,mongodb-svr02:27022,mongodb-svr03:27022",  "state" : 1 }
        {  "_id" : "shard3-rs",  "host" : "shard3-rs/mongodb-svr01:27023,mongodb-svr02:27023,mongodb-svr03:27023",  "state" : 1 }
  active mongoses:
        "3.6.8" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours:
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }

Tạo database và cấu hình shard cho collection

Nhớ lại nội dung bài trước, ta sẽ kết nối DB qua mongos và tạo database bằng lệnh use:

ubuntu@mongos-svr:~$ mongo --host mongos-svr --port 27017
mongos> use demo
switched to db demo
mongos> db.createCollection("staff")
mongos> db.createCollection("salary")
mongos> db.getCollectionNames()
[ "salary", "staff" ]

Để có thể cấu hình Sharding cho một Collection ta cần enable sharding cho database trước, sau đó cấu hình sharding cho collection. Ở đây ta sẽ enable sharding cho database demo và sẽ cấu hình sharding cho collection staff. Với các collection không được cấu hình sharding thì sẽ sử dụng một shard mặc định của database.

Thực hiện cấu hình sharding cho collection staff:

enable sharding cho DB:

sh.enableSharding("demo");

Cấu hình sharding cho collection:

mongos> sh.shardCollection("demo.staff",{ "_id": 1 } )
{
        "collectionsharded" : "demo.staff",
        "collectionUUID" : UUID("86c9e351-ddd1-4a61-a6bd-dad0463f4503"),
        "ok" : 1,
        "operationTime" : Timestamp(1681285626, 11),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1681285626, 11),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Kiểm tra trạng thái sharding của db:

mongos> use demo
switched to db demo
mongos> db.staff.getShardDistribution()

Như vậy cơ bản chúng ta đã xây dựng được một cụm shard replicas mongodb. Bài viết cũng khá dài nên các nội dung tiếp để dành cho bài sau.

Cảm ơn các bạn đã dành thời gian đọc tới đấy. Nếu thấy bài viết hữu ích thì hãy để lại 1 upvote và bookmark bài viết ủng hộ mình nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí