CentOS或Ubuntu系统下,Redis和MySQL共存部署的最佳实践是什么?

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

关键建议总结

  1. 内存分配:总内存 = MySQL缓冲池 + Redis最大内存 + 系统预留(20%)
  2. 磁盘分离:MySQL日志、数据、Redis持久化使用不同磁盘
  3. 监控先行:部署前建立监控基线,持续观察资源使用
  4. 版本选择:CentOS 7+或Ubuntu 20.04+,MySQL 8.0+,Redis 6.0+
  5. 测试验证:在生产环境前进行压力测试验证配置

根据具体业务场景(读多写少/写密集)调整配置参数,定期审查和优化配置。

云服务器