ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

香港Ubuntu服务器部署Redis集群实战指南

香港Ubuntu服务器部署Redis集群实战指南

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.conf

3. 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 install

3.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/redis

3.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.crt

4.2 Sentinel启动与管理

sudo systemctl enable redis-sentinel@sentinel1 sudo systemctl start redis-sentinel@sentinel1

查看Sentinel监控状态:

redis-cli -p 26379 sentinel master mycluster

5. 客户端连接方案

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 no

7. 故障处理实录

7.1 常见问题排查

节点无法加入集群

  1. 检查防火墙规则:sudo ufw status
  2. 验证节点间网络连通性:telnet 192.168.1.102 6379
  3. 检查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.5

7.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/*

灾难恢复

  1. 停止所有Redis服务
  2. 清空数据目录
  3. 恢复备份文件
  4. 重启服务
  5. 执行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 6379

8.2 认证与加密

# redis.conf requirepass your_strong_password masterauth your_strong_password

8.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秒)显著改善了稳定性。另外建议在客户端实现重试逻辑,应对短暂的网络中断。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进