Redis集群

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 用于查询集群状态信息

相关推荐
EAIReport9 小时前
工业电气自动化数据治理破局:多Agent大模型赋能全景智能决策
大数据·运维·自动化
MC皮蛋侠客9 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python
会编程的土豆10 小时前
Go 模板初识
linux·运维·服务器
腾讯蓝鲸智云10 小时前
标杆客户实践提炼:CFlow 版本价值流模板实战指南
运维·服务器·自动化·云计算·devops
Lethehong11 小时前
双擎并驱·全链路并行:KFS让TB级异构增量同步秒级到达
数据库
MC皮蛋侠客11 小时前
SQLAlchemy 系列(八):AsyncIO、并发与 Web 生命周期——让每个并发任务持有自己的 Session
数据库·python
Yang961111 小时前
自动化射频测试台快速搭建,鼎讯信通 DXSL 矢量信号源模块二次开发集成指南
运维·自动化
一水11 小时前
Redis实战:一个AI工作流系统里的五个应用场景,从传参到限流的完整链路
数据库·redis·wpf
翼龙云_cloud12 小时前
腾讯云国际站代理商: COS 对象存储 + CDN加速 从创建到加速完成
运维·服务器·云计算·腾讯云
枫叶v.12 小时前
Prompt Injection 防不住怎么办?从 Source-Sink 模型设计 Agent 安全边界
数据库·安全·prompt