CentOS或Ubuntu系统中,如何实现Redis与MySQL的服务级集成?

在 CentOS 或 Ubuntu 系统中实现 Redis 与 MySQL 的服务级集成,通常涉及缓存、数据同步或解耦架构。以下是几种常见方案及具体实现步骤:


一、常见集成模式

1. 缓存模式(Cache-Aside)

Redis 作为 MySQL 的热数据缓存,降低数据库压力。

实现步骤:

  1. 安装服务

    # Ubuntu/Debian
    sudo apt update
    sudo apt install redis-server mysql-server
    
    # CentOS/RHEL
    sudo yum install epel-release
    sudo yum install redis mysql-server
  2. 配置 Redis 持久化(可选)

    sudo vim /etc/redis/redis.conf
    # 启用 RDB 或 AOF
    save 900 1      # 15分钟至少1个key变化则保存
    appendonly yes  # 启用AOF
  3. 应用层代码示例(Python)

    import redis
    import pymysql
    import json
    
    # 连接Redis和MySQL
    r = redis.Redis(host='localhost', port=6379, db=0)
    db = pymysql.connect(host='localhost', user='user', password='pass', database='test')
    
    def get_user(user_id):
       # 1. 先查Redis
       key = f"user:{user_id}"
       data = r.get(key)
       if data:
           return json.loads(data)
    
       # 2. Redis未命中,查MySQL
       cursor = db.cursor()
       cursor.execute("SELECT * FROM users WHERE id=%s", (user_id,))
       result = cursor.fetchone()
    
       # 3. 写入Redis并设置过期时间
       if result:
           r.setex(key, 3600, json.dumps(result))  # 缓存1小时
       return result

2. 数据同步模式

保持 Redis 与 MySQL 数据一致性(近实时)。

使用 Canal 或 Debezium 同步:

  1. 启用 MySQL Binlog

    -- MySQL配置
    [mysqld]
    log-bin=mysql-bin
    server-id=1
    binlog_format=ROW
  2. 通过 Canal 同步到 Redis

    • 部署 Canal Server,解析 Binlog
    • 编写 Canal Client 将变更写入 Redis(可参考官方 Java 客户端示例)

3. 会话存储(Session Store)

将会话数据从 MySQL 迁移到 Redis。

示例(PHP + Redis 会话):

// php.ini 配置
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=密码"

二、服务化集成(微服务场景)

1. Sidecar 模式

每个服务实例搭配一个 Redis Sidecar(容器化场景常用)。

Docker Compose 示例:

version: '3'
services:
  app:
    image: myapp:latest
    depends_on:
      - redis-sidecar
  redis-sidecar:
    image: redis:alpine
    command: redis-server --appendonly yes
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_password

2. 消息队列集成

使用 Redis Streams 作为 MySQL 操作的缓冲队列。

# 生产者:写入操作到 Redis Stream
import redis
r = redis.Redis()
r.xadd('mysql:operations', {'action': 'update', 'table': 'users', 'data': '...'})

# 消费者:从 Stream 读取并写入 MySQL
while True:
    messages = r.xreadgroup('group1', 'consumer1', {'mysql:operations': '>'}, count=1)
    for msg in messages:
        # 解析并执行 MySQL 操作
        execute_mysql_operation(msg)

三、运维与监控

1. 健康检查脚本

#!/bin/bash
# 检查 Redis 和 MySQL 是否同时健康
redis_ok=$(redis-cli ping 2>/dev/null | grep -c PONG)
mysql_ok=$(mysqladmin ping 2>/dev/null | grep -c alive)

if [ $redis_ok -eq 1 ] && [ $mysql_ok -eq 1 ]; then
    echo "OK"
    exit 0
else
    echo "CRITICAL"
    exit 1
fi

2. 使用 Prometheus 监控

  • 通过 redis_exportermysqld_exporter 收集指标
  • 在 Grafana 中关联两者监控视图

四、安全建议

  1. 网络隔离:将 Redis 和 MySQL 放在内网,禁止公网访问。
  2. 认证配置
    -- MySQL 创建专用用户
    CREATE USER 'sync_user'@'%' IDENTIFIED BY 'strong_password';
    GRANT SELECT, REPLICATION SLAVE ON *.* TO 'sync_user'@'%';
    # Redis 启用密码
    redis-cli CONFIG SET requirepass "your_strong_password"
  3. 加密传输:考虑使用 TLS 或 SSH 隧道传输敏感数据。

五、故障处理

  • 缓存雪崩:为 Redis 键设置随机过期时间。
  • 缓存穿透:使用布隆过滤器或缓存空值。
  • 数据不一致:设置合理的缓存过期时间,或采用双删策略。

选择建议

  • 简单缓存:直接使用 Cache-Aside 模式。
  • 实时同步:考虑 Binlog 解析工具(Canal/Maxwell)。
  • 高并发场景:结合 Redis 持久化与 MySQL 异步写入。

根据具体业务场景(读多写少、数据一致性要求、并发量等)选择合适的集成策略。

云服务器