一、Redis 主从复制(Replication)
1. 复制流程
主从复制的核心流程分为三步:
-
从节点发起同步请求:从节点向主节点发送
SYNC命令,请求数据同步。 -
主节点生成并发送 RDB 文件:主节点收到
SYNC后,执行BGSAVE生成 RDB 快照文件,并发送给从节点;同时缓存此期间的新写命令。 -
主节点发送增量命令:RDB 传输完成后,主节点将缓存的增量写命令发送给从节点,之后持续同步新命令,保持数据一致。
2. 配置步骤
-
主节点:无需额外配置(默认开启主节点模式)。
-
从节点:在从节点的
redis.conf中配置,或通过命令行临时设置:slaveof <master_ip> <master_port>例如:
slaveof 192.168.61.131 6379。
3. 功能测试
-
数据同步验证:向主节点写入数据(如
SET test_key 123),观察从节点是否能通过GET test_key获取到相同数据。 -
故障场景验证:关闭主节点(
SHUTDOWN),此时从节点会进入只读模式,无法写入数据(文档中提到“主死了从只能读”,这是 Redis 主从复制的默认行为——从节点默认slave-read-only yes)。
二、Redis 集群(Cluster)
1. 核心机制解析
(1)节点间为何相互 Ping-Pong?
Redis 集群采用 Gossip 协议,节点之间通过定期发送 PING(心跳检测)和接收 PONG(响应)消息,交换节点状态(在线/离线、槽位分配等),实现集群状态的分布式感知。
(2)为何需要检测故障节点?
Redis 集群采用 去中心化架构,但依赖“多数派投票”机制判断节点故障。若某个主节点宕机且未及时检测,其负责的槽位将无法访问,导致集群整体不可用(文档中“集群中有一个节点挂了整个群都挂了”的描述需注意:实际是“负责槽位的主节点宕机且无可用的从节点升级”时才会不可用)。
(3)客户端为何能连接任意节点?
Redis 集群将所有数据划分为 16384 个哈希槽(Slot),每个主节点负责一部分槽位。客户端存取数据时,通过 CRC16(key) % 16384计算 key 对应的槽位,再根据槽位与节点的映射关系,自动重定向到正确的节点(即使客户端连接非目标节点,也会返回 MOVED重定向指令)。
(4)集群最少需要多少节点?
-
投票容错:判断节点故障需超过半数节点同意,因此至少需要 3 个主节点(3 个节点投票时,2 票即可超过半数)。
-
高可用要求:为保证故障时从节点能升级为主节点,通常每个主节点至少配 1 个从节点,因此最小高可用集群为 3 主 3 从(共 6 个节点)。
2. 集群搭建步骤(以 6 节点为例)
(1)准备环境
-
删除原 Redis 实例的持久化文件(避免旧数据干扰):
cd /usr/local/redis/bin rm -f dump.rdb appendonly.aof
(2)开启集群模式
修改每个节点的 redis.conf:
cluster-enabled yes # 开启集群模式
cluster-config-file nodes-7001.conf # 集群配置文件(自动生成)
cluster-node-timeout 15000 # 节点超时时间(毫秒)
(3)创建 6 个节点目录
cd /usr/local
cp -r redis redis-cluster/redis-7001
cp -r redis redis-cluster/redis-7002
# 同理复制 7003~7006
(4)修改各节点端口
分别编辑每个节点的 redis.conf,设置不同端口:
port 7001 # 7002~7006 依次修改
(5)编写启动脚本
创建 start-all.sh批量启动节点:
cd /usr/local/redis-cluster
vim start-all.sh
# 内容如下:
cd redis-7001/bin && ./redis-server redis.conf
cd ../redis-7002/bin && ./redis-server redis.conf
# 同理添加 7003~7006
chmod 755 start-all.sh
./start-all.sh
ps -ef | grep redis # 验证进程
(6)安装 Ruby 环境(旧版 Redis 依赖)
Redis 3.x 集群搭建需通过 Ruby 脚本 redis-trib.rb,需安装 Ruby 及依赖:
yum install ruby rubygems
gem install redis-3.0.0.gem # 需提前下载对应版本的 redis.gem
(7)执行集群创建脚本
使用 redis-trib.rb初始化集群(--replicas 1表示每个主节点配 1 个从节点):
cd /usr/upload/redis-3.0.0/src
./redis-trib.rb create --replicas 1 \
192.168.61.131:7001 192.168.61.131:7002 192.168.61.131:7003 \
192.168.61.131:7004 192.168.61.131:7005 192.168.61.131:7006
(8)集群测试
-
数据存取:使用
-c参数开启集群模式连接:./redis-cli -c -p 7001 SET test_key "hello cluster" # 自动重定向到对应槽位节点 GET test_key -
高可用验证:查看集群节点状态:
cluster nodes # 显示所有节点角色(master/slave)、槽位、状态关闭主节点(如 7001)后,再次执行
cluster nodes,可观察到从节点(如 7004)升级为新主节点。
三、Redis 五种数据类型及常用命令
|
数据类型 |
赋值命令 |
取值命令 |
删除命令 |
核心特点 |
|---|---|---|---|---|
|
String |
|
|
|
二进制安全,最大 512MB |
|
Hash |
|
|
|
键值对集合,适合存储对象 |
|
List |
|
|
|
双向链表,支持头尾操作 |
|
Set |
|
|
|
无序不重复集合,支持交集并集 |
|
ZSet |
|
|
|
有序集合(按 score 排序) |
四、注意事项(文档补充与修正)
-
主从复制的“从节点只读”:Redis 2.6+ 版本默认
slave-read-only yes,可通过配置关闭,但不建议(避免数据不一致)。 -
集群故障容错:文档中“集群中有一个节点挂了整个群都挂了”不准确,实际是“负责槽位的主节点宕机且无从节点升级”时才会不可用;若主节点有从节点,从节点会自动晋升。
-
Ruby 脚本的替代方案:Redis 5.0+ 已内置
redis-cli --cluster命令,无需依赖 Ruby,例如:redis-cli --cluster create 192.168.61.131:7001 ... --cluster-replicas 1
&spm=1001.2101.3001.5002&articleId=159735850&d=1&t=3&u=07ead938fe1c47d78831b22242b476df)
1010

被折叠的 条评论
为什么被折叠?



