This commit is contained in:
罗祥
2019-12-13 17:38:01 +08:00
parent 8315420e47
commit 0ca51dabd8
4 changed files with 34 additions and 44 deletions

View File

@@ -32,13 +32,11 @@ HASH_SLOT = CRC16(key) mod 16384
假设现在有一个 6 个节点的集群,分别有 3 个 Master 点和 3 个 Slave 节点,槽会尽量均匀的分布在所有 Master 节点上。数据经过散列后存储在指定的 Master 节点上,之后 Slave 节点会进行对应的复制操作。这里再次说明一下槽只是一个虚拟的概念,并不是数据存放的实际载体。
<div align="center"> <img src="../pictures/redis-集群架构.png"/> </div>
### 1.2 节点通讯
在 Redis 分布式架构中,每个节点都存储有整个集群所有节点的元数据信息,这是通过 P2P 的 Gossip 协议来实现的。集群中的每个节点都会单独开辟一个 TCP 通道,用于节点之间彼此通信,通信端口号在基础端口上加 10000每个节点定期通过特定的规则选择部分节点发送 ping 消息,接收到 ping 信息的节点用 pong 消息作为响应,通过一段时间的彼此通信,最终所有节点都会达到一致的状态,每个节点都会知道整个集群全部节点的状态信息,从而到达集群状态同步的目的。
<div align="center"> <img src="../pictures/redis节点通讯.png"/> </div>
### 1.3 请求路由
#### 1. 请求重定向
@@ -126,7 +124,6 @@ cluster-config-file nodes-6480.conf
启动所有 Redis 节点,启动后使用 `ps -ef | grep redis` 查看进程,输出应如下:
<div align="center"> <img src="../pictures/redis-cluster-ps-ef.png"/> </div>
接着需要使用以下命令创建集群,集群节点之间会开始进行通讯,并完成槽的分配:
```shell
@@ -137,10 +134,9 @@ redis-cli --cluster create 127.0.0.1:6479 127.0.0.1:6480 127.0.0.1:6481 \
执行后输出如下M 开头的表示持有槽的主节点S 开头的表示从节点,每个节点都有一个唯一的 ID。最后一句输出表示所有的槽都已经分配到主节点上此时代表集群搭建成功。
<div align="center"> <img src="../pictures/redis-cluster-create.png"/> </div>
### 2.3 集群完整性校验
集群完整性指所有的槽都分配到存活的主节点上, 只要16384个槽中有一个没有分配给节点则表示集群不完整。 可以使用以下命令进行检测, check 命令只需要给出集群中任意一个节点的地址就可以完成整个集群的检查工作
集群完整性指所有的槽都分配到存活的主节点上, 只要16384个槽中有一个没有分配给节点则表示集群不完整。 可以使用以下命令进行检测, check 命令只需要给出集群中任意一个节点的地址就可以完成整个集群的检查工作
```shell
redis-cli --cluster check 127.0.0.1:6479
@@ -160,21 +156,20 @@ Redis 集群提供了灵活的节点扩容和缩容方案,可以在不影响
### 3.1 集群扩容
这里准备两个新的节点 6485 和 6486配置和其他节点一致配置完成后进行启动。集群扩容的命令为 `add-node`,第一个参数为需要加入的新节点,第二个参数为集群中任意节点,用于发现集群
这里准备两个新的节点 6485 和 6486配置和其他节点一致配置完成后进行启动。集群扩容的命令为 `add-node`,第一个参数为需要加入的新节点,第二个参数为集群中任意节点,用于发现集群
```shell
redis-cli --cluster add-node 127.0.0.1:6485 127.0.0.1:6479
```
成功加入集群后,可以使用 `cluster nodes` 命令查看集群情况。不做任何特殊指定,默认加入集群的节点都是主节点,但是集群并不会为分配任何槽。如下图所示,其他 master 节点后面都有对应的槽的位置信息,但新加入的 6485 节点则没有,由于没有负责的槽,所以该节点此时不能进行任何读写操作
成功加入集群后,可以使用 `cluster nodes` 命令查看集群情况。不做任何特殊指定,默认加入集群的节点都是主节点,但是集群并不会为分配任何槽。如下图所示,其他 master 节点后面都有对应的槽的位置信息,但新加入的 6485 节点则没有,由于没有负责的槽,所以该节点此时不能进行任何读写操作
```shell
redis-cli -h 127.0.0.1 -p 6479 cluster nodes
```
<div align="center"> <img src="../pictures/redis-cluster-nodes.png"/> </div>
想要让新加入的节点能够进行读写操作,可以使用 `reshard` 命令为其分配槽,这里我们将其他三个主节点上的槽迁移一部分到 6485 节点上,这里一共迁移 4096 个槽,即 16384 除以 4 。 `cluster-from ` 用于指明槽的源节点,可以为多个,`cluster-to` 为槽的目标节点,`cluster-slots` 为需要迁移的槽的总数。
想要让新加入的节点能够进行读写操作,可以使用 `reshard` 命令为其分配槽,这里我们将其他三个主节点上的槽迁移一部分到 6485 节点上,这里一共迁移 4096 个槽,即 16384 除以 4 。 `cluster-from ` 用于指明槽的源节点,可以为多个,`cluster-to` 为槽的目标节点,`cluster-slots` 为需要迁移的槽的总数:
```shell
redis-cli --cluster reshard 127.0.0.1:6479 \
@@ -183,11 +178,10 @@ redis-cli --cluster reshard 127.0.0.1:6479 \
--cluster-slots 4096 --cluster-yes
```
迁移后,再次使用 `cluster nodes` 命令可以查看到此时 6485 上已经有其他三个主节点上迁移过来的槽
迁移后,再次使用 `cluster nodes` 命令可以查看到此时 6485 上已经有其他三个主节点上迁移过来的槽
<div align="center"> <img src="../pictures/redis-cluster-nodes2.png"/> </div>
为保证高可用,可以为新加入的主节点添加从节点,命令如下。`add-node` 接收两个参数,第一个为需要添加的从节点,第二个参数为集群内任意节点,用于发现集群。`cluster-master-id` 参数用于指明作为哪个主节点的从节点,如果不加这个参数,则自动分配给从节点较少的主节点。
为保证高可用,可以为新加入的主节点添加从节点,命令如下。`add-node` 接收两个参数,第一个为需要添加的从节点,第二个参数为集群内任意节点,用于发现集群。`cluster-master-id` 参数用于指明作为哪个主节点的从节点,如果不加这个参数,则自动分配给从节点较少的主节点:
```shell
redis-cli --cluster add-node 127.0.0.1:6486 127.0.0.1:6479 --cluster-slave \
@@ -196,7 +190,7 @@ redis-cli --cluster add-node 127.0.0.1:6486 127.0.0.1:6479 --cluster-slave \
### 3.2 集群缩容
集群缩容的命令如下:第一个参数为集群内任意节点,用于发现集群;第二个参数为需要删除的节点
集群缩容的命令如下:第一个参数为集群内任意节点,用于发现集群;第二个参数为需要删除的节点
```
redis-cli --cluster del-node 127.0.0.1:6479 `<node-id>`