1. Xác định yêu cầu phần cứng tối thiểu cho Cluster ScyllaDB
ScyllaDB là hệ thống NoSQL hiệu năng cao, yêu cầu phần cứng mạnh hơn so với Cassandra truyền thống để đạt được latency thấp và throughput cao. Đối với môi trường Production, chúng ta cần tuân thủ các chỉ số sau cho mỗi node.
CPU: Tối thiểu 4 nhân vật lý (Physical Cores) cho từng node. ScyllaDB sử dụng mô hình 1 nhân CPU = 1 shard. CPU phải hỗ trợ tập lệnh AVX2 để tối ưu hóa tính toán.
RAM: Tối thiểu 16GB RAM cho môi trường Development/Test. Đối với Production, quy tắc là 1GB RAM cho mỗi 1GB Disk I/O throughput mong muốn, nhưng không nên chạy ScyllaDB trên node có dưới 16GB RAM vì OS và Java (nếu dùng) sẽ chiếm dụng.
Disk I/O: Sử dụng ổ SSD NVMe là bắt buộc. Không sử dụng HDD hoặc SSD SATA cho dữ liệu thực tế. Disk phải có khả năng IOPS cao và hỗ trợ TRIM/Discard để quản lý file system hiệu quả.
Network: Băng thông nội bộ tối thiểu 10Gbps giữa các node với Latency dưới 1ms. ScyllaDB giao tiếp nội bộ rất nhiều (gossip, stream, read/write).
Verify kết quả: Kiểm tra cấu hình phần cứng hiện tại bằng lệnh sau để đảm bảo đáp ứng yêu cầu:
lscpu | grep "Model name" && free -h && lsscsi && lspci | grep -i nvme
Kết quả mong đợi: Thấy thông tin CPU (ít nhất 4 cores), RAM (>= 16GB), và danh sách thiết bị NVMe được liệt kê.
2. Cài đặt Ubuntu 24.04 Server Edition và Kernel Modules
Ubuntu 24.04 LTS sử dụng Kernel 6.8 mặc định, tương thích tốt với ScyllaDB. Tuy nhiên, cần đảm bảo các module và gói cần thiết cho hiệu năng mạng và disk đã được kích hoạt.
Đầu tiên, cập nhật toàn bộ hệ thống và cài đặt các công cụ quản lý gói cần thiết:
sudo apt update && sudo apt upgrade -y && sudo apt install -y linux-headers-$(uname -r) build-essential git curl wget net-tools iproute2 sysstat
Kết quả mong đợi: Hệ thống được cập nhật lên phiên bản mới nhất, các gói công cụ cài đặt thành công.
Kiểm tra và kích hoạt module `br_netfilter` nếu cần cho bridge network (tùy trường hợp ảo hóa), nhưng quan trọng hơn là kiểm tra module `tcp_mptcp` nếu cần TCP multipath:
modprobe br_netfilter && echo "options br_netfilter bridge_netfilter_priority=1" | sudo tee /etc/modprobe.d/br_netfilter.conf
Kết quả mong đợi: Module được nạp vào kernel và cấu hình file được tạo để tự động load khi khởi động lại.
Tối ưu hóa Kernel Parameter cho ScyllaDB ngay từ đầu để tránh lỗi sau này (file descriptor limits, swap, etc):
cat
Áp dụng các thay đổi ngay lập tức:
sudo sysctl --system
Kết quả mong đợi: Lệnh chạy không báo lỗi, các tham số kernel đã được áp dụng.
3. Cấu hình Hostname và File /etc/hosts
ScyllaDB yêu cầu mỗi node trong cluster phải có một hostname duy nhất và khả năng phân giải tên (DNS) chính xác qua file `/etc/hosts`. Nếu không, quá trình bootstrap node mới sẽ thất bại do không thể tìm thấy các node khác.
Giả sử chúng ta có 3 node với IP và hostname như sau:
- Node 1: 192.168.1.10 - scylla-node-1
- Node 2: 192.168.1.11 - scylla-node-2
- Node 3: 192.168.1.12 - scylla-node-3
Thực hiện trên Node 1 (scylla-node-1):
sudo hostnamectl set-hostname scylla-node-1
Kết quả mong đợi: Hostname của máy thay đổi thành scylla-node-1.
Cập nhật file `/etc/hosts` để chứa tất cả các node trong cluster. Đây là bước quan trọng nhất để đảm bảo connectivity nội bộ:
cat
Kết quả mong đợi: File `/etc/hosts` được ghi đè với đầy đủ ánh xạ IP sang hostname của 3 node.
Lặp lại quy trình tương tự cho Node 2 và Node 3, chỉ thay đổi dòng `set-hostname` và IP của node hiện tại trong file hosts. Đảm bảo file `/etc/hosts` trên TẤT CẢ các node giống hệt nhau.
Verify kết quả: Kiểm tra khả năng ping và phân giải tên từ Node 1 sang các node khác:
ping -c 2 scylla-node-2 && ping -c 2 scylla-node-3
Kết quả mong đợi: Ping thành công, trả về đúng IP 192.168.1.11 và 192.168.1.12.
4. Kiểm tra và Tối ưu hóa Mạng nội bộ
Hiệu năng của ScyllaDB phụ thuộc 90% vào mạng nội bộ. Chúng ta cần đảm bảo latency thấp và băng thông ổn định giữa các node.
Kiểm tra Latency và Jitter giữa các node bằng `ping` với số lượng gói lớn:
ping -c 100 -i 0.01 scylla-node-2 | tail -n 1
Kết quả mong đợi: Giá trị `min/avg/max/mdev` phải rất thấp. Latency trung bình nên dưới 0.5ms và mdev (jitter) gần như bằng 0.
Kiểm tra Bandwidth sử dụng `iperf3` (cần cài đặt trên cả 2 máy). Chạy trên Node 1 (Client) hướng tới Node 2 (Server):
sudo apt install -y iperf3 && iperf3 -s -p 5201 &
Trên Node 1 (sau khi Node 2 đã chạy server mode):
iperf3 -c scylla-node-2 -t 60 -P 4
Kết quả mong đợi: Throughput đạt gần bằng băng thông đường truyền vật lý (ví dụ 9.4 Gbps cho 10Gbps link).
Cấu hình tối ưu cho Network Interface Card (NIC) nếu đang dùng 10Gbps+ để giảm CPU usage và tăng throughput. Điều chỉnh interrupt affinity và ring buffer size:
ethtool -k eth0 | grep -E "rx|tx|ring"
Verify kết quả: Đảm bảo không có gói tin bị mất (packet loss) trong quá trình test và throughput ổn định.
5. Tài khoản người dùng và Cấu hình SSH Key
Để quản lý cluster tập trung và tự động hóa các tác vụ (backup, upgrade), chúng ta cần tạo một tài khoản admin riêng biệt và cấu hình SSH keyless giữa các node.
Tạo user `scyllaadmin` với quyền sudo trên tất cả các node:
sudo useradd -m -s /bin/bash scyllaadmin && sudo passwd scyllaadmin
Thêm user vào nhóm sudo và cấu hình quyền sudo không cần nhập mật khẩu cho các lệnh quan trọng:
sudo usermod -aG sudo scyllaadmin
echo '%sudo ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/journalctl, /usr/bin/scylla, /usr/bin/nodetool, /usr/bin/cqlsh' | sudo tee /etc/sudoers.d/scyllaadmin
Kết quả mong đợi: User `scyllaadmin` được tạo, có quyền sudo không cần password cho các lệnh quản lý hệ thống và Scylla.
Cấu hình SSH Keyless. Thực hiện trên Node 1 (Master Node):
sudo -u scyllaadmin ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
Phân phối public key sang tất cả các node (Node 2, Node 3) để có thể login bằng `scyllaadmin` mà không cần password:
sudo -u scyllaadmin ssh-copy-id -i ~/.ssh/id_ed25519.pub scylla-node-2
sudo -u scyllaadmin ssh-copy-id -i ~/.ssh/id_ed25519.pub scylla-node-3
Kết quả mong đợi: SSH key được copy thành công, thông báo "Number of key(s) added: 1".
Verify kết quả: Thử login từ Node 1 sang Node 2 bằng user `scyllaadmin`:
ssh scyllaadmin@scylla-node-2 "hostname; whoami"
Kết quả mong đợi: Kết nối SSH thành công ngay lập tức, trả về hostname "scylla-node-2" và user "scyllaadmin" mà không yêu cầu nhập password.
Thực hiện tương tự việc copy key từ Node 2 và Node 3 về Node 1 nếu cần quản lý hai chiều, hoặc chỉ cần Node 1 là master để push lệnh.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán với ScyllaDB trên Ubuntu 24.04
Phần 2: Cài đặt ScyllaDB từ repository chính thức và cấu hình cơ bản »