四、redis入门之集群部署
1、集群部署(Cluster)
- Redis集群是分布式运行模式,通过分片实现数据自动分区和管理,保障高可用性与可扩展性。
- 数据被分割为多个槽,分布在不同节点;节点分主从,主节点负责读写请求和集群信息维护,从节点复制主节点数据和状态。
2、Redis集群的作用
- **数据分区**:核心功能,将数据分散到多节点,突破单机内存限制以增加存储容量,且各主节点可提供读写服务以提升响应能力(单机内存过大会导致fork操作阻塞主进程、主从切换时从节点长时间不可用、全量复制阶段主节点复制缓冲区溢出等问题)。
- **高可用**:支持主从复制和主节点自动故障转移(类似哨兵),确保任一节点故障时集群仍能提供服务。
3、Redis集群的数据分片总结
1. **哈希槽机制**:
- 集群包含16384个哈希槽(编号0-16383),每个节点负责部分哈希槽。
- Key通过CRC16校验后对16384取余,确定所属哈希槽及对应节点,实现自动存取。
2. **主从复制模型**:
- 示例:3个主节点(A、B、C)分别负责0-5460、5461-10922、10923-16383号哈希槽。
- 单主节点(如B)故障时,集群因缺失对应哈希槽不可用。
- 每个主节点配从节点(A1、B1、C1)后,主节点(如B)故障时,从节点(B1)会被选举为主节点继续服务;若主从节点(如B和B1)均故障,集群不可用。
4、集群部署
Redis Cluster被配置为三主三从模式。这意味着每台服务器上的两个Redis节点中,一个节点作为主库(master),另一个作为从库(slave)。
4.1配置准备
配置文件+目录创建
创建集群配置文件夹
mkdir -p /opt/software/redis/redis-stable/cluster
mkdir -p /opt/software/redis/cluster编辑6379端口的配置文件
vim ./cluster/redis_6379.conf
# 绑定地址,允许所有IP(IPv4和IPv6)访问
bind * -::*
# 以守护进程(后台)模式运行
daemonize yes
# 关闭保护模式,允许远程连接(生产环境需结合安全策略,如配合防火墙等)
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间,单位毫秒
cluster-node-timeout 5000
# 端口号
port 6379
# log日志文件路径
logfile "/opt/software/redis/redis-stable/cluster/redis6379.log"
# 集群配置文件,用于记录集群节点信息
cluster-config-file nodes-6379.conf
# AOF持久化文件名
appendfilename "appendonly6379.aof"
# RDB持久化文件名
dbfilename "dump6379.rdb"
# 数据存储目录,AOF、RDB等文件会存放在此目录(需确保目录存在且有对应权限 )
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes编辑6380端口的配置文件
vim ./cluster/redis_6380.conf
# 绑定地址,允许所有IP(IPv4和IPv6)访问
bind * -::*
# 以守护进程(后台)模式运行
daemonize yes
# 关闭保护模式,允许远程连接(生产环境需结合安全策略,如防火墙等 )
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间,单位毫秒
cluster-node-timeout 5000
# 端口号,对应 6380 端口
port 6380
# log 日志文件路径,记录该实例运行日志
logfile "/opt/software/redis/redis-stable/cluster/redis6380.log"
# 集群配置文件,用于记录集群节点信息
cluster-config-file nodes-6380.conf
# AOF 持久化文件名
appendfilename "appendonly6380.aof"
# RDB 持久化文件名
dbfilename "dump6380.rdb"
# 数据存储目录,AOF、RDB 等文件会存放在此目录(需确保目录存在且有对应权限 )
dir "/opt/software/redis/cluster"
# 开启 AOF 持久化
appendonly yes
4.2 启动redis
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf
插曲
如输入查看
ps aux|grep redis
出现哨兵,和6379不是以cluster启动的
说明之前的redis服务存在、redis哨兵也存在,需要做一些操作
4.2.1、关闭
关闭哨兵
redis-cli -p 26379 shutdown
关闭之前的6379端口,默认使用6379
redis-cli shutdown
再次查看出现如下
4.2.2、重启6379
redis-server ./cluster/redis_6379.confps aux|grep redis
发现6379和6380都是以cluster启动的
4.3 启动redis集群
在master节点执行命令,创建集群
redis-cli --cluster create --cluster-replicas 1 192.168.88.100:6379 192.168.88.100:6380 192.168.88.111:6379 192.168.88.111:6380 192.168.88.222:6379 192.168.88.222:6380
解释
redis-cli --cluster create
redis-cli
:Redis 官方提供的命令行客户端工具,用于与 Redis 服务器交互,执行各种操作(如读写数据、管理集群等 )。
--cluster
:启用redis-cli
的集群管理模式,后续可跟集群相关的子命令(这里是create
)。
create
:子命令,功能是创建一个新的 Redis 集群,会自动为节点分配哈希槽(hash slot )、确定主从角色等,将多个 Redis 实例组织成集群。
--cluster-replicas 1
选项
--cluster-replicas
用于指定每个主节点(master )对应的从节点(replica,也叫 slave )数量。这里值为1
,意味着集群构建时,每有 1 个主节点,就会搭配 1 个从节点,用于数据冗余、故障转移,提升集群高可用性 。
192.168.88.100:6379 192.168.88.100:6380 192.168.88.111:6379 192.168.88.111:6380 192.168.88.222:6379 192.168.88.222:6380
这是参与集群构建的 Redis 节点地址列表,格式为
IP:端口
。每个地址对应一个独立的 Redis 实例,这些实例需要提前正确配置(比如开启cluster-enabled yes
等集群相关配置 )并启动。
1、告诉我们槽位
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 163832、告诉我们每个主节点的从节点
Adding replica 192.168.88.111:6380 to 192.168.88.100:6379
Adding replica 192.168.88.222:6380 to 192.168.88.111:6379
Adding replica 192.168.88.100:6380 to 192.168.88.222:6379
输入 yes,完成集群搭建
检查命令
检查集群状态、槽位、节点信息、消息
redis-cli cluster info
- **集群状态**:正常(ok)
- **槽位情况**:共16384个槽位,全部已分配且状态正常,无pfail或fail状态的槽位
- **节点信息**:已知节点6个,集群规模为3(主节点数量)
- ** epoch信息**:当前集群epoch为6,本节点epoch为1
- **消息统计**:
- 发送消息:共417条(ping 210条、pong 207条)
- 接收消息:共417条(ping 202条、pong 210条、meet 5条)
- **缓冲区限制**:无超出情况(total_cluster_links_buffer_limit_exceeded:0)
检查角色、链接、故障转移等等
redis-cli info replication
- **角色**:当前节点为Redis主节点(master)。
- **从节点连接**:有1个从节点(slave)在线,信息为:IP=192.168.88.222,端口=6380,状态=online,偏移量=238,延迟=0。
- **故障转移状态**:未进行故障转移(no-failover)。
- **复制ID与偏移量**:
- master_replid:232052df7c35c72003a244f3bcfa53c9c091d0dc
- master_replid2:0000000000000000000000000000000000000000(无备用复制ID)
- master_repl_offset:238(主节点当前复制偏移量)
- second_repl_offset:-1(无二次复制偏移量)
- **复制积压缓冲区**:
- 状态:激活(repl_backlog_active:1)
- 大小:1048576字节
- 起始偏移量:1
- 历史长度:238字节
检查主、从节点的信息
redis-cli cluster nodes
1. **主节点(master)及负责槽位**:
- 192.168.88.222:6379:负责槽位10923-16383(当前连接节点)
- 192.168.88.111:6379:负责槽位5461-10922
- 192.168.88.100:6379:负责槽位0-54602. **从节点(slave)及对应主节点**:
- 192.168.88.222:6380:从属于192.168.88.111:6379
- 192.168.88.111:6380:从属于192.168.88.100:6379
- 192.168.88.100:6380:从属于192.168.88.222:63793. **集群状态**:所有节点均处于“connected”(已连接)状态,槽位分配完整(0-16383全覆盖)。
5、模拟故障转移
故障产生
查看 192.168.88.222 的6380日志文件(看好对应从节点)
cd /opt/software/redis/redis-stable/clustertail -f redis6380.log
关闭 222的 100 主节点 6379
redis-cli shutdown
在日志中看到集群快速的进行了故障转移
在 222 查看节点信息
redis-cli -p 6380 info replication
6380变成了主节点还没有从节点
使用图中命令看到一个失败的master
故障恢复
重启被关掉的6379
再次查看节点信息,发现少了一个失败的master
多了个小弟