×
Community Blog Cài đặt Cluster Database MongoDB kiến trúc Replica Set bằng Docker Compose

Cài đặt Cluster Database MongoDB kiến trúc Replica Set bằng Docker Compose

Cài đặt Database MongoDB kiến trúc Cluster Replica Set bằng Docker Compose, quản lý bằng systemd

Docker đơn giản

Tạo container

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

1

Tìm địa chỉ IP

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

Khởi tạo Cluster

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.

Kiểm tra kết quả

Câu lệnh kiểm tra trạng thái Cluster

docker exec -it mongo_primary mongosh --eval "rs.status()"

2

Cài đặt Docker (nếu chưa có)

Để 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

Cơ chế hoạt động của Cluster Replica Set

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

3

Tự động bầu chọn Primary node mới

4

Các node hoạt động trên port 27017

Triển khai bằng Docker compose

Cài đặt Docker compose (nếu chưa có)

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

Chuẩn bị

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

Triển khai

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" }
  ]
})'

3

/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

Quản lý MongoDB Cluster bằng systemd

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
0 0 0
Share on

quangnn

8 posts | 0 followers

You may also like

Comments

quangnn

8 posts | 0 followers

Related Products