1. 目的
掌握Redis集群搭建的原理和方法。能够采用Redis-Cluster方式对分布式数据库集群的搭建与配置。
2.实验原理
Redis有三种集群方式:主从复制,哨兵模式和cluster集群。
(1)主从复制
实现读写分离,主机主要负责写,但主机也可读;从机只能读。实现读请求的负载均衡。
(2)哨兵模式
添加哨兵节点与主机保持心跳连接,在主机宕机后,从多个从机中选出一个更好的从机作为新的主机,解决单点失效的问题。
(3)Redis-Cluster集群
融合了主从复制模式,集群中的单个节点本质就是一个主从复制模式。集群中每个节点互联形成一个无中心化集群的结构。既保证了数据安全性和可用性,又对数据库实现了横向扩展。
3.实验任务
Redis集群至少需要6个节点,3个主节点,3个从节点。这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,通过修改端口号的方式启动多个redis服务,当然实际生产环境的Redis集群搭建和这里是一样的。
3.1 任务1:集群环境搭建
(1)先创建目录结构
mkdir -p /usr/local/src/redis-7.2.4/6999/data
mkdir -p /usr/local/src/redis-7.2.4/7001/data
mkdir -p /usr/local/src/redis-7.2.4/7002/data
mkdir -p /usr/local/src/redis-7.2.4/7003/data
mkdir -p /usr/local/src/redis-7.2.4/7004/data
mkdir -p /usr/local/src/redis-7.2.4/7005/data
(2)复制配置文件
cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/src/redis-7.2.4/6999/redis.conf
cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/src/redis-7.2.4/7001/redis.conf
cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/src/redis-7.2.4/7002/redis.conf
cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/src/redis-7.2.4/7003/redis.conf
cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/src/redis-7.2.4/7004/redis.conf
cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/src/redis-7.2.4/7005/redis.conf
(3)分别启动并修改每个 redis.conf:
vim /usr/local/src/redis-7.2.4/6999/redis.conf
vim /usr/local/src/redis-7.2.4/7001/redis.conf
vim /usr/local/src/redis-7.2.4/7002/redis.conf
vim /usr/local/src/redis-7.2.4/7003/redis.conf
vim /usr/local/src/redis-7.2.4/7004/redis.conf
vim /usr/local/src/redis-7.2.4/7005/redis.conf
📌 1. redis.conf for 6999
port 6999
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/src/redis-7.2.4/6999/data
logfile "/usr/local/src/redis-7.2.4/6999/redis.log"
bind 127.0.0.1
protected-mode no
📌 2. redis.conf for 7001
port 7001
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/src/redis-7.2.4/7001/data
logfile "/usr/local/src/redis-7.2.4/7001/redis.log"
bind 127.0.0.1
protected-mode no
📌 3. redis.conf for 7002
port 7002
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/src/redis-7.2.4/7002/data
logfile "/usr/local/src/redis-7.2.4/7002/redis.log"
bind 127.0.0.1
protected-mode no
📌 4. redis.conf for 7003
port 7003
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/src/redis-7.2.4/7003/data
logfile "/usr/local/src/redis-7.2.4/7003/redis.log"
bind 127.0.0.1
protected-mode no
📌 5. redis.conf for 7004
port 7004
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/src/redis-7.2.4/7004/data
logfile "/usr/local/src/redis-7.2.4/7004/redis.log"
bind 127.0.0.1
protected-mode no
📌 6. redis.conf for 7005
port 7005
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/src/redis-7.2.4/7005/data
logfile "/usr/local/src/redis-7.2.4/7005/redis.log"
bind 127.0.0.1
protected-mode no
(4)启动实例
redis-server /usr/local/src/redis-7.2.4/6999/redis.conf
redis-server /usr/local/src/redis-7.2.4/7001/redis.conf
redis-server /usr/local/src/redis-7.2.4/7002/redis.conf
redis-server /usr/local/src/redis-7.2.4/7003/redis.conf
redis-server /usr/local/src/redis-7.2.4/7004/redis.conf
redis-server /usr/local/src/redis-7.2.4/7005/redis.conf
(5)创建集群
redis-cli --cluster create \
127.0.0.1:6999 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
注:我的7000端口被占用了,我的图使用的是6999端口。
输入 yes 完成集群配置。
(6)测试
redis-cli -c -p 6999 set testkey "hello"
redis-cli -c -p 6999 get testkey
3.2 任务2:测试集群的读写分离
登录主节点进行写数据操作,登录从节点,查询数据,是否能查询主节点的数据,如果有就实现主从节点的读写分离。登陆从节点测试是否可以写数据。
Redis Cluster 中主从的基本读写行为
✅ 写操作只能在主节点执行;
✅ 默认情况下,读操作也会被主节点处理;
❌ 从节点不能写数据;
❌ 从节点默认不会自动响应读请求,除非启用 readonly 模式
(1)查看主从关系
redis-cli -c -p 6999 cluster nodes
节点地址 | 节点ID(简略) | 类型 | 主节点ID(如是slave) | Slot 负责区间 |
---|---|---|---|---|
127.0.0.1:6999 | a8ece3… | ✅ 主节点 | - | 0–5460 |
127.0.0.1:7001 | 2daab5… | ✅ 主节点 | - | 5461–10922 |
127.0.0.1:7002 | 85e4b9… | ✅ 主节点 | - | 10923–16383 |
127.0.0.1:7003 | e9551b… | 🔁 从节点 | 主:7001 → 2daab5... | (无) |
127.0.0.1:7004 | 3e9eb2… | 🔁 从节点 | 主:7002 → 85e4b9... | (无) |
127.0.0.1:7005 | 4229ae… | 🔁 从节点 | 主:6999 → a8ece3... | (无) |
(2)在主节点写入数据
redis-cli -c -p 6999
连接后写入数据
set user:1 walter
写入结果如下:
(3)在从节点读取数据(默认会被 MOVED 拒绝,进行跳转)
重定位到了主节点
(4)从节点默认不会自动响应读请求,除非启用 readonly 模式
使用了,就可以响应读的请求
3.3 任务3:测试集群的自动备份与容灾
登录主节点进行数据写入,然后登录其他任何从节点,查看存放在主节点数据是否存在,如果存在则实现自动容灾备份。
(1)连接主节点
redis-cli -c -p 6999
写入数据
set backup:test "disaster-proof"
获取槽号
(2)找出这个 key 所属主节点及其从节点
redis-cli -p 6999 cluster nodes
根据节点关系,可得7005为6999的从节点。
(3)模拟主节点宕机 + 验证容灾
杀死主节点进程
登录从节点验证
自此备份容灾验证完成。