+9

Triển khai hệ thống giám sát và sao lưu cho MongoDB trên hạ tầng điện toán đám mây AWS

Việc duy trì và quản lý cơ sở dữ liệu là một phần quan trọng của việc đảm bảo sự ổn định và an toàn cho hạ tầng công nghệ của một tổ chức. Trong bối cảnh hiện nay, MongoDB đã trở thành một trong những hệ thống quản lý cơ sở dữ liệu phổ biến, cung cấp khả năng linh hoạt và mở rộng cho các ứng dụng và dịch vụ trực tuyến. Tuy nhiên, việc triển khai và duy trì MongoDB đòi hỏi sự chú ý đặc biệt đối với các yếu tố như giám sát và sao lưu. Điều này không chỉ giúp đảm bảo hiệu suất của cơ sở dữ liệu mà còn cung cấp khả năng phục hồi dữ liệu trong trường hợp có sự cố xảy ra. Trong hướng dẫn này, tôi sẽ tập trung vào việc cài đặt hệ thống giám sát và sao lưu cho MongoDB trên nền tảng AWS (Amazon Web Services). AWS không chỉ cung cấp một môi trường đám mây linh hoạt mà còn cung cấp các dịch vụ tiện ích để triển khai và quản lý các ứng dụng cơ sở dữ liệu. image.png


1. Tạo và cài đặt MongoDB trên AWS EC2 Instance

1.1 Các bước thiết lập MongoDB cơ bản

image.png

  • Khởi tạo EC2 Instance: Đăng nhập vào AWS Management Console, chọn EC2 và tạo một instance mới. Chọn AMI phù hợp (ví dụ: Amazon Linux 2023) và kích thước instance thích hợp cho nhu cầu của bạn.

  • Cấu hình Security Group: Tạo hoặc sửa đổi Security Group để cho phép truy cập vào cổng MongoDB (mặc định là 27017) từ địa chỉ IP cần thiết.

  • Cài đặt MongoDB: Sử dụng terminal hoặc SSH để kết nối vào instance EC2. Tiến hành cài đặt MongoDB theo như hướng dẫn trên trang chủ của MongoDB

  • Tạo một user cho quá nhằm mục đích quá trình Monitor sau này:

    Bắt đầu bằng cách kết nối với phiên bản MongoDB của bạn bằng mongosh: image.png

    mongosh
    

    Tạo một administrator account cho việc giám sát, chuyến sang database admin:

    use admin
    

    Tiếp theo, tạo user với role clusterMonitor: image.png

    db.createUser({user: "monitor",pwd: " monitoring",roles: [{ role: "clusterMonitor", db: "admin" },{ role: "read", db: "local" }]})
    

    Cuối cùng thoát ra ngoài

    exit()
    

1.2 Mở đường ra Internet

Để thuận tiện cho bài lab, có thể mở đường truy cập vào DB thông qua Internet, thực hiện các bước sau:

  • Cập nhật cấu hình MongoDB: sudo nano /etc/mongod.conf, tìm đến đoạn #network interface và cập nhật bindIp thành0.0.0.0port: là 27024. Sau đó lưu file và chạy lệnh sudo systemctl restart mongod để khởi động lại MongoDB với cấu hình mới.
  • Mở tệp cấu hình MongoDB bằng lệnh sau:
    sudo nano /etc/mongod.conf
    
  • Tìm đến phần cấu hình #network interface.
  • Cập nhật bindIp thành 0.0.0.0 để MongoDB lắng nghe kết nối từ mọi địa chỉ IP:
    bindIp: 0.0.0.0
    
  • Tìm đến phầnport và cập nhật giá trị cổng thành 27024 (hoặc bất kỳ cổng nào bạn muốn sử dụng):
    port: 27024
    
  • Lưu tệp cấu hình bằng cách nhấn Ctrl + O, sau đó nhấn Enter. Tiếp theo, nhấn Ctrl + X để thoát.
  • Khởi động lại dịch vụ MongoDB để áp dụng cấu hình mới:
    sudo systemctl restart mongod
    
    Sau khi bạn hoàn thành các bước này, MongoDB sẽ được cấu hình để lắng nghe kết nối từ mọi địa chỉ IP trên máy chủ và trên cổng 27024. Điều này cho phép các ứng dụng hoặc máy tính từ bên ngoài kết nối đến cơ sở dữ liệu MongoDB của bạn qua cổng 27024. Hãy nhớ rằng việc mở cổng và cho phép kết nối từ bên ngoài cũng tăng nguy cơ bảo mật, vì vậy hãy áp dụng các biện pháp bảo mật phù hợp. image.png
  • Thêm rule Inbound cho Security Groups để mở kết nối ra Internet image.png

1.3 Cài đặt MongoDB Exporter

  • Tải source MongoDB Exporter về EC2, tôi chọn version cao nhất tại thời điểm thực hiện bài viết là là v0.40.0:
    wget https://github.com/percona/mongodb_exporter/releases/download/v0.40.0/mongodb_exporter-0.40.0.linux-amd64.tar.gz
    
  • Tiếp theo, giải nén kho lưu trữ đã tải xuống vào thư mục hiện tại:
    tar xvzf mongodb_exporter-0.40.0.linux-amd64.tar.gz 
    
  • Di chuyển binary file mongodb_exporter sang usr/local/bin/:
    sudo mv mongodb_exporter /usr/local/bin/
    
  • Đến /lib/systemd/system và tạo tệp service cho exporter:
    cd /lib/systemd/system/
    sudo nano mongodb_exporter.service
    
  • Điền cấu hình sau, nhớ đưa 2 cờ collect-alldiscovering-mode để exporter lấy được toàn bộ metric từ DB, ngoải ra bạn có thể lưu mongodb.uri bằng ENV :
    [Unit]
    Description=Prometheus MongoDB Exporter
    Documentation=https://github.com/percona/mongodb_exporter
    After=network.target
    
    [Service]
    Type=simple
    User=ec2-user
    
    EnvironmentFile=-/etc/default/mongodb_exporter
    ExecStart=/usr/local/bin/mongodb_exporter --mongodb.uri=mongodb://monitor:monitoring@0.0.0.0:27024/admin --collect-all --discovering-mode
    SyslogIdentifier=mongodb_exporter
    
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
    
    image.png
  • Chạy service:
    sudo systemctl daemon-reload
    sudo systemctl start mongodb_exporter.service
    sudo systemctl status mongodb_exporter.service
    
    image.png

2. Cài đặt Grafana và Prometheus phục vụ giám sát MongoDB

2.1 Các bước chuẩn bị

  • Tạo thêm một EC2 phục vụ mục tiêu giám sát image.png

  • Để phục vụ triển khai nhanh bài lab này, tôi sử dụng docker, đầu tiên connect vào EC2 này và cài git, mục đích là để lấy các file phục vụ cho quá trình cài đặt.

    sudo yum install git -y
    
  • Tiếp theo cài đặt docker, dùng lệnh sau:

    sudo yum install docker -y
    sudo service docker start
    # make docker  autostart
    sudo chkconfig docker on
    
  • Cài Docker-Compose

    # docker-compose (latest version)
    sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    # Fix permissions after download
    sudo chmod +x /usr/local/bin/docker-compose
    # Verify success
    docker-compose version
    

2.2 Sử dụng docker cài đặt hệ thống giám sát MongoDB

  • Sử dụng Docker Compose, bạn cần sử dụng một tệp tin được gọi là docker-compose.yml để mô tả cấu hình của các dịch vụ, mạng, và các thiết lập khác liên quan đến việc triển khai ứng dụng. Điều này giúp quản lý và triển khai một hoặc nhiều container một cách dễ dàng.

    git clone https://github.com/anhuv/aws-mongodb-monitor-backup.git
    cd monitor
    

    Cấu trúc thư mục monitor như sau: image.png Nôi dung file compose.yml:

    services:
      prometheus:
        image: prom/prometheus
        container_name: prometheus
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
        ports:
          - 9090:9090
        restart: unless-stopped
        volumes:
          - ./prometheus:/etc/prometheus
          - prom_data:/prometheus
      grafana:
        image: grafana/grafana
        container_name: grafana
        ports:
          - 3000:3000
        restart: unless-stopped
        environment:
          - GF_SECURITY_ADMIN_USER=admin
          - GF_SECURITY_ADMIN_PASSWORD=grafana
        volumes:
          - ./grafana/datasources:/etc/grafana/provisioning/datasources
          - ./grafana/dashboards:/etc/grafana/provisioning/dashboards
    volumes:
      prom_data:
    
  • Cập nhật địa chỉ MongoDB Exporter cho Prometheus, thay thế MONGODB_EXPORTER_IP bằng ip address của EC2 cài đặt Exporter, do hai EC2 đặt trong cùng một VPC nên có thể dùng private ip, dùng lệnh:

    sudo  sed -i 's/MONGODB_EXPORTER_IP/172.31.90.42/g' prometheus/prometheus.yml
    

    image.png

  • Cuối cùng gõ lệnh:

    docker-compose up -d
    

    docker-compose: Chương trình chính để quản lý và chạy các container dựa trên cấu hình được định nghĩa trong tệp compose.yml. up: Lệnh để triển khai và chạy các dịch vụ. Và -d là tham số để chạy container ở chế độ nền (detached mode), có nghĩa là các container sẽ chạy ẩn danh và không chiếm lấy cửa sổ hiện tại của bạn. Bạn có thể tiếp tục sử dụng cửa sổ terminal khác mà không bị chặn bởi quá trình chạy container. image.png

  • Đừng quên cập nhập thêm rule Inbound cho Security Groups để mở kết nối ra Internet. image.png

2.3 Kết quả giám sát MongoDB

Đăng nhập từ brower vào địa chỉ của EC2 cài đặt grafana, nhập thông tin username, password như nội dung trong file docker compose. image.png Kết quả của quá trình giám sát MongoDB là thông tin và dữ liệu được thu thập từ hệ thống MongoDB trong quá trình theo dõi và kiểm tra. Đây bao gồm các thống kê về hiệu suất, tài nguyên sử dụng, tình trạng hoạt động của cơ sở dữ liệu, số lượng truy vấn được thực thi, thời gian phản hồi, và các thông tin liên quan khác. Các kết quả này thường được tổ chức và hiển thị thông qua các công cụ giám sát và báo cáo, giúp quản trị viên và nhà phát triển hiểu rõ về hoạt động của MongoDB, phát hiện và giải quyết các vấn đề hiệu suất và hoạt động, và cải thiện hiệu suất và sự ổn định của hệ thống. image.png

image.png


3. Sử dụng AWS Lambda để sao lưu cho MongoDB

3.1 Các bước chuẩn bị

  • Tạo Bucket để lưu trữ các phiên bản sao lưu: image.png
    • Chọn dịch vụ S3 (Simple Storage Service)
    • Nhấp vào nút "Create bucket" để bắt đầu quy trình tạo bucket mới.
    • Đặt tên cho bucket của bạn, hãy chọn một tên duy nhất mà bạn có thể nhớ dễ dàng.
  • Tạo một IAM (Identity and Access Management) Role cho AWS Lambda để cho phép Lambda ghi dữ liệu vào S3, cần thực hiện các bước: image.png
    • Vào phần điều khiển Amazon IAM.
    • Trong thanh điều hướng bên trái, chọn Roles.
    • Nhấp vào nút Create role để bắt đầu quy trình tạo role mới.
    • Trong cửa sổ "Select type of trusted entity", chọn AWS service và sau đó chọn Lambda trong danh sách các dịch vụ AWS. Đối với mục đích trong bài viết này, bạn có thể chọn policy có sẵn như AmazonS3FullAccess nếu bạn muốn Lambda có quyền truy cập đầy đủ vào S3, hoặc bạn có thể tạo một policy tùy chỉnh với các quyền cụ thể bạn cần.

3.2 Tạo AWS Lambda phục vụ quá trình sao lưu dữ liệu

  • Mở AWS Lambda Console
  • Trong giao diện Lambda Console, nhấp vào nút "Create function" để bắt đầu quy trình tạo Lambda Function mới.
  • Chọn Author from Scratch
  • Cấu hình Lambda Function: đặt tên cho Lambda function của bạn, chọn runtime Python 3.10, chọn architecture x86.
  • Gán role ghi dữ liệu vào S3 đã tạo trước đó cho Lambda function.
  • Dán mã nguồn vào vào trình soạn thảo code trên web AWS, (bạn có thể upload file zip đính kèm sau demo.zip) lambda.PNG
  • Cấu hình trigger cho lambda funtion, trong bài lab này sẽ lập lịch cho AWS Lambda functions bằng EventBridge, tần suất sao lưu cơ sở dữ liệu phụ thuộc vào quy mô hệ thống, yêu cầu kinh doanh, và mức độ quan trọng của dữ liệu. Hệ thống quan trọng cần sao lưu hàng ngày hoặc thậm chí hàng giờ, trong khi hệ thống ít quan trọng có thể thực hiện sao lưu hàng tuần hoặc hàng tháng. Tôi lấy tạm 5 phút để nhanh có kết quả demo. image.png image.png
  • Trong trang cấu hình Lambda, bạn có thể thiết lập thời gian chạy tối đa cho Lambda function bằng cách di chuyển xuống phần Configuration. Ở đây, bạn sẽ thấy mục Timeout với một giá trị mặc định. Nhấn vào ô Edit bên cạnh nó để thay đổi thời gian chạy tối đa theo ý muốn của bạn. Timeout được tính bằng giây và là thời gian tối đa mà Lambda function được phép chạy trước khi bị hủy bỏ. image.png
  • Trong trang cấu hình Lambda, thêm các biến môi trường bằng cách di chuyển xuống phần "Environment variables" trong trình chỉnh sửa Lambda function. Nhấn vào "Edit" để thêm hoặc sửa đổi các biến môi trường. Bạn có thể thêm các cặp key-value tùy ý để đặt các biến môi trường cho Lambda function của bạn. Biến môi trường có thể được sử dụng để lưu trữ các thông tin như cấu hình, giá trị cố định, hay bất kỳ điều gì mà Lambda function cần sử dụng. lambda-env.PNG
  • Kiểm tra và triển khai: Sau khi hoàn thành cấu hình, bạn có thể xem lại tất cả các thông số và nhấn nút Create function hoặc Deploy để tạo Lambda function.

3.3 Kết quả sao lưu dữ liệu

Sau khi triển khai Lamda function, dữ liệu của bạn sẽ được sao lưu định kỳ và tự động vào Amazon S3, cung cấp một lớp bảo vệ đáng tin cậy cho dữ liệu của bạn. image.png


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í