在 CentOS 或 Ubuntu 系统中实现 Redis 与 MySQL 的服务级集成,通常涉及缓存、数据同步或解耦架构。以下是几种常见方案及具体实现步骤:
一、常见集成模式
1. 缓存模式(Cache-Aside)
Redis 作为 MySQL 的热数据缓存,降低数据库压力。
实现步骤:
-
安装服务
# 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 -
配置 Redis 持久化(可选)
sudo vim /etc/redis/redis.conf # 启用 RDB 或 AOF save 900 1 # 15分钟至少1个key变化则保存 appendonly yes # 启用AOF -
应用层代码示例(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 同步:
-
启用 MySQL Binlog
-- MySQL配置 [mysqld] log-bin=mysql-bin server-id=1 binlog_format=ROW -
通过 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_exporter和mysqld_exporter收集指标 - 在 Grafana 中关联两者监控视图
四、安全建议
- 网络隔离:将 Redis 和 MySQL 放在内网,禁止公网访问。
- 认证配置:
-- 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" - 加密传输:考虑使用 TLS 或 SSH 隧道传输敏感数据。
五、故障处理
- 缓存雪崩:为 Redis 键设置随机过期时间。
- 缓存穿透:使用布隆过滤器或缓存空值。
- 数据不一致:设置合理的缓存过期时间,或采用双删策略。
选择建议
- 简单缓存:直接使用 Cache-Aside 模式。
- 实时同步:考虑 Binlog 解析工具(Canal/Maxwell)。
- 高并发场景:结合 Redis 持久化与 MySQL 异步写入。
根据具体业务场景(读多写少、数据一致性要求、并发量等)选择合适的集成策略。
CLOUD技术笔记