Tối ưu hóa Filesystem và Mount Options cho Disk Data
Định dạng và Mount XFS với Noatime
ScyllaDB hoạt động tốt nhất trên filesystem XFS so với Ext4 do cơ chế quản lý metadata hiệu quả hơn. Chúng ta cần định dạng phân vùng data (ví dụ /dev/nvme0n1p2) và mount với tùy chọn noatime để giảm I/O ghi không cần thiết.
Trước khi thực hiện, xác định tên phân vùng chưa được mount bằng lệnh lsblk. Giả sử phân vùng data là /dev/nvme0n1p2.
mkfs.xfs -f /dev/nvme0n1p2
Kết quả mong đợi: Thông báo "done" khi định dạng xong. Dữ liệu cũ trên phân vùng này sẽ bị xóa.
Tạo thư mục mount point và mount phân vùng mới với các tùy chọn tối ưu: noatime (không cập nhật thời gian truy cập), nodiratime (không cập nhật thời gian thư mục), và logbufs=32 (tăng buffer cho log journal).
mkdir -p /var/lib/scylla
mount -o noatime,nodiratime,logbufs=32 /dev/nvme0n1p2 /var/lib/scylla
Kiểm tra kết quả bằng lệnh df -h. Phân vùng /var/lib/scylla phải hiển thị filesystem XFS và dung lượng đúng.
df -h /var/lib/scylla
Kết quả mong đợi: Dòng đầu tiên hiển thị /dev/nvme0n1p2 với filesystem xfs và thư mục /var/lib/scylla.
Cấu hình Mount vĩnh viễn trong fstab
Để cấu hình này tồn tại sau khi reboot, chúng ta cần chỉnh sửa file /etc/fstab. Sử dụng UUID của phân vùng để đảm bảo an toàn thay vì tên thiết bị.
blkid /dev/nvme0n1p2
Lấy UUID từ kết quả (ví dụ: UUID="abc-123-xyz").
Thêm dòng cấu hình vào file /etc/fstab. Nội dung file /etc/fstab sau khi thêm dòng mới:
UUID=abc-123-xyz /var/lib/scylla xfs noatime,nodiratime,logbufs=32 0 2
Lưu ý: Dòng này được thêm vào cuối file. Số 0 ở cột thứ 5 là fs_passno (không cần kiểm tra boot), số 2 ở cột thứ 6 là fs_freq (kiểm tra filesystem định kỳ).
Verify cấu hình fstab có lỗi syntax hay không bằng lệnh mount -a. Không được có lỗi báo.
mount -a
Kết quả mong đợi: Không có thông báo lỗi. Nếu có lỗi, kiểm tra lại UUID và tên phân vùng.
Điều chỉnh Kernel Parameters cho I/O và Memory
Giảm thiểu Swapping
ScyllaDB yêu cầu RAM rất lớn và không hoạt động tốt khi hệ thống sử dụng swap. Chúng ta cần đặt vm.swappiness về 0 để ngăn Linux đẩy dữ liệu vào disk swap.
sysctl vm.swappiness=0
Kiểm tra lại giá trị hiện tại.
sysctl vm.swappiness
Kết quả mong đợi: Trả về "vm.swappiness = 0".
Để cấu hình này vĩnh viễn, thêm dòng vào file /etc/sysctl.conf hoặc tạo file mới trong /etc/sysctl.d/.
echo "vm.swappiness = 0" >> /etc/sysctl.d/99-scylla.conf
Tối ưu hóa Dirty Pages
ScyllaDB tự quản lý cache, do đó chúng ta cần hạn chế kernel giữ quá nhiều dữ liệu "bẩn" (dirty data) trong RAM trước khi ghi ra disk. Điều này giúp giảm latency khi có burst write.
Điều chỉnh các tham số: dirty_ratio (giới hạn phần trăm RAM cho dirty pages), dirty_background_ratio (tỷ lệ background write), và dirty_expire_centisecs (thời gian dữ liệu bẩn chờ được flush).
sysctl -w vm.dirty_ratio=20
sysctl -w vm.dirty_background_ratio=10
sysctl -w vm.dirty_expire_centisecs=1000
sysctl -w vm.dirty_writeback_centisecs=500
Kết quả mong đợi: Mỗi lệnh trả về giá trị mới đã được đặt thành công.
Thêm các tham số này vào file /etc/sysctl.d/99-scylla.conf để áp dụng sau reboot.
cat >> /etc/sysctl.d/99-scylla.conf
Verify bằng cách đọc lại file cấu hình.
cat /etc/sysctl.d/99-scylla.conf
Disable Transparent Huge Pages (THP)
THP có thể gây latency cao cho ScyllaDB. Chúng ta cần tắt nó đi ngay lập tức và tắt vĩnh viễn.
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
Kiểm tra trạng thái hiện tại.
cat /sys/kernel/mm/transparent_hugepage/enabled
Kết quả mong đợi: Dòng đầu tiên có dấu [never], ví dụ: [always] madvise never.
Tắt vĩnh viễn bằng script systemd. Tạo file /etc/init.d/disable-trans-huge-pages với nội dung:
#!/bin/sh
case "$1" in
start)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
;;
*)
echo "Usage: $0 {start}"
exit 1
esac
Set file có quyền thực thi và enable service.
chmod +x /etc/init.d/disable-trans-huge-pages
systemctl enable disable-trans-huge-pages
systemctl start disable-trans-huge-pages
Cấu hình ScyllaDB Tuning Parameters
Chỉnh sửa scylla.yaml
Tối ưu hóa hiệu năng bắt đầu từ file cấu hình chính /etc/scylla/scylla.yaml. Chúng ta cần điều chỉnh kích thước memtable, số lượng luồng I/O đồng thời và giới hạn bandwidth streaming.
Giả sử server có 32GB RAM và 8 vCPU. Chúng ta sẽ tăng memtable_size_in_mb lên 1GB (hoặc cao hơn tùy RAM), tăng concurrent_reads và concurrent_writes dựa trên số lõi CPU, và giới hạn streaming_rate.
Sửa file /etc/scylla/scylla.yaml. Tìm và thay đổi các dòng sau (sử dụng nano hoặc vi):
memtable_size_in_mb: 1024
concurrent_reads: 64
concurrent_writes: 64
streaming_max_throughput_mb_per_sec: 50
read_request_timeout_in_ms: 5000
write_request_timeout_in_ms: 2000
range_request_timeout_in_ms: 10000
Lưu ý: concurrent_reads/writes thường được đặt bằng 8 * số CPU (hoặc cao hơn cho NVMe). Streaming rate cần được giới hạn để không làm nghẽn mạng khi rebuild node.
Khởi động lại Scylla để áp dụng thay đổi.
systemctl restart scylla
Verify bằng cách kiểm tra log khởi động hoặc dùng nodetool describeclient để xem các tham số runtime.
nodetool describeclient
Kết quả mong đợi: Không có lỗi trong log và các tham số được áp dụng.
Cấu hình scylla-manager.yaml (nếu cần)
Nếu bạn dùng Scylla Manager, file /etc/scylla-manager/scylla-manager.yaml cũng cần điều chỉnh để tối ưu backup và repair, nhưng phần này tập trung vào node DB. Tuy nhiên, đảm bảo scylla.yaml đã được update là ưu tiên hàng đầu.
Tận dụng NVMe và Cấu hình I/O Queue
Kiểm tra và cấu hình NVMe
ScyllaDB tận dụng tối đa lợi thế của NVMe thông qua io_queue. Nếu bạn đang chạy trên NVMe, hãy đảm bảo số lượng io_queue tương ứng với số lượng CPU hoặc phân vùng NVMe.
Xác nhận thiết bị NVMe đang được sử dụng.
lsblk -d -o NAME,TYPE /dev/nvme0n1
Kết quả mong đợi: TYPE hiển thị là "disk" và NAME là nvme0n1.
Điều chỉnh io_queue trong scylla.yaml
Mặc định Scylla tự động phát hiện, nhưng để kiểm soát tốt hơn trên NVMe, chúng ta có thể gán io_queue cụ thể cho data directory. Tuy nhiên, Scylla 4.x+ tự động tối ưu hóa này dựa trên topology. Quan trọng hơn là đảm bảo kernel queue depth đủ lớn.
Tăng queue_depth cho NVMe controller thông qua sysfs.
echo 1024 > /sys/block/nvme0n1/queue/nr_requests
Lưu ý: Giá trị này có thể cần điều chỉnh tùy theo workload. 1024 là giá trị an toàn cho NVMe hiện đại.
Để làm điều này vĩnh viễn, tạo file systemd drop-in hoặc script init tương tự như disable-thp.
cat > /etc/scylla/nvme-tuning.sh
Thêm script này vào startup của scylla service hoặc chạy nó trước khi khởi động scylla.
systemctl restart scylla
Verify lại queue depth.
cat /sys/block/nvme0n1/queue/nr_requests
Kết quả mong đợi: Trả về 1024.
Cấu hình I/O Scheduler
Đối với NVMe, scheduler mặc định là "none" hoặc "kyber" là tốt nhất. Tránh dùng "deadline" hoặc "cfq".
cat /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: Có dấu [ ] bao quanh "none" hoặc "kyber". Nếu không, đặt lại về none.
echo none > /sys/block/nvme0n1/queue/scheduler
Benchmark và Đo lường Hiệu năng
Cài đặt Cassandra-Stress
Để đo lường TPS (Transactions Per Second) sau khi tuning, chúng ta sử dụng công cụ cassandra-stress. Cài đặt nó từ repository hoặc download binary.
apt update
apt install -y cassandra-stress
Kết quả mong đợi: Quá trình cài đặt hoàn tất, không có lỗi.
Chạy Benchmark Write Workload
Chạy benchmark với 1000000 keys, partition size 1KB, và 100 threads. Đo lường thông qua write throughput.
cassandra-stress write n=1000000 -pop seq=1..1000000 -mode native cql3 -rate threads=100 -log file=/var/log/scylla-benchmark-write.log
Tham số -rate threads=100 mô phỏng load cao. Thời gian chạy khoảng 1-2 phút tùy phần cứng.
Monitor real-time throughput bằng cách xem log hoặc dùng watch trên file log.
tail -f /var/log/scylla-benchmark-write.log | grep "write"
Kết quả mong đợi: Dòng log hiển thị "Throughput: XXX ops/sec". Giá trị này nên cao hơn so với cấu hình mặc định (thường > 50k-100k writes/sec cho NVMe).
Chạy Benchmark Read Workload
Sau khi write xong, chạy read benchmark để kiểm tra latency và throughput đọc.
cassandra-stress read n=1000000 -pop seq=1..1000000 -mode native cql3 -rate threads=100 -log file=/var/log/scylla-benchmark-read.log
Quan sát kết quả. Đọc nên đạt latency thấp (dưới 1ms cho 99th percentile) nếu tuning thành công.
Phân tích kết quả
So sánh kết quả benchmark với baseline (trước khi tuning). Nếu TPS tăng 20-50% và latency giảm, việc tuning thành công.
grep "Throughput" /var/log/scylla-benchmark-write.log | tail -n 1
Kết quả mong đợi: Dòng cuối cùng của log hiển thị tổng throughput đạt được.
Đ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 4: Quản lý Dữ liệu: Tạo Keyspace, Table và nhập liệu mẫu
Phần 6: Giám sát và Bảo trì: Scylla Monitor và Backup Data »