Twemproxy Redis 代理配置教程
Twemproxy(又名 nutcracker)是 Twitter 开源的轻量级 Redis/Memcached 代理,支持自动分片、连接池复用和故障节点摘除。它能够将多个 Redis 实例组织成一个集群,让应用程序无需关心数据分片的细节。本文将在搬瓦工 VPS 上从零部署 Twemproxy 并配置 Redis 代理方案。
一、安装 Twemproxy
1.1 从源码编译
# 安装依赖
apt update
apt install build-essential autoconf automake libtool git -y
# 克隆源码
git clone https://github.com/twitter/twemproxy.git
cd twemproxy
# 编译安装
autoreconf -fvi
./configure --prefix=/usr/local/twemproxy
make -j$(nproc)
make install
# 验证安装
/usr/local/twemproxy/sbin/nutcracker --version
1.2 准备 Redis 后端
# 安装 Redis
apt install redis-server -y
# 启动多个 Redis 实例(模拟分片)
# 实例 1:端口 6380
cat > /etc/redis/redis-6380.conf <<'EOF'
port 6380
daemonize yes
pidfile /var/run/redis-6380.pid
logfile /var/log/redis/redis-6380.log
dbfilename dump-6380.rdb
dir /var/lib/redis
EOF
# 实例 2:端口 6381
cat > /etc/redis/redis-6381.conf <<'EOF'
port 6381
daemonize yes
pidfile /var/run/redis-6381.pid
logfile /var/log/redis/redis-6381.log
dbfilename dump-6381.rdb
dir /var/lib/redis
EOF
# 实例 3:端口 6382
cat > /etc/redis/redis-6382.conf <<'EOF'
port 6382
daemonize yes
pidfile /var/run/redis-6382.pid
logfile /var/log/redis/redis-6382.log
dbfilename dump-6382.rdb
dir /var/lib/redis
EOF
# 启动所有实例
redis-server /etc/redis/redis-6380.conf
redis-server /etc/redis/redis-6381.conf
redis-server /etc/redis/redis-6382.conf
二、配置 Twemproxy
mkdir -p /etc/twemproxy
cat > /etc/twemproxy/nutcracker.yml <<'EOF'
redis_pool:
listen: 127.0.0.1:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 3
timeout: 400
preconnect: true
server_connections: 1
servers:
- 127.0.0.1:6380:1 redis-1
- 127.0.0.1:6381:1 redis-2
- 127.0.0.1:6382:1 redis-3
EOF
配置参数说明:
- listen:Twemproxy 监听地址和端口。
- hash:哈希算法,fnv1a_64 分布最均匀。
- distribution:分片策略,ketama 是一致性哈希。
- auto_eject_hosts:自动摘除故障节点。
- server_retry_timeout:故障节点重试间隔(毫秒)。
- server_failure_limit:连续失败次数后摘除节点。
- preconnect:启动时预建连接。
三、启动 Twemproxy
# 验证配置文件
/usr/local/twemproxy/sbin/nutcracker -t -c /etc/twemproxy/nutcracker.yml
# 前台运行(调试用)
/usr/local/twemproxy/sbin/nutcracker -c /etc/twemproxy/nutcracker.yml -v 11
# 后台运行
/usr/local/twemproxy/sbin/nutcracker -d -c /etc/twemproxy/nutcracker.yml
# 创建 systemd 服务
cat > /etc/systemd/system/twemproxy.service <<'EOF'
[Unit]
Description=Twemproxy Redis Proxy
After=network.target redis.service
[Service]
Type=simple
ExecStart=/usr/local/twemproxy/sbin/nutcracker -c /etc/twemproxy/nutcracker.yml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable twemproxy --now
四、验证与测试
# 通过 Twemproxy 连接 Redis
redis-cli -p 22121
# 写入测试数据
redis-cli -p 22121 set test1 "hello"
redis-cli -p 22121 set test2 "world"
redis-cli -p 22121 set test3 "twemproxy"
# 查看数据分布在哪个后端
redis-cli -p 6380 keys '*'
redis-cli -p 6381 keys '*'
redis-cli -p 6382 keys '*'
# 性能测试
redis-benchmark -p 22121 -c 50 -n 100000 -q
五、监控状态
# 启用统计端口
# 在 nutcracker.yml 中添加
# stats_listen: 127.0.0.1:22222
# stats_interval: 30000
# 查看统计信息
curl http://127.0.0.1:22222 | python3 -m json.tool
六、分片策略选择
- ketama(推荐):一致性哈希,添加或移除节点时数据迁移量最小。
- modula:取模分片,分布均匀但节点变化时数据全量迁移。
- random:随机分配,仅适合只写不读的场景。
七、注意事项
- Twemproxy 不支持多键操作(如 MGET 跨分片的键)和事务命令。
- 不支持 Redis Pub/Sub、Lua 脚本等高级功能。
- auto_eject_hosts 启用后,节点摘除会导致部分数据不可访问直到节点恢复。
- 对于需要完整 Redis 功能的场景,建议使用 Redis Cluster 原生集群方案。
总结
Twemproxy 是一个成熟稳定的 Redis 代理方案,特别适合需要简单分片和连接池管理的场景。对于数据库代理需求,还可以参考 Pgpool-II PostgreSQL 代理 和 ProxySQL MySQL 代理。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。