Yêu cầu phần cứng và phần mềm tối thiểu cho cụm 3 node
Để đảm bảo tính sẵn sàng cao (High Availability) và hiệu năng cho cơ chế đồng thuận Raft, chúng ta cần một cụm gồm 3 node với cấu hình cân bằng. Raft yêu cầu majority (phần đa số) để cam kết giao dịch, do đó 3 node là con số tối thiểu để chịu được 1 lỗi (failover).
Cấu hình phần cứng tối thiểu cho mỗi node (Node 1, Node 2, Node 3):
- CPU: Tối thiểu 4 vCPU (Khuyến nghị: 8 vCPU để xử lý đồng bộ và log replication).
- RAM: Tối thiểu 8GB (Khuyến nghị: 16GB để đệm dữ liệu và chạy OS cùng các agent monitoring).
- Disk: Tối thiểu 100GB NVMe SSD. Quan trọng: Phân vùng riêng biệt cho dữ liệu DB và log để tránh contention I/O.
- Network: Băng thông nội bộ (Intranet) tối thiểu 1Gbps, latency dưới 5ms giữa các node.
Hệ điều hành được lựa chọn: Ubuntu 22.04 LTS hoặc CentOS Stream 9 (hoặc Rocky Linux 9). Phiên bản LTS đảm bảo sự ổn định lâu dài cho các gói hệ thống và kernel audit. Bài hướng dẫn này sử dụng Ubuntu 22.04 LTS làm tiêu chuẩn.
Để verify cấu hình phần cứng hiện tại trên server, chạy lệnh sau trên mỗi node:
lscpu | grep "Model name" && free -h && lsblk -o NAME,SIZE,TYPE,FSTYPE
Kết quả mong đợi: Hiển thị tên CPU, tổng RAM (ví dụ 16G), và danh sách disk với filesystem ext4/xfs. Nếu RAM dưới 8GB hoặc disk không phải SSD, cần nâng cấp trước khi triển khai.
Cấu hình mạng cơ bản và Firewall giữa các node
Trước khi cài đặt database, cần đảm bảo mạng giữa 3 node thông suốt trên các cổng quan trọng. Raft sử dụng cổng TCP để giao tiếp giữa các follower và leader, trong khi TDE và Audit cần cổng riêng cho agent monitoring.
Các cổng bắt buộc phải mở (Open Ports):
- 22: SSH (Quản trị).
- 8080 - 8082: Giao diện HTTP API của Database (Giả định).
- 9000 - 9002: Cổng Raft Consensus (Giao tiếp node-to-node).
- 9100: Node Exporter (Monitoring).
- 9090: Prometheus Server (Trên 1 node).
Thực hiện cấu hình UFW (Uncomplicated Firewall) trên Ubuntu 22.04. Chạy lệnh này trên tất cả 3 node để cho phép lưu lượng nội bộ:
sudo ufw allow from 192.168.1.0/24 to any port 22,8080,8081,8082,9000,9001,9002,9100,9090 proto tcp
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
Kết quả mong đợi: UFW hiển thị trạng thái "active" và danh sách các rule cho phép (ALLOW) trên các cổng đã liệt kê. Kiểm tra lại bằng lệnh:
sudo ufw status verbose
Để verify kết nối mạng giữa các node, sử dụng lệnh ping và check port từ Node 1 sang Node 2 và Node 3:
ping -c 3 192.168.1.11 && nc -zv 192.168.1.12 9001
Kết quả mong đợi: Ping trả về thời gian phản hồi (time) dưới 1ms và `nc` trả về "succeeded" cho cổng 9001.
Khởi tạo SSH key và cấu hình kết nối không mật khẩu
Để tự động hóa việc triển khai và quản lý cụm, admin cần có khả năng SSH từ Node 1 (Master/Controller) sang Node 2 và Node 3 mà không cần nhập mật khẩu. Điều này cũng cần thiết cho các script backup và recovery.
Thực hiện trên Node 1 (IP: 192.168.1.10) để tạo key pair mới nếu chưa có:
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_rsa_cluster -C "cluster-admin@node1" -N ""
Kết quả mong đợi: Hiển thị thông báo "Your identification has been saved in..." và không có lỗi. File `id_rsa_cluster` và `id_rsa_cluster.pub` được tạo trong `~/.ssh/`.
Sao chép public key sang Node 2 và Node 3. Sử dụng `ssh-copy-id` để tự động cập nhật `authorized_keys`:
ssh-copy-id -i ~/.ssh/id_rsa_cluster.pub user@192.168.1.11
ssh-copy-id -i ~/.ssh/id_rsa_cluster.pub user@192.168.1.12
Thay thế `user` bằng tên tài khoản admin thực tế của bạn. Kết quả mong đợi: Hệ thống yêu cầu nhập mật khẩu 1 lần duy nhất cho mỗi node để xác thực, sau đó hiển thị số lượng key đã thêm vào.
Để verify kết nối không mật khẩu, thực hiện lệnh SSH đến cả 2 node còn lại:
ssh -i ~/.ssh/id_rsa_cluster user@192.168.1.11 "echo 'Node 2 Connected' && hostname"
ssh -i ~/.ssh/id_rsa_cluster user@192.168.1.12 "echo 'Node 3 Connected' && hostname"
Kết quả mong đợi: Kết nối thành công ngay lập tức, không xuất hiện prompt yêu cầu mật khẩu, và trả về hostname của node đích.
Cài đặt công cụ monitoring cơ bản (Prometheus và Node Exporter)
Trước khi đưa database vào hoạt động, cần có hệ thống giám sát cơ bản để theo dõi sức khỏe node (CPU, RAM, Disk, Network). Chúng ta sẽ cài đặt Prometheus trên Node 1 và Node Exporter trên tất cả 3 node.
Bước 1: Cài đặt Node Exporter trên tất cả 3 node. Tạo file systemd service để chạy như daemon:
Tạo file cấu hình service tại `/etc/systemd/system/node_exporter.service` với nội dung hoàn chỉnh:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=root
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Chạy lệnh tải Node Exporter (phiên bản 1.7.0 stable) và cấu hình quyền:
curl -fsSL https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz | sudo tar -xz -C /tmp/
sudo mv /tmp/node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chmod +x /usr/local/bin/node_exporter
sudo mkdir -p /etc/systemd/system
sudo nano /etc/systemd/system/node_exporter.service
# Paste nội dung file trên vào nano, lưu và thoát (Ctrl+O, Enter, Ctrl+X)
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
Kết quả mong đợi: Service khởi động thành công. Kiểm tra bằng lệnh `systemctl status node_exporter` thấy trạng thái "active (running)".
Bước 2: Cài đặt Prometheus trên Node 1 (Master Node). Tạo cấu hình scrape targets để thu thập dữ liệu từ 3 node.
Tạo file cấu hình tại `/etc/prometheus/prometheus.yml` với nội dung hoàn chỉnh:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets:
- '192.168.1.10:9100'
- '192.168.1.11:9100'
- '192.168.1.12:9100'
labels:
cluster: 'raft-prod'
environment: 'production'
Chạy lệnh tải Prometheus và tạo service:
curl -fsSL https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz | sudo tar -xz -C /tmp/
sudo mkdir -p /etc/prometheus
sudo mv /tmp/prometheus-2.47.0.linux-amd64/prometheus /usr/local/bin/
sudo mv /tmp/prometheus-2.47.0.linux-amd64/promtool /usr/local/bin/
sudo mv /tmp/prometheus-2.47.0.linux-amd64/consoles /etc/prometheus/
sudo mv /tmp/prometheus-2.47.0.linux-amd64/console_libraries /etc/prometheus/
sudo chown -R root:root /etc/prometheus
# Tạo file config đã chuẩn bị ở trên
sudo nano /etc/prometheus/prometheus.yml
# Paste nội dung file trên vào nano, lưu và thoát
Tạo file systemd service cho Prometheus tại `/etc/systemd/system/prometheus.service`:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=root
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--web.listen-address=0.0.0.0:9090 \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
Restart=on-failure
[Install]
WantedBy=multi-user.target
Khởi động và enable Prometheus:
sudo mkdir -p /var/lib/prometheus
sudo chown -R root:root /var/lib/prometheus
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
Kết quả mong đợi: Prometheus chạy trên cổng 9090. Truy cập trình duyệt tại `http://192.168.1.10:9090` và vào tab "Status" -> "Targets".
Để verify kết quả cuối cùng, kiểm tra số lượng targets đang hoạt động:
curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | .labels.job'
Kết quả mong đợi: Trả về danh sách 3 mục, tất cả đều là "node_exporter" và trạng thái "UP". Điều này xác nhận môi trường monitoring đã sẵn sàng cho các bước triển khai Database Raft trong phần tiếp theo.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán an toàn với Raft, TDE và Linux Kernel Audit
Phần 2: Triển khai cơ chế đồng thuận Raft cho Database »