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:
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:
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:
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:
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. 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):
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.
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:
Kết quả tạo SG:
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:
Kết quả tạo được 4 máy chủ EC2:
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ý:
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:
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:
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 nodemongodb-svr01
mongodb-svr02:27020
chính là configsvr chạy trên nodemongodb-svr03
mongodb-svr03:27020
chính là configsvr chạy trên nodemongodb-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.path
vàreplication.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.path
vàreplication.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.path
vàreplication.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 servermongodb-svr01
,shard1-rs
trên servermongodb-svr02
vàshard1-rs
trên servermongodb-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é!