Phân tích và xử lý sự cố từ Log file
Để xác định nguyên nhân lỗi, bước đầu tiên là kiểm tra các file log chính của ScyllaDB. File system.log chứa các lỗi mức độ nghiêm trọng, trong khi debug.log chứa thông tin chi tiết về quá trình xử lý bên trong.
1. Kiểm tra lỗi quan trọng trong system.log
ScyllaDB ghi log vào thư mục /var/log/scylla. Sử dụng grep để lọc các dòng chứa "ERROR", "WARN", hoặc "Exception" trong 100 dòng cuối cùng.
grep -E "ERROR|WARN|Exception" /var/log/scylla/system.log | tail -n 100
Kết quả mong đợi: Danh sách các dòng log hiển thị thông báo lỗi cụ thể, ví dụ: Failed to connect to peer hoặc Commitlog full.
2. Bật chế độ debug để phân tích sâu
Nếu lỗi không rõ ràng trong system.log, cần tăng mức log lên DEBUG. Điều này giúp xem chi tiết từng request và giao tiếp giữa các node.
systemctl edit scylla-server
Sau khi file config mở ra, thêm dòng sau vào phần [Service]:
ExecStartPre=/bin/sh -c 'echo "DEBUG" > /etc/scylla.d/debug-logging.conf'
ExecStart=/usr/bin/scylla --log-to-syslog --debug-logging
Kết quả mong đợi: Sau khi restart service, file debug.log sẽ bắt đầu ghi lại chi tiết các thao tác nội bộ của Scylla.
3. Restart dịch vụ để áp dụng cấu hình debug
systemctl restart scylla-server
Kết quả mong đợi: Service khởi động lại, log mới được ghi vào với mức độ chi tiết cao hơn.
Xử lý sự cố Node mất kết nối (Timeout) hoặc không Join Cluster
Đây là lỗi phổ biến nhất khi mạng không ổn định hoặc cấu hình seed sai. Khi node không thể join, nó sẽ ở trạng thái UNAVAILABLE hoặc LEAVING trong nodetool status.
1. Kiểm tra trạng thái mạng và Seed
Đảm bảo node mới có thể ping được đến các node seed hiện có và cổng giao tiếp (native transport 9042, inter-node 7000) mở.
telnet 9042
telnet 7000
Kết quả mong đợi: Kết nối thành công (Connection established). Nếu thất bại, kiểm tra firewall hoặc security group.
2. Reset trạng thái Node bị lỗi
Nếu node bị treo ở trạng thái LEAVING hoặc DECOMMISSIONED nhưng không thể ra khỏi cluster, cần reset trạng thái bằng --force-start.
systemctl stop scylla-server
rm -rf /var/lib/scylla/data/system_*
rm -rf /var/lib/scylla/data/__snapshot*
systemctl start scylla-server --force-start
Kết quả mong đợi: Node khởi động lại và bắt đầu quá trình bootstrap (tải dữ liệu) từ các node khác thay vì giữ nguyên trạng thái lỗi.
3. Kiểm tra lại trạng thái Cluster
Chạy lệnh nodetool status trên một node đã ổn định để xác nhận node vừa sửa đã quay lại.
nodetool status
Kết quả mong đợi: Node bị lỗi xuất hiện với trạng thái UN (Up Normal) hoặc UN (joining).
Chiến lược tái cân bằng dữ liệu (Rebalance) khi thêm Node mới
ScyllaDB tự động phân phối dữ liệu (sharding) dựa trên token ring. Khi thêm node mới, dữ liệu sẽ tự động di chuyển từ các node cũ sang node mới. Tuy nhiên, việc này cần được giám sát để tránh quá tải.
1. Thêm Node mới vào Cluster
Khởi động Scylla trên node mới với cấu hình seeded đúng IP của node hiện có. Scylla sẽ tự động trigger quá trình bootstrap.
systemctl start scylla-server
Kết quả mong đợi: Log hiển thị Starting to bootstrap và Streaming data.
2. Giám sát quá trình Streaming
Sử dụng nodetool streamer để xem tiến trình truyền tải dữ liệu và ước lượng thời gian hoàn thành.
nodetool streamer
Kết quả mong đợi: Danh sách các task streaming đang chạy, hiển thị trạng thái IN_PROGRESS và lượng data đã truyền.
3. Tăng tốc độ Rebalance (Tuning)
Nếu quá trình streaming quá chậm, tăng tham số stream_throughput_outbound_megabits_per_sec trong file cấu hình.
echo "stream_throughput_outbound_megabits_per_sec: 200" >> /etc/scylla/scylla.yaml
Kết quả mong đợi: Sau khi restart service, tốc độ truyền dữ liệu giữa các node sẽ tăng lên đáng kể (tối đa 200 Mbps/node).
4. Xác nhận cân bằng hoàn tất
Kiểm tra lại trạng thái token ring để đảm bảo dữ liệu đã được phân bổ đều.
nodetool status
Kết quả mong đợi: Tất cả các node đều ở trạng thái UN và nodetool status không còn hiển thị joining hoặc leaving.
Tăng cường bảo mật: Authentication và Authorization
ScyllaDB mặc định không bật xác thực. Để bảo vệ dữ liệu, cần cấu hình allow_authenticator và allow_authorizer trong scylla.yaml.
1. Bật Authentication và Authorization
Chỉnh sửa file /etc/scylla/scylla.yaml để kích hoạt các cơ chế bảo mật mặc định.
sed -i 's/# allow_authenticator: false/allow_authenticator: true/' /etc/scylla/scylla.yaml
sed -i 's/# allow_authorizer: CppAuthorizer/allow_authorizer: CppAuthorizer/' /etc/scylla/scylla.yaml
Kết quả mong đợi: Các dòng cấu hình bảo mật đã được uncomment và bật lên.
2. Tạo người dùng Superuser
Trước khi restart, cần tạo ít nhất một người dùng có quyền cao nhất (superuser) để tránh khóa mình ngoài hệ thống. Sử dụng cqlsh hoặc scylla-cli.
cqlsh -e "CREATE USER 'admin' WITH PASSWORD 'StrongPassword123!' AND SUPERUSER;"
Kết quả mong đợi: Người dùng admin được tạo thành công.
3. Restart Scylla để áp dụng bảo mật
systemctl restart scylla-server
Kết quả mong đợi: Service khởi động lại. Mọi kết nối CQL từ bây giờ đều yêu cầu username/password.
4. Kiểm tra bảo mật
Thử kết nối không có thông tin đăng nhập để xác nhận bảo mật đã hoạt động.
cqlsh
Kết quả mong đợi: Lệnh bị từ chối với lỗi Authentication failed hoặc yêu cầu nhập username/password.
5. Kết nối với thông tin đăng nhập
cqlsh -u admin -p StrongPassword123!
Kết quả mong đợi: Kết nối thành công và hiển thị prompt cqlsh>.
Mẹo nâng cao: Scylla Cloud và Docker Compose cho Dev/Test
Đối với môi trường phát triển (Dev/Test) hoặc khi muốn trải nghiệm ScyllaDB mà không cần setup hạ tầng vật lý phức tạp, sử dụng Docker Compose hoặc Scylla Cloud là giải pháp tối ưu.
1. Triển khai Cluster 3-node bằng Docker Compose
Tạo file docker-compose.yml để mô phỏng môi trường production với 3 node ScyllaDB.
version: '3'
services:
scylla-1:
image: scylla/scylla:latest
ports:
- "9042:9042"
- "7000:7000"
- "10000:10000"
environment:
- SEEDS=172.18.0.2,172.18.0.3
- CLUSTER_NAME=test_cluster
- RACK=rack1
- DATA_DIR=/var/lib/scylla/data
- CASSANDRA_RPC_ADDRESS=172.18.0.2
- CASSANDRA_BROADCAST_ADDRESS=172.18.0.2
volumes:
- scylla-data-1:/var/lib/scylla/data
scylla-2:
image: scylla/scylla:latest
ports:
- "9043:9042"
environment:
- SEEDS=172.18.0.2,172.18.0.3
- CLUSTER_NAME=test_cluster
- RACK=rack1
- DATA_DIR=/var/lib/scylla/data
- CASSANDRA_RPC_ADDRESS=172.18.0.3
- CASSANDRA_BROADCAST_ADDRESS=172.18.0.3
volumes:
- scylla-data-2:/var/lib/scylla/data
scylla-3:
image: scylla/scylla:latest
ports:
- "9044:9042"
environment:
- SEEDS=172.18.0.2,172.18.0.3
- CLUSTER_NAME=test_cluster
- RACK=rack1
- DATA_DIR=/var/lib/scylla/data
- CASSANDRA_RPC_ADDRESS=172.18.0.4
- CASSANDRA_BROADCAST_ADDRESS=172.18.0.4
volumes:
- scylla-data-3:/var/lib/scylla/data
volumes:
scylla-data-1:
scylla-data-2:
scylla-data-3:
Kết quả mong đợi: Chạy lệnh docker-compose up -d sẽ khởi động 3 container ScyllaDB tự động join thành cluster.
2. Kết nối vào Docker Cluster
Sử dụng cqlsh để kết nối vào node đầu tiên (port 9042).
cqlsh 127.0.0.1 9042
Kết quả mong đợi: Kết nối thành công, có thể thực thi các lệnh CQL để kiểm tra cluster.
3. Sử dụng Scylla Cloud cho môi trường Test nhanh
Thay vì tự deploy, đăng ký tài khoản miễn phí tại Scylla Cloud để có ngay một cluster ảo.
curl -O https://github.com/scylladb/scylla-tools/releases/download/5.1.0/scylla-cli-linux-amd64
chmod +x scylla-cli-linux-amd64
./scylla-cli-linux-amd64 connect
Kết quả mong đợi: Công cụ scylla-cli kết nối trực tiếp vào cluster Scylla Cloud qua internet mà không cần firewall.
4. Verify kết quả cuối cùng
Trong Docker hoặc Cloud, chạy lệnh để kiểm tra trạng thái cluster.
nodetool status
Kết quả mong đợi: Hiển thị 3 node với trạng thái UN, xác nhận môi trường test đã sẵn sàng.
Đ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 6: Giám sát và Bảo trì: Scylla Monitor và Backup Data