Redis 压测及优化方案
目录
1. 项目背景
1.1 部署架构现状
- 当前架构:私有化项目采用标准版部署
- Redis模式:主从/哨兵模式
- 性能限制:标准版性能限制在 10万QPS
- 瓶颈分析:Redis 单线程程序,仅占用服务器单CPU资源
1.2 优化目标
- 性能提升:突破10万QPS限制
- 架构升级:从主从模式升级到集群模式
- 资源利用:提高多核CPU资源利用率
2. 现状分析
2.1 技术限制
- Redis 采用单线程架构,无法充分利用多核CPU
- 主从模式下,写操作只能在主节点执行
- 单节点内存和网络IO存在瓶颈
2.2 性能基准
通过实测,当前主从架构与单节点性能差异小于10%,忽略主从原因导致性能压缩:
- 单节点性能:109,814 Ops/sec
- 主从模式性能:约99,000 Ops/sec
3. 调优结论
3.1 必改项 ⭐⭐⭐
Redis 集群模式升级
- 方案:将部署方案改为 Cluster 模式
- 效果:显著提高处理效率和吞吐量
- 必要性:突破单节点性能瓶颈的根本解决方案
3.2 推荐方案 ⭐⭐⭐
客户端集群连接模式
- 改造内容:客户端连接方式改为集群方式
- 性能提升:Redis 可提效 100%,从10万提升至20万QPS
- 开发工作量:需要研发改造架构,修改Redis连接模式为cluster模式
3.3 备选方案 ⭐⭐
Redis-Proxy 代理方案
- 方案:使用 redis-proxy 代理 redis-cluster
- 性能提升:可提效 50%
- 资源需求:需要更多主机资源
- 风险点:需关注 redis-proxy 节点稳定性和瓶颈问题
4. 压测结果分析
4.1 详细压测数据
| Redis集群类型 | 节点配置 | 客户端连接模式 | 代理结构 | 最高Ops/sec | 性能提升 | 备注 |
|---|---|---|---|---|---|---|
| 单节点 | 1master | 默认模式 | 直连 | 109,814 | 基准值 | 现有结构基准 |
| 集群 | 3master | 默认模式 | redis-proxy代理3master | 141,284 | +28.7% | 代理集群方式 |
| 集群 | 3master3slave | 默认模式 | redis-proxy代理3master | 152,318 | +38.8% | 推荐生产配置 |
| 集群 | 3master3slave | 默认模式 | redis-proxy代理全部节点 | 143,645 | +30.8% | 生产标准配置 |
| 集群 | 9master | 默认模式 | redis-proxy代理9master | 153,919 | +40.2% | 节点增加收益递减 |
| 集群 | 9master | 默认模式 | nginx+redis-proxy | 109,543 | -0.2% | 多层代理性能下降 |
| 集群 | 3master | 集群模式 | 无代理直连 | 205,848 | +87.5% | 最优性能方案 |
| 集群 | 3master3slave | 集群模式 | 无代理直连 | 183,317 | +67.0% | 生产推荐方案 |
| 集群 | 9master | 集群模式 | nginx代理 | 180,336 | +64.3% | 负载均衡方案 |
4.2 详细压测记录
单例redis压测
redis-proxy-->3master(3master集群)
redis_proxy-->3master(3master3slave集群)
redis_proxy-->3master+3slave(3master3slave集群)
redis_proxy-->9master(9master集群)
nginx-->2redis_proxy-->9master(9master集群)
vip-->3master(3master集群)
vip-->3master+3slave(3master3slave集群)
nginx-->9master(9master集群)
4.3 关键发现
🏆 性能最优方案
- 配置:3master 集群模式 + 客户端直连
- 性能:205,848 Ops/sec
- 提升:相比单节点提升 87.5%
🎯 生产推荐方案
- 配置:3master3slave 集群模式 + 客户端直连
- 性能:183,317 Ops/sec
- 提升:相比单节点提升 67.0%
- 优势:兼顾性能与高可用性
📊 性能分析结论
- 集群模式直连 > 代理模式 > 单节点模式
- 节点数量增加收益递减(9master vs 3master 提升有限)
- 多层代理会成为性能瓶颈
- 客户端改造是获得最大性能提升的关键
5. 环境搭建
5.1 Redis 集群搭建
版本要求
- 推荐版本:Redis 5.0.5 及以上
- Docker镜像:
shuogesha/redis5.0.5:latest - 源码地址:download.redis.io/releases/re…
核心配置参数
# 基础网络配置
bind 0.0.0.0
port 6379
protected-mode no
tcp-backlog 511
timeout 0
tcp-keepalive 0
# 运行模式配置
daemonize yes # Docker部署时设为no
supervised no
loglevel notice
databases 16
# 持久化配置
appendonly yes # 集群模式必须打开
appendfilename "appendonly.aof"
appendfsync everysec
rdbcompression yes
rdbchecksum yes
# 内存和连接配置
maxmemory 4gb
maxclients 10000
# 安全配置
masterauth "password"
requirepass "password"
# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.1.1 # 修改为本机IP
cluster-announce-port 6379
cluster-announce-bus-port 16379
# 文件路径配置
pidfile "/var/run/redis-6379.pid"
logfile "/home/redis/log/redis-6379.log"
dir "/home/redis/dump/6379/"
dbfilename "dump-6379.rdb"
安装部署步骤
1. 源码编译安装
# 下载和编译
wget http://download.redis.io/releases/redis-5.0.9.tar.gz
tar -zxvf redis-5.0.9.tar.gz
cd redis-5.0.9
make
# 安装二进制文件
yes|cp src/redis-benchmark /usr/local/bin/
yes|cp src/redis-check-aof /usr/local/bin/
yes|cp src/redis-check-rdb /usr/local/bin/
yes|cp src/redis-cli /usr/local/bin/
yes|cp src/redis-sentinel /usr/local/bin/
yes|cp src/redis-server /usr/local/bin/
yes|cp src/redis-trib.rb /usr/local/bin/
# 验证安装
redis-server --version
2. 创建目录结构
mkdir -p /home/redis/log/
mkdir -p /home/redis/dump/6379/
mkdir -p /home/redis/dump/6380/
mkdir -p /usr/local/redisConfig/
3. 启动Redis实例
# CPU绑定启动(推荐)
taskset -c 0 redis-server /usr/local/redisConfig/redis-6379.conf
taskset -c 1 redis-server /usr/local/redisConfig/redis-6380.conf
# Docker部署方式
docker run -d --cpuset-cpus 1 --name redis-6379 --net host --privileged=true \
-v /usr/local/redisConfig/redis-6379.conf:/etc/redis/redis.conf \
shuogesha/redis5.0.5:latest redis-server /etc/redis/redis.conf
4. 创建Redis集群
# 创建3主3从集群
redis-cli -a password -p 6379 --cluster create \
192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 \
192.168.1.4:6379 192.168.1.5:6379 192.168.1.6:6379 \
--cluster-replicas 1
# 验证集群状态
redis-cli -a password -p 6379 cluster info
redis-cli -a password -p 6379 cluster nodes
5.2 Redis-Proxy 搭建
配置文件(application.yml)
server:
port: 6380
spring:
application:
name: camellia-redis-proxy-server
camellia-redis-proxy:
console-port: 16380 # 管理控制台端口
password: password # 代理访问密码
monitor-enable: true # 启用监控
monitor-interval-seconds: 60 # 监控数据刷新间隔
monitor-callback-class-name: com.netease.nim.camellia.redis.proxy.monitor.LoggingMonitorCallback
plugins: # 插件配置
- monitorPlugin
- bigKeyPlugin
- hotKeyPlugin
transpond:
type: local
local:
type: simple
# 集群连接字符串
resource: redis-cluster://password@10.150.32.6:6379,10.150.32.7:6379,10.150.32.8:6379,10.150.32.9:6379,10.150.32.10:6379,10.150.32.11:6379
redis-conf:
jedis:
max-idle: 8
min-idle: 0
max-active: 8
max-wait-millis: 2000
timeout: 2000
启动命令
# JVM调优参数
java -cp /usr/local/camellia-redis-proxy-1.2.21/ \
-XX:+UseG1GC -XX:+UseContainerSupport \
-Xms512m -Xmx512m -server \
org.springframework.boot.loader.JarLauncher
Docker部署
docker run -d --network host --name redis_proxy \
-v /home/redis_proxy/start_in_docker.sh:/usr/local/camellia-redis-proxy-1.2.21/start_in_docker.sh \
-v /home/redis_proxy/application.yml:/usr/local/camellia-redis-proxy-1.2.21/BOOT-INF/classes/application.yml \
-v /home/redis_proxy/camellia-redis-proxy.properties:/usr/local/camellia-redis-proxy-1.2.21/BOOT-INF/classes/camellia-redis-proxy.properties \
registry.cn-beijing.aliyuncs.com/tinet-hub/redis_proxy:20231224
6. 压测工具使用
6.1 Redis-Benchmark
基础压测命令
# LPUSH操作压测
redis-benchmark -p 6379 -a password -t lpush -d 50 -c 1000 -n 400000
# 参数说明
# -p: Redis端口
# -a: 认证密码
# -t: 测试类型(set, get, lpush, lpop等)
# -d: 数据大小(字节)
# -c: 并发连接数
# -n: 请求总数
集群模式压测
# 集群模式需要添加 --cluster 参数
redis-benchmark -p 6379 -a password -t set -d 50 -c 1000 -n 400000 --cluster
6.2 Memtier-Benchmark
Docker运行方式
# 基础运行命令
docker run --rm redislabs/memtier_benchmark:latest \
--server=redis-server-ip --port=6379 \
--authenticate=password \
--protocol=redis --clients=50 --threads=4 \
--ratio=1:1 --data-size=50 --key-pattern=R:R \
--requests=10000 --run-count=1
集群模式压测
# 集群模式压测
docker run --rm redislabs/memtier_benchmark:latest \
--cluster-mode \
--server=redis-cluster-ip --port=6379 \
--authenticate=password \
--protocol=redis --clients=50 --threads=4 \
--ratio=1:1 --data-size=50 \
--requests=10000 --run-count=1
6.3 压测参数调优建议
| 参数类型 | 推荐值 | 说明 |
|---|---|---|
| 并发连接数 | 100-1000 | 根据服务器性能调整 |
| 数据大小 | 50-100字节 | 模拟实际业务数据 |
| 操作比例 | 读写1:1或3:1 | 根据业务特点设置 |
| 测试时长 | 5-10分钟 | 确保结果稳定性 |
7. 最佳实践建议
7.1 架构选择策略
🥇 首选方案:集群模式直连
适用场景:
- 新项目或可以进行客户端改造的项目
- 对性能要求极高的场景
- 技术团队具备集群模式开发经验
优势:
- 性能最佳(180,000+ Ops/sec)
- 架构简单,减少故障点
- 资源利用率最高
实施要求:
- 客户端代码改造(支持集群模式)
- 开发团队学习成本
🥈 次选方案:Redis-Proxy代理
适用场景:
- 客户端改造成本高的老项目
- 需要快速提升性能的场景
- 过渡期解决方案
优势:
- 客户端无需改造
- 性能提升明显(150,000+ Ops/sec)
- 部署相对简单
注意事项:
- 需要额外的proxy服务器资源
- proxy成为单点,需要高可用部署
- 增加了架构复杂度
7.2 部署配置建议
CPU资源优化
# 绑定Redis进程到指定CPU核心
taskset -c 0,1,2 redis-server /path/to/redis.conf
# 设置CPU亲和性,避免进程在核心间跳转
echo 2 > /proc/irq/24/smp_affinity # 网卡中断绑定
内存配置优化
# Redis配置优化
maxmemory 4gb # 设置最大内存
maxmemory-policy allkeys-lru # 内存淘汰策略
hash-max-ziplist-entries 512 # 优化小对象存储
hash-max-ziplist-value 64 # 优化小对象存储
网络配置优化
# 网络优化配置
tcp-backlog 511 # TCP监听队列长度
tcp-keepalive 60 # TCP保活时间
timeout 300 # 客户端超时时间
7.3 监控和运维建议
关键监控指标
- QPS指标:instantaneous_ops_per_sec
- 内存使用:used_memory_rss / maxmemory
- 网络流量:total_net_input_bytes / total_net_output_bytes
- 慢查询:slowlog-log-slower-than 10000
- 连接数:connected_clients / maxclients
性能基准测试
# 定期性能基准测试脚本
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/redis_benchmark_${DATE}.log"
echo "开始Redis性能基准测试 - $DATE" > $LOG_FILE
# SET操作测试
redis-benchmark -p 6379 -a password -t set -d 50 -c 1000 -n 100000 >> $LOG_FILE
# GET操作测试
redis-benchmark -p 6379 -a password -t get -d 50 -c 1000 -n 100000 >> $LOG_FILE
# 混合操作测试
redis-benchmark -p 6379 -a password -d 50 -c 1000 -n 100000 >> $LOG_FILE
echo "性能测试完成,结果保存至: $LOG_FILE"
7.4 故障排查指南
性能下降排查
- 检查慢查询日志
redis-cli -a password slowlog get 10
- 检查内存使用情况
redis-cli -a password info memory
- 检查网络连接状态
redis-cli -a password info clients
- 检查集群状态
redis-cli -a password cluster info
redis-cli -a password cluster nodes
常见问题解决
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| QPS突然下降 | 内存不足、慢查询 | 检查内存使用和slowlog |
| 连接超时 | 网络问题、连接数超限 | 检查网络和maxclients配置 |
| 数据丢失 | 持久化配置问题 | 检查AOF/RDB配置 |
| 集群节点下线 | 网络分区、节点故障 | 检查网络和节点状态 |
8. 总结
8.1 性能提升总结
通过本次优化改造,Redis性能可以获得以下提升:
| 方案 | 性能提升 | 实施难度 | 推荐指数 |
|---|---|---|---|
| 集群模式直连 | 67-87% | 中等 | ⭐⭐⭐⭐⭐ |
| Redis-Proxy代理 | 40-50% | 较低 | ⭐⭐⭐⭐ |
| 仅升级硬件 | 10-20% | 低 | ⭐⭐ |
8.2 实施路线图
- 第一阶段:搭建测试环境,验证集群模式
- 第二阶段:客户端代码改造和测试
- 第三阶段:生产环境灰度上线
- 第四阶段:全量切换和性能优化
8.3 关键成功因素
- ✅ 充分的压测验证
- ✅ 完善的监控体系
- ✅ 详细的回滚方案
- ✅ 团队技能培训
文档版本:v1.0
编写日期:2025年1月27日
适用版本:Redis 5.0.5+
下次更新:性能调优后的实际效果验证
📝 备注:本文档基于实际压测数据编写,建议在生产环境实施前,先在测试环境充分验证所有配置和改造内容。