Bai nay huong dan ve Bao mat, Backup va Deploy Redis trong production. Bai cuoi cung cua series Redis Production.
3. Security — Bảo mật Redis
Redis mặc định không có bảo mật. Trong production, đây là lỗ hổng nghiêm trọng cần được khắc phục ngay lập tức.
3.1. AUTH — Xác thực mật khẩu
# redis.conf — Đặt mật khẩu mạnh
requirepass "R3d1s_Secure_2024_StrongPass"
# Kết nối với mật khẩu
redis-cli -a "R3d1s_Secure_2024_StrongPass"
# Hoặc xác thực sau khi kết nối
redis-cli
127.0.0.1:6379> AUTH R3d1s_Secure_2024_StrongPass
OK
3.2. rename-command — Ẩn lệnh nguy hiểm
# redis.conf — Vô hiệu hóa hoặc đổi tên lệnh nguy hiểm
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG "PROD_CONFIG_a8f3e2d1"
rename-command SHUTDOWN "PROD_SHUTDOWN_b7c4f1e9"
# Đặt tên thành chuỗi ngẫu nhiên để chỉ admin biết
3.3. ACL — Access Control Lists (Redis 6+)
ACL cho phép tạo nhiều user với quyền hạn khác nhau:
# Tạo user chỉ đọc
ACL SETUSER readonly on >readonly_pass ~* +@read -@dangerous
# Tạo user ứng dụng với quyền hạn cụ thể
ACL SETUSER app_user on >app_pass ~app:* +@read +@write +@string +@hash +@list -FLUSHDB -FLUSHALL -CONFIG -DEBUG
# Tạo user monitoring
ACL SETUSER monitor_user on >monitor_pass ~* +@read +INFO +SLOWLOG +CONFIG|GET
# Xem danh sách user
ACL LIST
# Xem chi tiết user hiện tại
ACL WHOAMI
ACL GETUSER app_user
3.4. Các biện pháp bảo mật khác
# redis.conf
# 1. Bind vào IP cụ thể (không bind 0.0.0.0)
bind 127.0.0.1 10.0.0.5
# 2. Thay đổi port mặc định
port 6380
# 3. Bảo vệ mode (chặn truy cập từ bên ngoài khi chưa đặt mật khẩu)
protected-mode yes
# 4. Disable các command nguy hiểm
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
# 5. Sử dụng TLS/SSL (Redis 6+)
# tls-port 6379
# tls-cert-file /path/to/redis.crt
# tls-key-file /path/to/redis.key
# tls-ca-cert-file /path/to/ca.crt
# 6. Giới hạn kết nối
maxclients 10000
# 7. Timeout cho client idle
timeout 300 # Ngắt kết nối sau 5 phút không hoạt động
5. Backup & Recovery — Sao lưu và khôi phục
5.1. RDB Snapshots
# redis.conf — Cấu hình RDB
save 900 1 # Lưu snapshot nếu có >= 1 write trong 900 giây
save 300 10 # Lưu snapshot nếu có >= 10 writes trong 300 giây
save 60 10000 # Lưu snapshot nếu có >= 10000 writes trong 60 giây
dbfilename dump.rdb
dir /var/lib/redis/
# Tạo snapshot thủ công
redis-cli BGSAVE
# Kiểm tra trạng thái snapshot
redis-cli LASTSAVE
redis-cli INFO persistence | grep rdb_last_bgsave_status
5.2. AOF (Append Only File)
# redis.conf — Cấu hình AOF
appendonly yes
appendfilename "appendonly.aof"
# Chính sách fsync
appendfsync everysec # Khuyến nghị: đồng bộ mỗi giây
# appendfsync always # An toàn nhất nhưng chậm
# appendfsync no # Nhanh nhất nhưng rủi ro
# AOF rewrite để giảm kích thước file
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# Kích hoạt cả RDB và AOF cho an toàn tối đa
aof-use-rdb-preamble yes # Redis 5+: Kết hợp RDB + AOF
5.3. Backup strategy production
#!/bin/bash
# backup_redis.sh — Script backup tự động
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
REDIS_HOST="localhost"
REDIS_PORT="6379"
REDIS_PASS="your_password"
mkdir -p $BACKUP_DIR
# 1. Tạo RDB snapshot
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS BGSAVE
sleep 5
# 2. Copy file dump.rdb
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_${DATE}.rdb
# 3. Copy AOF file (nếu có)
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/appendonly_${DATE}.aof 2>/dev/null
# 4. Nén backup
tar -czf $BACKUP_DIR/redis_backup_${DATE}.tar.gz -C $BACKUP_DIR dump_${DATE}.rdb appendonly_${DATE}.aof
# 5. Xóa backup cũ hơn 30 ngày
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
echo "Backup completed: redis_backup_${DATE}.tar.gz"
6. Docker & Docker Compose — Production Setup
Chạy Redis trong Docker production đòi hỏi cấu hình đặc biệt để đảm bảo persistence và hiệu năng:
# docker-compose.yml — Redis Production Setup
version: '3.8'
services:
redis:
image: redis:7-alpine
container_name: redis-production
restart: always
ports:
- "6379:6379"
volumes:
- redis_data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf:ro
command: redis-server /usr/local/etc/redis/redis.conf
sysctls:
- net.core.somaxconn=1024
ulimits:
nofile:
soft: 65536
hard: 65536
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 1G
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
redis-commander:
image: rediscommander/redis-commander:latest
container_name: redis-commander
restart: always
ports:
- "8081:8081"
environment:
- REDIS_HOSTS=local:redis:6379:0:your_password
depends_on:
- redis
volumes:
redis_data:
driver: local
# redis.conf — Tối ưu cho Docker
# Memory
maxmemory 1536mb
maxmemory-policy allkeys-lru
# Persistence
appendonly yes
appendfsync everysec
save 900 1
save 300 10
save 60 10000
# Security
requirepass "Docker_Redis_Prod_2024"
rename-command FLUSHALL ""
rename-command FLUSHDB ""
# Performance
tcp-backlog 511
timeout 300
tcp-keepalive 60
maxclients 10000
# Disable THP (Transparent Huge Pages)
# Chạy trên host: echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Deploy và quản lý
docker-compose up -d
# Kiểm tra logs
docker-compose logs -f redis
# Kết nối vào container
docker exec -it redis-production redis-cli -a your_password
# Kiểm tra health
docker exec -it redis-production redis-cli ping
Xem thêm: Tất cả bài viết về Redis · Persistence RDB vs AOF · Redis Monitoring · Replication & High Availability