Redis集群
Redis集群
Redis 集群(Redis Cluster)是 Redis 官方提供的分布式高可用方案,用于解决单节点 Redis 的容量上限与读写性能瓶颈问题,同时内置主从复制与故障自动转移能力,无需依赖哨兵。
故障检测与自动恢复机制:
集群节点之间通过 Gossip 协议交换状态信息,每秒互相发送 PING/PONG 消息进行心跳检测。若某个节点超过 node-timeout(默认 15 秒)未正常响应,其他节点会将其标记为疑似下线(PFAIL);当超过半数主节点都判定该节点为疑似下线时,节点会被标记为确认下线(FAIL)。主节点被标记为确认下线后,其对应的从节点会发起选举,获得半数以上主节点投票的从节点将升级为新主节点,并接管原主节点负责的所有哈希槽,集群随后更新路由信息并继续对外提供服务。
Redis集群部署与配置
下面演示基于 Redis 5 搭建 Redis Cluster 集群,需要注意的是 Redis 5.0 及以上版本正式弃用了基于 Ruby 实现的 redis-trib.rb 工具,将集群管理功能原生集成到 redis-cli 中,通过 redis-cli --cluster 命令完成集群的所有操作,无需再安装 Ruby 环境和相关依赖,降低了集群部署门槛。
在 /usr/local/src/redis 下创建集群目录和各个节点的日志与数据目录
bash
mkdir -p ./redis-cluster/700{1..6}/{logs,data}
赋予权限,避免 Redis 启动时权限不足
bash
chmod 777 -R ./redis-cluster
Redis Cluster 节点的核心配置是 cluster-enabled yes(开启集群模式),
下面用脚本批量生成 7001~7006 集群节点的配置文件,可一次性复制到命令行中运行,也可以编写到 redis.conf 中:
bash
# 定义基础目录
BASE_DIR="/usr/local/src/redis/redis-cluster"
mkdir -p ${BASE_DIR}/700{1..6}/{logs,data}
# IP获取:只取第一个非127.0.0.1的IPv4地址
IP=`ip a|grep 'inet' |grep -v '127.0.0.1'|grep -v 'inet6'|awk '{print $2}'|awk -F'/' '{print $1}'|head -n1`
for i in {1..6}
do
cat > ${BASE_DIR}/700${i}/redis.conf <<EOF
daemonize yes
port 700${i}
cluster-enabled yes
cluster-config-file cluster-nodes-700${i}.conf
cluster-node-timeout 15000
appendonly yes
bind ${IP}
protected-mode no
dbfilename dump-700${i}.rdb
logfile ${BASE_DIR}/700${i}/logs/redis.log
pidfile ${BASE_DIR}/700${i}/data/redis.pid
dir ${BASE_DIR}/700${i}/data
appendfilename "appendonly-700${i}.aof"
EOF
done
进入 /usr/local/src/redis/redis-cluster 目录下启动所有节点
bash
for i in {1..6}; do
/usr/local/src/redis/redis-5.0.4/src/redis-server ./700${i}/redis.conf
done
检查启动状态
bash
ps -ef | grep redis-server | grep -E "700[1-6]"

执行 redis-cli --cluster create 命令初始化集群时,通过 --cluster-replicas 参数指定主从比例,会自动分配主从节点
bash
cd /usr/local/src/redis/redis-cluster
/usr/local/src/redis/redis-5.0.4/src/redis-cli --cluster create \
172.25.49.72:7001 172.25.49.72:7002 172.25.49.72:7003 \
172.25.49.72:7004 172.25.49.72:7005 172.25.49.72:7006 \
--cluster-replicas 1
/usr/local/src/redis/redis-5.0.4/src/redis-cli:Redis 客户端程序的绝对路径,是执行集群管理的入口;
--cluster:表示以集群管理模式运行 redis-cli,而非普通的连接模式;
create:--cluster模式下的核心子命令,含义是创建一个新的 Redis 集群;
172.25.49.72:7001 ... 172.25.49.72:7006:指定加入集群的所有节点,必须是已启动且配置了cluster-enabled yes 的节点;
--cluster-replicas 1:用于指定每个主节点对应的从节点数量。
需要注意的是从前面的 ps 命令输出可以看到,Redis 节点绑定的是内网 IP 172.25.49.72,而不是默认的 127.0.0.1,这意味着 Redis 服务只监听在这个内网 IP 上,所以用 127.0.0.1 去连接会被拒绝,需要使用绑定的是内网 IP 地址。
验证主从关系是否建立,使用集群模式连接7001节点:
bash
/usr/local/src/redis/redis-5.0.4/src/redis-cli -c -h 172.25.49.72 -p 7001
cluster nodes 用于查询集群结点信息
cluster info 用于查询集群状态信息
