一. 前言
前面文章介绍了主从集群和哨兵模式。其中主从集群可以通过读写分离的方式解决高并发场景下的读问题;而在主节点出现故障时,又可以通过哨兵模式的自动选举来实现高可用。
Redis 主从集群 && 哨兵模式
二. Redis 分片集群
2.1 分片集群的作用和特征:
主从和哨兵可以解决高可用,高并发读的问题。但是依然有两个问题没有解决:
- 海量数据存储问题
- 高并发写问题
使用分片集群可以解决上述问题,分片集群特征:
- 集群中有多个 master, 每个 master 保存不同数据
- 每个 master 都可以有多个 slave 节点
- master 之间通过 ping 监测彼此健康状态
2.2 搭建分片集群
Redis 分片集群最少需要3个master 节点,由于我们的机器性能有限,我们只给每个 master 配置一个 slave, 形成最小的分片集群
计划部署的节点信息如下:
2.2.1 集群配置
分片集群中的 Redis 节点必须开启集群模式,一般在配置文件中添加下面参数:
port 7000
cluster-enable yes
cluster-config-file node.conf
cluster-node-timeout 5000
appendonly yes
其中有3个我们没见过的参数:
- cluster-enabled: 是否开启集群模式
- cluster-config-file: 集群模式的配置文件名称,无需手动创建,由集群自动维护
- cluster-node-timeout: 集群中节点之间心跳超时时间
一般搭建集群肯定是给每个节点都配置上述参数,不过考虑到我们计划用 docker-compose 部署,因此可以直接在启动命令中指定参数
在虚拟机的 /root 目录下新建一个 redis-cluster 目录,然后新建一个 docker-compose.yaml 文件,内容如下:
version: "3.2"
services:
r1:
image: redis
container_name: r1
network_mode: "host"
entrypoint: ["redis-server", "--port", "7001", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
r2:
image: redis
container_name: r2
network_mode: "host"
entrypoint: ["redis-server", "--port", "7002", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
r3:
image: redis
container_name: r3
network_mode: "host"
entrypoint: ["redis-server", "--port", "7003", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
r4:
image: redis
container_name: r4
network_mode: "host"
entrypoint: ["redis-server", "--port", "7004", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
r5:
image: redis
container_name: r5
network_mode: "host"
entrypoint: ["redis-server", "--port", "7005", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
r6:
image: redis
container_name: r6
network_mode: "host"
entrypoint: ["redis-server", "--port", "7006", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
注意:使用 Docker 部署 Redis 集群,network 模式必须采用 host
2.2.2 启动集群
进入 /root/redis-cluster 目录,使用命令启动 redis
docker compose up -d
ps -ef | grep redis
可以发现每个 redis 节点都以 cluster 模式运行。不过节点与节点之间未建立连接
接下来,我们使用命令创建集群:
# 进入任意节点容器
docker exec -it r1 bash
# 然后,执行命令
redis-cli --cluster create --cluster-replicas 1\
192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003\
192.168.150.101:7004 192.168.150.101:7005 192.168.150.101:7006
命令说明:
- redis-cli --cluster: 代表集群操作命令
- create: 代表是创建集群
- –cluster-replicas 1: 指定集群中每个 master 的副本个数为1
- 此时节点总数 / (replicas + 1) 得到的就是 master 的数量 n。因此节点列表中前 n 个就是 master, 其他节点都是 slave 节点,随机分配到不同 master
- 此时节点总数 / (replicas + 1) 得到的就是 master 的数量 n。因此节点列表中前 n 个就是 master, 其他节点都是 slave 节点,随机分配到不同 master
接着,我们可以通过命令查看集群状态:
redis-cli -p 7001 cluster nodes