1. 项目概述
Redis作为当下最流行的内存数据库之一,在高并发场景中扮演着关键角色。今天要分享的是在香港地区的Ubuntu 22.04服务器上构建生产级Redis集群的完整方案,这个架构特别适合需要低延迟访问的亚太区业务场景。
不同于单机部署,我们将实现:
- 真正的分布式Redis Cluster(非主从复制)
- 双重持久化保障(AOF+RDB)
- Sentinel自动故障转移
- 跨节点数据分片
- 集群模式下的客户端连接方案
这个方案已经在我们多个线上项目中稳定运行超过一年,处理着峰值10万+ QPS的请求量。下面就从网络拓扑设计开始,逐步拆解每个关键环节的实现细节。
2. 环境准备与拓扑设计
2.1 服务器资源配置建议
对于生产环境,建议至少6台服务器(3主3从),每台配置:
- CPU: 4核以上(Redis是单线程模型,但后台持久化、同步等操作会占用额外CPU)
- 内存: 8GB起步(实际可用内存 = 总内存 - 系统预留 - 其他服务占用)
- 磁盘: SSD必备,建议100GB以上(持久化文件+AOF日志可能占用大量空间)
- 网络: 内网带宽≥1Gbps(集群节点间同步对带宽敏感)
重要提示:香港服务器选择时务必确认网络延迟,实测某些机房到内地延迟可相差3-5倍。建议用
ping和traceroute测试骨干网络质量。
2.2 网络拓扑示例
这是我们实际使用的拓扑结构:
+---------------------+ | HAProxy/NGINX | | (负载均衡层) | +----------+----------+ | +-----------------+------------------+ | | | +--------+-------+ +-------+--------+ +-------+--------+ | Redis Master1 | | Redis Master2 | | Redis Master3 | | (端口6379) | | (端口6379) | | (端口6379) | | Slot 0-5460 | | Slot 5461-10922| | Slot 10923-16383| +--------+-------+ +-------+--------+ +-------+--------+ | | | +--------+-------+ +-------+--------+ +-------+--------+ | Redis Slave1 | | Redis Slave2 | | Redis Slave3 | | (端口6380) | | (端口6380) | | (端口6380) | +----------------+ +----------------+ +----------------+2.3 系统基础配置
在所有节点执行:
# 关闭SWAP(防止内存交换影响性能) sudo swapoff -a sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab # 调整内核参数 echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf echo "net.core.somaxconn = 1024" | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 修改文件描述符限制 echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf3. Redis集群部署实战
3.1 编译安装Redis 7.0
建议从源码编译以获得最佳性能:
# 安装依赖 sudo apt update sudo apt install -y build-essential tcl libssl-dev # 下载源码(使用国内镜像加速) wget https://mirrors.aliyun.com/redis/redis-7.0.0.tar.gz tar xzf redis-7.0.0.tar.gz cd redis-7.0.0 # 编译安装(启用TLS支持) make BUILD_TLS=yes USE_SYSTEMD=yes sudo make install3.2 集群节点配置
每个节点需要独立的配置文件,以Master1节点为例(/etc/redis/redis-master1.conf):
port 6379 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 appendonly yes appendfsync everysec save 900 1 save 300 10 save 60 10000 dir /var/lib/redis/6379 tls-cluster yes tls-cert-file /etc/redis/certs/redis.crt tls-key-file /etc/redis/certs/redis.key tls-ca-cert-file /etc/redis/certs/ca.crt创建数据目录并设置权限:
sudo mkdir -p /var/lib/redis/6379 sudo chown -R redis:redis /var/lib/redis3.3 集群初始化
先在所有节点启动Redis服务:
sudo systemctl enable redis-server@master1 sudo systemctl start redis-server@master1然后任意节点执行集群创建命令:
redis-cli --cluster create \ 192.168.1.101:6379 \ 192.168.1.102:6379 \ 192.168.1.103:6379 \ 192.168.1.104:6379 \ 192.168.1.105:6379 \ 192.168.1.106:6379 \ --cluster-replicas 1 \ --tls \ --cacert /etc/redis/certs/ca.crt关键参数说明:
--cluster-replicas 1:每个主节点配1个从节点--tls:启用加密通信- 系统会提示确认槽位分配方案,输入
yes继续
3.4 集群验证
检查集群状态:
redis-cli --tls --cacert /etc/redis/certs/ca.crt -h 192.168.1.101 -p 6379 cluster nodes预期输出应包含6个节点,其中3个为master,3个为slave,所有槽位(slots)应被完全覆盖。
4. Sentinel高可用配置
4.1 Sentinel部署方案
建议在3台独立服务器上部署Sentinel(可与Redis节点共用服务器),配置示例(/etc/redis/sentinel1.conf):
port 26379 sentinel monitor mycluster 192.168.1.101 6379 2 sentinel down-after-milliseconds mycluster 5000 sentinel failover-timeout mycluster 60000 sentinel parallel-syncs mycluster 1 sentinel auth-pass mycluster your_strong_password sentinel tls-port 26379 sentinel tls-cert-file /etc/redis/certs/redis.crt sentinel tls-key-file /etc/redis/certs/redis.key sentinel tls-ca-cert-file /etc/redis/certs/ca.crt4.2 Sentinel启动与管理
sudo systemctl enable redis-sentinel@sentinel1 sudo systemctl start redis-sentinel@sentinel1查看Sentinel监控状态:
redis-cli -p 26379 sentinel master mycluster5. 客户端连接方案
5.1 主流语言连接示例
Java (Jedis)
Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("192.168.1.101", 6379)); // 添加所有节点... JedisCluster cluster = new JedisCluster(nodes, DefaultJedisClientConfig.builder() .password("your_strong_password") .ssl(true) .build());Python (redis-py)
from redis.cluster import RedisCluster rc = RedisCluster( startup_nodes=[ {"host": "192.168.1.101", "port": 6379}, # 其他节点... ], password="your_strong_password", ssl=True, ssl_ca_certs="/path/to/ca.crt" )5.2 连接池优化建议
- 最大连接数:建议设置为
(最大并发请求数/每个请求平均耗时) * 1.2 - 空闲连接超时:5-10分钟(避免频繁重建连接)
- 连接健康检查:启用定期PING检测
6. 运维监控与调优
6.1 关键指标监控
- 内存使用:
used_memory、used_memory_rss - 持久化状态:
aof_last_bgrewrite_status、rdb_last_bgsave_status - 集群健康:
cluster_state、cluster_slots_assigned - 性能指标:
instantaneous_ops_per_sec、latency_percentiles_usec
推荐使用Prometheus + Grafana监控方案,配置示例:
- job_name: 'redis_exporter' static_configs: - targets: ['192.168.1.101:9121'] metrics_path: '/scrape' params: target: ['redis://192.168.1.101:6379']6.2 性能调优参数
# 网络缓冲区 tcp-backlog 511 # 内存管理 maxmemory 6gb maxmemory-policy volatile-lru # 持久化优化 aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes # 集群参数 cluster-require-full-coverage no7. 故障处理实录
7.1 常见问题排查
节点无法加入集群
- 检查防火墙规则:
sudo ufw status - 验证节点间网络连通性:
telnet 192.168.1.102 6379 - 检查TLS证书有效期:
openssl x509 -in /etc/redis/certs/redis.crt -noout -dates
槽位分配不均
# 重新平衡槽位 redis-cli --cluster rebalance 192.168.1.101:6379 \ --cluster-weight node1=1 node2=1 node3=1.57.2 备份恢复方案
全量备份
# 在从节点执行 redis-cli --tls --cacert /etc/redis/certs/ca.crt \ -h 192.168.1.104 -p 6379 save tar czvf /backup/redis-$(date +%F).tar.gz /var/lib/redis/6379/*灾难恢复
- 停止所有Redis服务
- 清空数据目录
- 恢复备份文件
- 重启服务
- 执行
redis-cli --cluster fix修复集群状态
8. 安全加固措施
8.1 网络层防护
# 只允许集群节点和运维IP访问 sudo ufw allow from 192.168.1.0/24 to any port 6379 sudo ufw allow from 10.0.0.100 to any port 63798.2 认证与加密
# redis.conf requirepass your_strong_password masterauth your_strong_password8.3 证书管理
使用OpenSSL生成有效期1年的证书:
openssl req -x509 -newkey rsa:4096 -nodes \ -keyout redis.key -out redis.crt \ -days 365 -subj "/CN=redis-cluster"在香港部署Redis集群时,我们遇到的最大挑战是网络抖动导致的集群脑裂问题。后来通过调整cluster-node-timeout参数(从默认15秒增加到30秒)显著改善了稳定性。另外建议在客户端实现重试逻辑,应对短暂的网络中断。