【调优】Redis压测、Redis-proxy代理Redis能力压测

22 阅读10分钟

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代理3master141,284+28.7%代理集群方式
集群3master3slave默认模式redis-proxy代理3master152,318+38.8%推荐生产配置
集群3master3slave默认模式redis-proxy代理全部节点143,645+30.8%生产标准配置
集群9master默认模式redis-proxy代理9master153,919+40.2%节点增加收益递减
集群9master默认模式nginx+redis-proxy109,543-0.2%多层代理性能下降
集群3master集群模式无代理直连205,848+87.5%最优性能方案
集群3master3slave集群模式无代理直连183,317+67.0%生产推荐方案
集群9master集群模式nginx代理180,336+64.3%负载均衡方案

4.2 详细压测记录

单例redis压测

image.png

redis-proxy-->3master(3master集群)

image.png

redis_proxy-->3master(3master3slave集群)

image.png

redis_proxy-->3master+3slave(3master3slave集群)

image.png

redis_proxy-->9master(9master集群)

image.png

nginx-->2redis_proxy-->9master(9master集群)

image.png

vip-->3master(3master集群)

image.png

vip-->3master+3slave(3master3slave集群)

image.png

nginx-->9master(9master集群)

image.png

4.3 关键发现

🏆 性能最优方案
  • 配置:3master 集群模式 + 客户端直连
  • 性能:205,848 Ops/sec
  • 提升:相比单节点提升 87.5%
🎯 生产推荐方案
  • 配置:3master3slave 集群模式 + 客户端直连
  • 性能:183,317 Ops/sec
  • 提升:相比单节点提升 67.0%
  • 优势:兼顾性能与高可用性
📊 性能分析结论
  1. 集群模式直连 > 代理模式 > 单节点模式
  2. 节点数量增加收益递减(9master vs 3master 提升有限)
  3. 多层代理会成为性能瓶颈
  4. 客户端改造是获得最大性能提升的关键

5. 环境搭建

5.1 Redis 集群搭建

版本要求
核心配置参数
# 基础网络配置
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 故障排查指南

性能下降排查
  1. 检查慢查询日志
redis-cli -a password slowlog get 10
  1. 检查内存使用情况
redis-cli -a password info memory
  1. 检查网络连接状态
redis-cli -a password info clients
  1. 检查集群状态
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 实施路线图

  1. 第一阶段:搭建测试环境,验证集群模式
  2. 第二阶段:客户端代码改造和测试
  3. 第三阶段:生产环境灰度上线
  4. 第四阶段:全量切换和性能优化

8.3 关键成功因素

  • 充分的压测验证
  • 完善的监控体系
  • 详细的回滚方案
  • 团队技能培训

文档版本:v1.0
编写日期:2025年1月27日
适用版本:Redis 5.0.5+
下次更新:性能调优后的实际效果验证

📝 备注:本文档基于实际压测数据编写,建议在生产环境实施前,先在测试环境充分验证所有配置和改造内容。