Yêu cầu cấu hình phần cứng tối thiểu cho cụm máy chủ phân tán
Để triển khai hệ thống Database phân tán sử dụng thuật toán Shamir Secret Sharing (SSS) với module Kernel, ta cần ít nhất 3 node vật lý hoặc máy ảo (VM) để đảm bảo tính dư thừa và khả năng khôi phục dữ liệu.
Yêu cầu cấu hình cho mỗi node (Node A, Node B, Node C) như sau:
- CPU: Tối thiểu 2 nhân (Cores) với hỗ trợ ảo hóa (Virtualization Extensions: VT-x/AMD-V) để chạy các module Kernel hiệu năng cao.
- RAM: Tối thiểu 4GB để phân bổ bộ nhớ cho Kernel Space và User Space, đảm bảo không bị OOM (Out Of Memory) khi chia sẻ bí mật.
- Storage: Tối thiểu 50GB SSD (NVMe ưu tiên) để giảm độ trễ I/O khi ghi các shard (phiên bản chia nhỏ) của dữ liệu.
- Mạng: Giao diện mạng Gigabit Ethernet (1Gbps) trở lên, kết nối trong cùng một mạng LAN nội bộ (Private Network).
Tiến hành kiểm tra phần cứng hiện tại bằng lệnh sau để đảm bảo đạt chuẩn trước khi cài đặt:
lscpu | grep "Model name" && free -h && lsblk
Kết quả mong đợi: Xuất hiện thông tin CPU có ít nhất 2 nhân, RAM >= 4G, và danh sách các ổ đĩa SSD.
Cài đặt và chuẩn bị bản phân phối Linux cho các node
Chúng ta sẽ sử dụng Ubuntu Server 22.04 LTS hoặc Debian 12 (Bookworm) cho tất cả các node để đảm bảo tính đồng nhất của môi trường. Ở đây hướng dẫn dùng Ubuntu Server 22.04.
Trong quá trình cài đặt qua ISO, lưu ý chọn các thành phần sau:
- Language: English (để log lỗi chuẩn xác).
- Keyboard Layout: US.
- SSH Server: Tích chọn "Install OpenSSH server" để có thể quản lý từ xa ngay lập tức.
- Software selection: Tích chọn "LXD containers" hoặc "Docker" nếu cần, nhưng quan trọng nhất là giữ mặc định để có kernel sạch.
Sau khi cài đặt xong, đăng nhập vào máy và thực hiện nâng cấp hệ thống để đảm bảo các gói phần cứng và kernel mới nhất được cập nhật:
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
Kết quả mong đợi: Không có lỗi (Errors), tất cả các gói (packages) đều ở phiên bản mới nhất.
Cấu hình tên miền và Hostname
Mỗi node cần có một hostname cố định để các node khác nhận diện trong cụm phân tán. Đổi tên hostname thành node01, node02, node03.
Thực hiện lệnh đổi tên cho node01 (lặp lại cho các node khác với tên tương ứng):
sudo hostnamectl set-hostname node01
Cập nhật file /etc/hosts để ánh xạ IP nội bộ sang tên máy chủ. Giả sử IP của node01 là 192.168.1.10, node02 là 192.168.1.11, node03 là 192.168.1.12.
Chỉnh sửa file /etc/hosts trên tất cả các node với nội dung hoàn chỉnh như sau:
127.0.0.1 localhost
127.0.1.1 node01
# Cluster Nodes
192.168.1.10 node01
192.168.1.11 node02
192.168.1.12 node03
# The following lines are desirable for IPv6 local connectivity:
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Kết quả mong đợi: Chạy lệnh ping node02 từ node01 sẽ thông và trả về IP 192.168.1.11.
Cài đặt công cụ phát triển Kernel
Vì series này yêu cầu viết module Linux Kernel, ta cần cài đặt các package nguồn kernel và công cụ build ngay từ đầu.
sudo apt install -y build-essential linux-headers-$(uname -r) dkms gcc make
Kết quả mong đợi: Các công cụ gcc, make và linux-headers tương thích với kernel hiện hành được cài đặt thành công.
Cấu hình mạng nội bộ (LAN) và SSH Key
Để các node giao tiếp an toàn và tự động mà không cần nhập mật khẩu (cần thiết cho tự động hóa phân tán), ta sẽ cấu hình mạng tĩnh (Static IP) và thiết lập SSH Key-based authentication.
Cấu hình mạng tĩnh (Netplan)
Ubuntu 22.04 sử dụng Netplan để quản lý mạng. Cấu hình file YAML để gán IP cố định.
Truy cập file cấu hình mạng, thường nằm tại /etc/netplan/00-installer-config.yaml hoặc /etc/netplan/50-cloud-init.yaml. Giả sử giao diện mạng là eth0.
Chỉnh sửa file /etc/netplan/00-installer-config.yaml trên node01 với nội dung hoàn chỉnh:
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.10/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
Lặp lại quy trình cho node02 (đổi IP thành 192.168.1.11) và node03 (đổi IP thành 192.168.1.12).
Áp dụng cấu hình mạng:
sudo netplan apply
Kết quả mong đợi: Lệnh ip addr show eth0 hiển thị địa chỉ IP tĩnh đã cấu hình (ví dụ 192.168.1.10).
Thiết lập SSH Key không mật khẩu
Tạo cặp khóa SSH trên node01 (node quản lý chính) và phân phối public key sang các node còn lại.
Trên node01, tạo khóa SSH loại Ed25519 (an toàn và nhanh hơn RSA):
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_cluster -N "" -C "admin@node01"
Lệnh này sẽ tạo file ~/.ssh/id_ed25519_cluster (private) và ~/.ssh/id_ed25519_cluster.pub (public).
Sao chép public key sang node02 và node03. Sử dụng lệnh ssh-copy-id với tùy chọn định dạng key:
ssh-copy-id -i ~/.ssh/id_ed25519_cluster.pub root@node02
ssh-copy-id -i ~/.ssh/id_ed25519_cluster.pub root@node03
Lưu ý: Nếu dùng user khác root, thay thế "root" bằng tên user tương ứng (ví dụ: admin@node02).
Kết quả mong đợi: Khi nhập lệnh ssh root@node02 từ node01, hệ thống kết nối ngay lập tức mà không yêu cầu mật khẩu.
Khởi tạo cấu hình SSH Client tập trung
Để tiện lợi khi thao tác với các node trong script tự động sau này, ta cấu hình file ~/.ssh/config trên node01.
Tạo file /root/.ssh/config với nội dung hoàn chỉnh:
Host node01
HostName 192.168.1.10
User root
IdentityFile ~/.ssh/id_ed25519_cluster
Host node02
HostName 192.168.1.11
User root
IdentityFile ~/.ssh/id_ed25519_cluster
Host node03
HostName 192.168.1.12
User root
IdentityFile ~/.ssh/id_ed25519_cluster
Thiết lập quyền truy cập đúng chuẩn cho file config:
chmod 600 /root/.ssh/config
Kết quả mong đợi: Có thể kết nối bằng lệnh rút gọn ssh node02 mà không cần gõ IP hay user.
Verify kết quả môi trường
Thực hiện các bước kiểm tra cuối cùng để đảm bảo môi trường đã sẵn sàng cho Phần 2 (Lý thuyết Shamir) và Phần 3 (Viết Kernel Module).
1. Kiểm tra kết nối mạng giữa tất cả các node:
for host in node01 node02 node03; do echo "Ping $host:"; ping -c 1 $host; done
Kết quả mong đợi: Tất cả 3 node đều trả về "1 packets transmitted, 1 received, 0% packet loss".
2. Kiểm tra khả năng SSH tự động:
ssh node02 "hostname && uname -r"
Kết quả mong đợi: Xuất hiện tên máy "node02" và phiên bản Kernel (ví dụ: 5.15.0-xx-generic) mà không có prompt yêu cầu mật khẩu.
3. Kiểm tra công cụ build Kernel:
ls /usr/src/linux-headers-$(uname -r) && which gcc && which make
Kết quả mong đợi: Hiển thị đường dẫn thư mục headers và đường dẫn tuyệt đối của các binary gcc, make.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán với Shamir Secret Sharing và Linux Kernel Modules
Phần 2: Lý thuyết nền tảng: Cơ chế chia sẻ bí mật Shamir và kiến trúc phân tán »