# Cluster 架构与命令

URL: https://caijiao.org/redis/08-cluster/03-cluster
Source: docs/redis/08-cluster/03-cluster.md
Description: Redis Cluster 是 Redis 提供的分布式解决方案，通过自动分片和分布式数据存储，支持大规模数据集的高可用和高性能访问。

Redis Cluster 是 Redis 提供的一种分布式架构，旨在解决单节点 Redis 的性能和可扩展性瓶颈。它通过数据分片（sharding）将数据分布到多个节点，能够处理比单个实例更大的数据量，并且提供高可用性和容错性。Redis Cluster 支持自动分片和故障转移，确保数据的高效存储和快速访问。

## 1. Redis Cluster 架构概述

Redis Cluster 通过多个节点的组合来实现数据分布和高可用性。Redis Cluster 中的每个节点（主节点或从节点）都负责存储数据的一部分，集群中的数据按照哈希槽（hash slots）分布，每个节点处理一定范围的哈希槽。

### 1.1 哈希槽

Redis Cluster 使用 16384 个哈希槽来分配数据。每个 Redis 集群节点（主节点或从节点）负责一部分哈希槽。数据根据键的哈希值来确定存储在哪个哈希槽中，进而决定数据存储在哪个节点上。通过这种方式，Redis Cluster 实现了自动分片。

### 1.2 主从节点

Redis Cluster 是由多个主节点和从节点组成的。在 Redis Cluster 中，主节点负责处理客户端的读写请求，而从节点则用于复制主节点的数据。当主节点发生故障时，从节点可以自动接管主节点的角色，保证集群的高可用性。

### 1.3 集群拓扑

Redis Cluster 的拓扑结构是一个有多个主节点和从节点的树形结构，每个主节点负责一定数量的哈希槽，多个从节点则用来复制主节点的数据，并为客户端提供读操作。每个主节点都维护自己的从节点信息，集群中的节点可以相互发现。

### 1.4 故障转移与重定向

在 Redis Cluster 中，当主节点发生故障时，集群会自动选择一个从节点作为新的主节点，以保证数据的高可用性。同时，客户端在访问集群时，如果访问到一个不包含目标数据的节点，集群会通过重定向机制将请求引导到正确的节点。

## 2. Redis Cluster 的基本配置

### 2.1 启动 Redis Cluster 节点

要启动一个 Redis Cluster，需要启动多个 Redis 实例，每个实例对应集群中的一个节点。Redis 集群至少需要 6 个实例（3 个主节点，3 个从节点），以确保高可用性。

首先，创建并编辑多个 `redis.conf` 配置文件，为每个节点设置不同的端口和其他配置项：

```bash
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
````

在每个节点的配置文件中，启用 `cluster-enabled` 配置项，并为每个节点指定唯一的端口。配置文件 `cluster-config-file` 用于存储集群的运行状态。

### 2.2 配置集群

启动 Redis 实例后，使用 `redis-cli` 工具创建集群。例如，假设你已经启动了 6 个 Redis 实例，它们分别监听在端口 7000 到 7005 上。通过以下命令创建 Redis 集群：

```bash
redis-cli --cluster create 192.168.1.100:7000 192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 192.168.1.100:7004 192.168.1.100:7005 --cluster-replicas 1
```

该命令会将这些节点创建为一个 Redis 集群，其中 `--cluster-replicas 1` 表示为每个主节点配置一个从节点。

### 2.3 验证集群状态

创建集群后，可以使用以下命令检查集群的状态：

```bash
redis-cli -c -h 192.168.1.100 -p 7000 cluster info
```

返回信息会显示集群的状态，包括节点数、分片情况等。

## 3. Redis Cluster 常用命令

Redis Cluster 中的命令与单机 Redis 的命令基本相同，但有一些特殊的命令与集群相关，主要用于管理集群和处理跨节点的数据访问。

### 3.1 `CLUSTER INFO`

该命令用于获取 Redis 集群的状态信息。返回的数据包含集群的基本信息，如集群的状态、节点数、哈希槽信息等。

```bash
CLUSTER INFO
```

示例返回：

```text
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:2
```

### 3.2 `CLUSTER NODES`

该命令用于列出 Redis 集群的所有节点，包括每个节点的角色、状态、哈希槽分配等信息。

```bash
CLUSTER NODES
```

返回的信息如下：

```text
aef4e9e14aee58a9acfe6ff4434f74fd84c365de 192.168.1.100:7000 master - 0 1634838924082 3 connected 0-5460
db3ec7ad9f47984a4901e61a35664810e2fd5cf9 192.168.1.100:7001 master - 0 1634838924082 2 connected 5461-10922
bc60b4282120d7b03cd59ed5063f27a20bc6223e 192.168.1.100:7002 master - 0 1634838924082 1 connected 10923-16383
```

### 3.3 `CLUSTER MEET`

该命令用于将一个新的节点加入到 Redis 集群中：

```bash
CLUSTER MEET 192.168.1.100 7006
```

### 3.4 `CLUSTER FORGET`

该命令用于将集群中的某个节点移除。通常用于当节点失效或不再需要时使用：

```bash
CLUSTER FORGET <node-id>
```

### 3.5 `CLUSTER REPLICATE`

该命令用于将某个从节点设置为主节点的从节点。可以手动调整主从节点关系：

```bash
CLUSTER REPLICATE <node-id>
```

### 3.6 `GET` 和 `SET` 命令

在 Redis Cluster 中，`GET` 和 `SET` 等命令与单机 Redis 相同，但它们会自动处理跨节点的数据访问。每个键值对会被哈希到特定的哈希槽，并存储在相应的节点中。客户端会自动重定向到正确的节点。

```bash
SET foo bar
GET foo
```

### 3.7 `MGET` 和 `MSET`

`MGET` 和 `MSET` 支持多个键值的操作，并且 Redis Cluster 会自动处理跨节点的数据访问。例如：

```bash
MSET foo bar hello world
MGET foo hello
```

## 4. Redis Cluster 的高可用性与故障转移

### 4.1 自动故障转移

Redis Cluster 支持自动故障转移。当一个主节点故障时，集群会自动将一个从节点提升为新的主节点，以保证集群的高可用性。故障转移是通过 Redis Cluster 内部的选举机制实现的。

### 4.2 客户端重定向

当客户端访问 Redis Cluster 时，如果访问的节点不包含所请求的数据，集群会通过重定向将客户端请求引导到正确的节点。客户端需要能够处理重定向，通常客户端会自动进行重试。

## 5. Redis Cluster 的局限性

### 5.1 跨分片操作

Redis Cluster 并不支持跨分片的原子操作，例如，无法在一个事务中执行多个键值对的操作，如果这些键分布在不同的分片上。这是由于 Redis Cluster 的数据分布策略决定的。

### 5.2 集群配置复杂

虽然 Redis Cluster 提供了高可用性和水平扩展能力，但其配置和管理相对复杂。特别是集群中的节点、哈希槽和故障转移的配置需要谨慎操作。

### 5.3 客户端支持

并非所有的 Redis 客户端都支持 Redis Cluster，某些客户端可能不支持集群的重定向机制或其他特性。在选择客户端时，需要确保它支持 Redis Cluster。

## 总结

Redis Cluster 是一种强大的分布式架构，它通过数据分片和多节点高可用性解决了 Redis 单节点的性能和可扩展性瓶颈。通过合理配置和使用
