要创建集群,我们需要启动几个空的 Redis 实例并将它们配置为在集群模式下运行。
以下是 Redis Cluster 的最小配置文件
# redis.conf file
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
在第一行中,我们指定服务器应运行的端口,然后我们声明我们希望服务器在集群模式下运行,使用 cluster-enabled yes
指令。 cluster-config-file
定义了存储此节点配置的文件的名称,以防服务器重新启动。最后, cluster-node-timeout
是节点必须不可到达以被视为故障状态的毫秒数。
让我们在您的本地主机上创建一个集群,其中包含三个主分片和三个副本(请记住,在生产环境中始终使用两个副本以防止出现脑裂情况)。我们需要启动六个 Redis 进程并为每个进程创建一个 redis.conf
文件,指定它们的端口和上面其他配置指令。
首先,创建六个目录
mkdir -p {7000..7005}
然后创建最小的配置文件 redis.conf
文件(如上所示)在它们中的每一个,确保您将端口指令更改为与目录名称匹配。
要将初始 redis.conf
文件复制到每个文件夹,运行以下命令
for i in {7000..7005}; do cp redis.conf $i; done
您应该最终得到以下目录结构
- 7000
- redis.conf
- 7001
- redis.conf
- 7002
- redis.conf
- 7003
- redis.conf
- 7004
- redis.conf
- 7005
- redis.conf
打开六个终端选项卡,并通过进入每个目录并启动 Redis 实例来启动服务器
# Terminal tab 1
cd 7000
/path/to/redis-server ./redis.conf
# Terminal tab 2
cd 7001
/path/to/redis-server ./redis.conf
... and so on.
现在您已经启动了六个空的 Redis 服务器,您可以将它们加入集群
redis-cli --cluster create 127.0.0.1:7000 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
这里我们列出了所有六个服务器的端口和 IP 地址,并使用 create
命令指示 Redis 将它们加入集群,为每个主服务器创建一个副本。 redis-cli
将提出一个配置;通过键入 yes 接受它。集群将被配置和加入,这意味着实例将被引导到相互通信。
最后,您应该看到一条消息说
[OK] All 16384 slots covered
这意味着至少有一个主实例为可用的 16384 个插槽中的每一个提供服务。
让我们向集群添加一个新的分片,这可能是在您需要扩展时会执行的操作。
首先,与之前一样,我们需要在集群模式下启动两个新的空 Redis 实例(主服务器及其副本)。我们创建新的目录 7006
和 7007
,并在其中复制我们之前使用的相同 redis.conf
文件,确保我们将它们中的端口指令更改为相应的端口 (7006
和 7007
)。
$ mkdir 7006 7007
$ cp 7000/redis.conf 7006/redis.conf
$ cp 7000/redis.conf 7007/redis.conf
将文件 ./7006/redis.conf
和 ./7007/redis.conf
中的端口号分别更新为 7006
和 7007
。
让我们启动 Redis 实例
# Terminal tab 7
$ cd 7006
$ redis-server ./redis.conf
# Terminal tab 8
$ cd 7007
$ redis-server ./redis.conf
在下一步中,我们使用 add-node
命令将新的主分片加入集群。第一个参数是新分片的地址,第二个参数是集群中当前分片中的任何一个的地址。
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
Redis 命令使用“节点”一词来表示我们在本培训中称为“分片”的内容,因此名为“add-node”的命令意味着“添加一个分片”。
最后,我们需要使用相同的 add-node
命令和一些额外的参数将新的副本分片加入,这些参数指示分片以副本身份加入以及其主分片是什么。如果我们没有指定主分片,Redis 将自行分配一个。
我们可以通过在任何一个分片上运行 cluster nodes 命令来找到我们分片的 ID
$ redis-cli -p 7000 cluster nodes
46a768cfeadb9d2aee91ddd882433a1798f53271 127.0.0.1:7006@17006 master - 0 1616754504000 0 connected
1f2bc068c7ccc9e408161bd51b695a9a47b890b2 127.0.0.1:7003@17003 slave a138f48fe038b93ea2e186e7a5962fb1fa6e34fa 0 1616754504551 3 connected
5b4e4be56158cf6103ffa3035024a8d820337973 127.0.0.1:7001@17001 master - 0 1616754505584 2 connected 5461-10922
a138f48fe038b93ea2e186e7a5962fb1fa6e34fa 127.0.0.1:7002@17002 master - 0 1616754505000 3 connected 10923-16383
71e078dab649166dcbbcec51520742bc7a5c1992 127.0.0.1:7005@17005 slave 5b4e4be56158cf6103ffa3035024a8d820337973 0 1616754505584 2 connected
f224ecabedf39d1fffb34fb6c1683f8252f3b7dc 127.0.0.1:7000@17000 myself,master - 0 1616754502000 1 connected 0-5460
04d71d5eb200353713da475c5c4f0a4253295aa4 127.0.0.1:7004@17004 slave f224ecabedf39d1fffb34fb6c1683f8252f3b7dc 0 1616754505896 1 connected
我们在上一步中添加的主分片的端口是 7006
,我们可以在第一行看到它。它的 id 是 46a768cfeadb9d2aee91ddd882433a1798f53271
。
生成的命令是
$ redis-cli -p 7000 --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 46a768cfeadb9d2aee91ddd882433a1798f53271
标志 cluster-slave
表示分片应该以副本身份加入,而 --cluster-master-id 46a768cfeadb9d2aee91ddd882433a1798f53271
指定了它应该复制哪个主分片。
现在我们的集群有八个分片(四个主分片和四个副本分片),但是如果我们运行 cluster slots 命令,我们会看到新添加的分片没有托管任何哈希槽,因此没有数据。让我们为它们分配一些哈希槽。
$ redis-cli -p 7000 --cluster reshard 127.0.0.1:7000
我们使用命令 reshard
以及集群中任何分片的地址作为参数。在下一步中,我们将能够选择要从中移动槽的分片以及要移动到的分片。
您将遇到的第一个问题是关于您要移动的槽的数量。如果我们总共有 16384 个槽,并且有四个主分片,让我们获取所有槽的四分之一,这样数据将均匀分布。16384 ÷ 4 是 4096,因此让我们使用这个数字。
下一个问题是关于接收分片 ID;我们要将数据移动到的主分片的 ID,我们已经了解了如何在前面的步骤中使用 cluster nodes 命令获取。
最后,我们需要输入我们要从其复制数据的分片的 ID。或者,我们可以输入“all”,分片将从所有可用主分片中移动一些哈希槽。
$ redis-cli -p 7000 --cluster reshard 127.0.0.1:7000
....
....
....
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 46a768cfeadb9d2aee91ddd882433a1798f53271
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: all
Ready to move 4096 slots.
Source nodes:
M: f224ecabedf39d1fffb34fb6c1683f8252f3b7dc 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 5b4e4be56158cf6103ffa3035024a8d820337973 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: a138f48fe038b93ea2e186e7a5962fb1fa6e34fa 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
Destination node:
M: 46a768cfeadb9d2aee91ddd882433a1798f53271 127.0.0.1:7006
slots: (0 slots) master
1 additional replica(s)
Resharding plan:
Moving slot 5461 from 5b4e4be56158cf6103ffa3035024a8d820337973
Moving slot 5462 from 5b4e4be56158cf6103ffa3035024a8d820337973
Do you want to proceed with the proposed reshard plan (yes/no)?
Moving slot 5461 from 127.0.0.1:7001 to 127.0.0.1:7006:
Moving slot 5462 from 127.0.0.1:7001 to 127.0.0.1:7006:
Moving slot 5463 from 127.0.0.1:7001 to 127.0.0.1:7006:
....
....
....
命令完成后,我们可以再次运行 cluster slots 命令,我们将看到我们的新主分片和副本分片已被分配了一些哈希槽。
$ redis-cli -p 7000 cluster slots