掘金 后端 ( ) • 2024-06-14 15:58

theme: github

Redis 集群是一个分布式存储解决方案,它将数据分布在多个Redis节点上,以提高系统的可伸缩性、可靠性和性能。

1. 集群概念与特点

  • 集群概念:Redis集群是由多个相互独立的 Redis 节点组成,这些节点通过高速网络互联,并作为一个整体对外提供服务。

  • 特点

    1. 高可用性:通过数据分片和数据复制来提供高可用性。当一个节点失败时,集群可以继续工作,并通过数据复制从其他节点获得数据。
    2. 扩展性:支持水平扩展,可以将数据分布在多个节点上,从而提供更高的存储容量和处理能力。
    3. 高性能:可以在多个节点上并行处理请求,提供更高的吞吐量和更低的延迟。

1.1. 集群模式

Redis 集群主要有三种模式:主从模式、Sentinel 模式和 Cluster 模式。其中,Cluster 模式是最常用的模式,它支持多个 master 节点,每个 master 节点可以挂载多个 slave 节点,实现读写分离和数据备份。

1.2. 集群原理与实现

  1. 数据分片:Redis 集群使用分片技术将数据分布在多个节点上。数据被划分为多个槽(slot),每个槽对应一个节点。集群总共有 16384 个槽,每个节点负责管理一部分槽。
  2. 节点通信:节点之间通过 Gossip 协议进行通信,以保持节点之间的状态一致性。
  3. 请求处理:当一个客户端请求访问某个槽的数据时,它会先通过 CRC16 算法计算出该数据属于哪个槽,然后根据槽与节点的映射关系,将请求发送给相应的节点。
  4. 主从复制:每个主节点负责一部分槽的数据,同时也会有一个或多个从节点备份主节点的数据。当主节点故障时,其中一个从节点会被选举为新的主节点,保证系统的高可用性。
  5. 自动故障恢复:Redis 集群实现了自动数据迁移和故障恢复机制。当新增节点或节点故障时,集群会自动进行数据迁移,将槽重新分配给其他节点,以保证数据的均衡和高可用性。

2. 集群搭建

这里搭建的 Redis 集群位于单台主机上,所以 IP 地址均为 127.0.0.1

2.1. 创建配置文件

这里我们将搭建三个主节点,然后每个主节点分配一个从节点,所以一共需要启动六个 Redis 实例。

这里我们将文件命名为 cluster-port.conf,其中 port 是每个 redis 实例的端口。比如:cluster-6379.conf

port 6379

cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

dbfilename dump-6379.rdb
appendfilename "appendonly-6379.aof"

# linux 下你还要修改下面这些
daemonize yes
pidfile /var/run/redis-6379.pid

然后为每个端口的 redis 实例都创建一个配置文件。修改其中的端口即可。在 linux 中你可以使用下面的命令快速地创建多个文件。

# 这段命令的作用是将 redis-6379.conf 中所有的 6379 替换为 6380 并将结果
# 输出到 redis-6380.conf 文件中
sed 's/6379/6380/g' redis-6379.conf > redis-6380.conf

2.2. 启动集群

在 windows 中使用如下命令创建集群,Redis 会自动设置每个实例的主从关系。不过首先你需要先将全部的 redis 实例启动。像下面这样:

# start 作用是让 redis 后台启动
start redis-server.exe cluster-6379.conf

然后我们再通过 redis-cli 创建集群。

redis-cli.exe --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

命令执行结果如下:

image.png

最后 redis 会自动配置集群,它会给出主从节点的分配,最后让你确认是否这样分配。输入 yes 之后集群就创建完成了。

2.3. 测试集群

既然集群搭建好了,那可得玩一玩。使用下面的命令连接集群,连接集群中任意一个主从节点均可。

# -c 表示连接集群
redis-cli.exe -p 6379 -c

然后我们就可以尝试添加数据、获取数据。由于在 redis 集群中,每个主节点存储着部分槽(slots)的数据,所以让我们添加数据时,如果该数据的键映射到其他的节点的槽位上了,redis-cli 会直接连接到对应的节点。结果如下:

image.png

3. 集群管理

Redis 集群还支持增删节点、获取集群状态等操作。

3.1. 获取集群信息

# 这里随便指定一个集群中节点即可
redis-cli.exe --cluster info 127.0.0.1:6379

image.png

3.2. 平衡槽位数量

redis-cli.exe --cluster rebalance 127.0.0.1:6379

3.3. 迁移节点槽位

redis-cli.exe --cluster reshard 127.0.0.1:6379

3.4. 删除节点

redis-cli.exe --cluster del-node 127.0.0.1:6379 <node-id>

3.5. 添加节点

redis-cli.exe --cluster add-node 127.0.0.1:8000 127.0.0.1:6379

添加节点后进行槽位迁移,该新节点加入时默认为主节点。

redis-cli.exe --cluster reshard 127.0.0.1:6379

receive ID 为 新加入节点的 nodeID,然后源节点输入 all 即可,最后确认即可。