Giả sử ta đặt tên Cluster Replica Set là rs0
Câu lệnh docker đơn giản nhất để tạo 2 node cho Cluster
sudo docker rm -f mongo_primary
sudo docker run -d \
--name mongo_primary --hostname mongo_primary \
mongodb/mongodb-community-server:latest \
--replSet rs0
sudo docker rm -f mongo_standby
sudo docker run -d \
--name mongo_standby --hostname mongo_standby \
mongodb/mongodb-community-server:latest \
--replSet rs0
Docker sẽ cấp IP tự động cho 2 container. Gõ lệnh sau để tìm địa chỉ IP đó. Ví dụ: mongo_primary có IP 172.17.0.2 và mongo_standby có IP 172.17.0.3
sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
mongo_primary mongo_standby
Cuối cùng, khởi tạo Cluster bằng câu lệnh sau đây. Bài học đến đây là kết thúc !
sudo docker exec -it mongo_primary \
mongosh --eval 'rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "172.17.0.2:27017" },
{ _id: 1, host: "172.17.0.3:27017" }
]
})'
Trong câu lệnh trên, các node tìm kiếm nhau qua địa chỉ IP. Nếu muốn chúng tìm nhau qua Hostname thì cần chạy bằng Docker compose sẽ hướng dẫn sau.
Câu lệnh kiểm tra trạng thái Cluster
docker exec -it mongo_primary mongosh --eval "rs.status()"
Để chạy được câu lệnh trên cần cài đặt Docker. Nếu đã cài đặt rồi thì bỏ qua. Nếu chưa biết cách cài đặt Docker, hãy chạy câu lệnh sau
source /etc/os-release
NAME=docker
GPG=https://download.docker.com/linux/$ID/gpg
REPO="https://download.docker.com/linux/$ID $VERSION_CODENAME stable"
curl -fsSL $GPG | sudo gpg --dearmor -o /etc/apt/keyrings/$NAME.gpg
cat << EOF | sudo tee /etc/apt/sources.list.d/$NAME.list
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/$NAME.gpg] $REPO
EOF
sudo apt update
sudo apt install -y \
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker --version
Chỉ được phép Ghi vào Primary node. Sau khi, bản ghi mới sẽ tự nhân bản và Ghi vào các node Secondary (Standby). Mỗi node có một database riêng, lưu trữ tách biệt. Được phép Đọc dữ liệu từ bất kỳ node nào
Tự động bầu chọn Primary node mới
Các node hoạt động trên port 27017
Cài đặt Docker compose, bỏ qua bước này nếu bạn đã cài đặt Docker compose
export VER=2.29.6
sudo curl -SL \
-o /usr/bin/docker-compose \
"https://github.com/docker/compose/releases/download/v${VER}/docker-compose-linux-x86_64"
sudo chmod +x /usr/bin/docker-compose
docker-compose --version
Tạo các folder để lưu trữ dữ liệu lâu dài, đổ dữ liệu từ container ra máy host
sudo mkdir -p /opt/mongo
sudo /usr/bin/docker-compose -f /opt/mongo/mongo.yml down
for i in mongo_primary mongo_standby
do
sudo docker rm -f $i
sudo rm -rf /data/$i
sudo rm -rf /dump/log/$i
sudo mkdir -p /data/$i
sudo mkdir -p /dump/log/$i
sudo chmod -R 777 /data/$i
sudo chmod -R 777 /dump/log/$i
done
cat << EOF | sudo tee /opt/mongo/mongo.yml
networks:
mongo_net:
driver: bridge
x-mongo_common: &mongo_common
networks:
- mongo_net
deploy:
resources:
limits:
memory: 1G
logging:
driver: json-file
options:
max-size: 10m
max-file: 3
image: mongodb/mongodb-community-server:latest
command: --replSet rs0
healthcheck:
test: mongosh --eval "rs.status()" || exit 1
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
restart: always
services:
mongo_primary:
<<: *mongo_common
container_name: mongo_primary
hostname: mongo_primary
ports:
- '27017:27017'
volumes:
- /data/mongo_primary:/data/db:rw
- /dump/log/mongo_primary:/var/log/mongo:rw
mongo_standby:
<<: *mongo_common
container_name: mongo_standby
hostname: mongo_standby
ports:
- '27018:27017'
volumes:
- /data/mongo_standby:/data/db:rw
- /dump/log/mongo_standby:/var/log/mongo:rw
EOF
/usr/bin/docker-compose -f /opt/mongo/mongo.yml up -d
sleep 5
sudo docker exec -it mongo_primary \
mongosh --eval 'rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo1:27017" },
{ _id: 1, host: "mongo2:27017" }
]
})'
/data/... : lưu trữ data lâu dài vào thư mục của máy host
/dump/log/... : lưu trữ log lâu dài vào thư mục của máy host
memory: 1G : phòng tránh tràn bộ nhớ RAM
logging : phòng tránh tràn ổ đĩa do console log
healthcheck: không chỉ cho biết trạng thái của container mà còn kiểm tra cluster database trong container có thực sự sống tốt hay không. Định kỳ kiểm tra 10s/lần, quá 3 lần đánh dấu unhealthy thì docker khẳng định container này là unhealthy
restart: always : tự phục hồi khi gặp lỗi bằng cách tự restart
ports : đưa container ra ngoài internet, node primary chiếm cổng
27017 và node standby chiếm cổng 27018 của máy host
Dùng systemd để giúp MongoDB Cluster tự động khởi động cùng với hệ điều hành
cat << EOF | sudo tee /etc/systemd/system/mongo_rs.service
[Unit]
Description=MongoDB Cluster Replica Set Docker Compose Service
After=docker.service
Requires=docker.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/mongo
ExecStop=/usr/bin/docker-compose -f /opt/mongo/mongo.yml down
ExecStart=/usr/bin/docker-compose -f /opt/mongo/mongo.yml up -d
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now mongo_rs
Cài đặt Cluster Database MongoDB kiến trúc Sharding kết hợp Replica Set bằng Docker Compose
quangnn - November 5, 2024
quangnn - October 27, 2024
Tran Phuc Hau - April 23, 2023
Tran Phuc Hau - April 23, 2023
Tran Phuc Hau - April 23, 2023
Tran Phuc Hau - April 23, 2023
Leverage cloud-native database solutions dedicated for FinTech.
Learn MoreMigrate your legacy Oracle databases to Alibaba Cloud to save on long-term costs and take advantage of improved scalability, reliability, robust security, high performance, and cloud-native features.
Learn MoreMigrating to fully managed cloud databases brings a host of benefits including scalability, reliability, and cost efficiency.
Learn MoreDBStack is an all-in-one database management platform provided by Alibaba Cloud.
Learn MoreMore Posts by quangnn