CentOS或Ubuntu 1核1G环境下,MySQL和Redis共存的内存分配建议是什么?

在1核1G的有限资源环境下同时运行MySQL和Redis,需要谨慎分配内存。以下是我的建议:

一、总体分配原则

  • 总内存:1GB = 1024MB
  • 系统预留:150-200MB(系统进程、缓存等)
  • 可用内存:约800-850MB

二、推荐分配方案

方案A:侧重MySQL(适合读多写少)

MySQL:512MB
Redis:256MB
系统:256MB

方案B:均衡分配(通用场景)

MySQL:384MB
Redis:256MB
系统:384MB

方案C:侧重Redis(缓存密集型)

MySQL:256MB
Redis:384MB
系统:384MB

三、具体配置建议

MySQL配置(my.cnf)

[mysqld]
# 基础设置
innodb_buffer_pool_size = 256M  # 根据方案调整
key_buffer_size = 16M
query_cache_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M

# 连接限制
max_connections = 30  # 降低连接数
thread_cache_size = 4

# 日志优化
innodb_log_file_size = 48M
innodb_log_buffer_size = 8M

# 性能优化
innodb_flush_log_at_trx_commit = 2  # 平衡性能与安全

Redis配置(redis.conf)

# 内存限制
maxmemory 256mb  # 根据方案调整
maxmemory-policy allkeys-lru  # 内存不足时淘汰策略

# 持久化优化(节省内存)
save 900 1      # 15分钟至少1个key变化
save 300 10     # 5分钟至少10个key变化
save 60 10000   # 1分钟至少10000个key变化

# 关闭AOF或使用AOF重写
appendonly no  # 或使用 appendfsync everysec

# 连接限制
maxclients 50
timeout 300

四、优化建议

1. 系统层面

# 关闭不需要的服务
systemctl stop postfix   # 邮件服务
systemctl stop avahi-daemon  # 零配置网络

# 调整SWAP(如果使用)
echo "vm.swappiness=10" >> /etc/sysctl.conf

2. 监控工具

# 安装轻量级监控
apt-get install htop iotop  # Ubuntu
yum install htop iotop      # CentOS

# 查看内存使用
free -h
top -o %MEM

3. 应用层面优化

  • MySQL

    • 使用MyISAM表(如果只读)
    • 定期优化表
    • 关闭查询缓存(query_cache_type=0)如果Redis作为缓存
  • Redis

    • 使用Hash压缩小对象
    • 设置合适的过期时间
    • 考虑使用Redis Cluster分片(如果数据量大)

五、应急措施

  1. 内存不足时

    # 查看内存占用
    ps aux --sort=-%mem | head -10
    
    # 清理内存缓存
    echo 3 > /proc/sys/vm/drop_caches
  2. 设置监控告警

    # 简单监控脚本
    while true; do
     free -m | awk 'NR==2{printf "Memory Usage: %.2f%n", $3*100/$2}'
     sleep 60
    done

六、重要提醒

  1. 数据安全:定期备份,考虑使用云盘快照
  2. 性能测试:实际压力测试调整参数
  3. 升级考虑:如果业务增长,建议升级到2GB内存
  4. 容器化:考虑使用Docker限制每个服务的内存使用

推荐从方案B开始,根据实际监控数据调整。使用vmstat 1dstat监控系统资源,根据实际使用情况微调配置。

云服务器