Redis和MySQL共存部署的最佳实践需要考虑资源隔离、性能优化和运维管理。以下是具体方案:
一、系统层优化
1. 资源隔离配置
# 1. CPU隔离(使用cgroups或taskset)
# Redis绑定到特定CPU核心
taskset -c 0,1 redis-server /etc/redis.conf
# MySQL绑定到其他核心
taskset -c 2,3,4,5 mysqld
# 2. 内存限制
# Redis配置最大内存(建议不超过系统内存的60%)
maxmemory 16GB
maxmemory-policy allkeys-lru
# 3. 磁盘IO隔离
# 使用不同的数据盘或分区
/dev/sdb1 /var/lib/mysql # MySQL数据
/dev/sdc1 /var/lib/redis # Redis数据
2. 内核参数优化
# /etc/sysctl.conf
# 网络优化(Redis需要)
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 内存优化
vm.swappiness = 1 # 减少交换
vm.overcommit_memory = 1 # Redis建议
二、Redis配置优化
1. 生产级配置
# redis.conf
# 绑定到内网IP
bind 127.0.0.1 10.0.0.1
# 启用AOF持久化(根据业务选择)
appendonly yes
appendfsync everysec
# 连接数限制
maxclients 10000
# 慢查询日志
slowlog-log-slower-than 10000
slowlog-max-len 128
# 禁用危险命令
rename-command FLUSHALL ""
rename-command FLUSHDB ""
2. 内存优化策略
# 根据数据类型选择淘汰策略
maxmemory-policy volatile-lru
# 使用hash优化小对象存储
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
三、MySQL配置优化
1. InnoDB优化
# my.cnf
[mysqld]
# 缓冲池大小(建议为系统内存的50-70%)
innodb_buffer_pool_size = 24G
# 日志文件大小
innodb_log_file_size = 2G
innodb_log_files_in_group = 3
# IO配置
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1 # 数据安全优先
# 或 =2 性能优先
# 连接配置
max_connections = 500
thread_cache_size = 50
2. 查询缓存策略
-- 根据Redis使用情况调整MySQL缓存
-- 如果Redis作为缓存层,可减少MySQL查询缓存
SET GLOBAL query_cache_size = 0;
四、部署架构建议
1. 目录结构分离
/data/
├── mysql/
│ ├── data/ # 数据文件
│ ├── logs/ # 二进制日志
│ └── tmp/ # 临时文件
└── redis/
├── data/ # RDB/AOF文件
├── logs/ # Redis日志
└── run/ # PID文件
2. 服务管理
# 使用systemd独立管理
# Redis服务文件
[Unit]
After=network.target mysql.service # MySQL先启动
[Service]
LimitNOFILE=65535 # 文件描述符限制
OOMScoreAdjust=-900 # OOM优先级调整
# MySQL服务文件
[Service]
LimitNOFILE=65535
LimitMEMLOCK=infinity
五、监控与维护
1. 监控指标
# Redis关键指标
redis-cli info memory
redis-cli info stats
# MySQL关键指标
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';
SHOW ENGINE INNODB STATUS;
2. 备份策略
# Redis RDB备份(低峰期)
redis-cli bgsave
# MySQL备份(配合Redis)
mysqldump --single-transaction | gzip > backup.sql.gz
# 备份期间暂停Redis持久化
redis-cli config set save ""
六、安全配置
1. 网络隔离
# 防火墙规则
# Redis只允许应用服务器访问
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 6379 -j ACCEPT
# MySQL访问控制
CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY 'password';
2. 认证加密
# Redis启用密码
requirepass "complex-password-here"
# MySQL SSL连接
GRANT USAGE ON *.* TO 'user'@'%' REQUIRE SSL;
七、故障处理预案
1. 资源竞争处理
# 内存不足时优先级
# 1. 降低Redis最大内存
# 2. 调整MySQL缓冲池
# 3. 添加swap空间(临时方案)
# CPU竞争处理
# 使用cgroups限制进程资源
cgcreate -g cpu:/mysql-limit
cgset -r cpu.shares=768 mysql-limit
2. 服务重启顺序
# 启动顺序
1. MySQL
2. 应用程序
3. Redis
# 关闭顺序
1. Redis(保存数据)
2. 应用程序
3. MySQL
八、容器化部署建议(可选)
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
cpuset: "0-3" # CPU隔离
mem_limit: "24g"
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
cpuset: "4-5" # 独立CPU核心
mem_limit: "8g"
volumes:
- redis_data:/data
关键建议总结
- 内存分配:总内存 = MySQL缓冲池 + Redis最大内存 + 系统预留(20%)
- 磁盘分离:MySQL日志、数据、Redis持久化使用不同磁盘
- 监控先行:部署前建立监控基线,持续观察资源使用
- 版本选择:CentOS 7+或Ubuntu 20.04+,MySQL 8.0+,Redis 6.0+
- 测试验证:在生产环境前进行压力测试验证配置
根据具体业务场景(读多写少/写密集)调整配置参数,定期审查和优化配置。
CLOUD技术笔记