文章目录
Redis集群中节点的增删
1、Redis集群的数据分片原理
Redis集群引入了哈希槽的概念,一个Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。
集群的每个节点负责一部分哈希槽。
(1)添加节点
如果想添加新的节点,则需要从原有节点中获得部分哈希槽分到新节点上。
(2)删除节点
如果想删除现有节点,则需要将想删除节点上的哈希槽移到其他现有节点上,再删除没有分配哈希槽的节点。
(3)这样数据分片的益处
将哈希槽从一个节点转移到另一个节点的过程并不会停止服务,所以添加和删除节点,或改变节点中哈希槽的数量,都不会造成Redis集群不可用。
2、如何增加Redis集群中的节点
(1)配置新节点的目录
创建两个新的目录,在目录中放入写好的配置文件,改一下配置文件的端口即可。
| 命令 | 功能 |
|---|---|
| mkdir 700{7…8} | 创建新节点目录,一个主节点,一个从节点 |
| cd 700x | 分别进入到目录中 |
| cp …/7001/redis.conf . | 将redis.conf文件复制过来,只改端口即可 |
(2)开启配置的两个实例
进入到目录中打开两个新的实例,并且查看,此时实例虽然已经开始运行,但是并没有真正的加入到集群中。
| 命令 | 功能 |
|---|---|
| cd 700x | 分别进入到目录中 |
| redis-server redis.conf | 开启实例 |
| ps ax | 查看实例是否开启 |
(3)将新主节点加入到集群中
添加7007节点到集群中,此处的add-node意为添加节点,127.0.0.1:7007为想要添加的实例地址和端口,最后一个参数为集群中已经存在的任意一个实例地址和其端口。
添加成功后可查看节点的信息,含有节点的唯一id、哈希槽分配情况等等,此时加入的新主节点还没有分配哈希槽,所以没有哈希槽的分配信息。
| 命令 | 功能 |
|---|---|
| redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 | 添加节点7007到集群中 |
| redis-cli -c -p 7002 | 进入到任意一个节点中 |
| cluster nodes | 查看集群的节点信息,此时可看到节点7007添加成功,但无分配的哈希槽 |
(4)给新主节点分配哈希槽
| 命令 | 功能 |
|---|---|
| redis-cli --cluster reshard 127.0.0.1:7001 | 进入该集群的哈希槽的分配页面 |
此时询问我们想要移动多少哈希槽,我这里写了150
此处询问想要接收这些哈希槽的节点ID,在页面中可找到7007节点对ID,复制即可
提供这150个哈希槽的节点是哪些?此处为写了all,由所有节点一起提供这150个哈希槽
是否接受这个分片的方案?这里选了yes。
这时再查看集群节点信息,发现7007节点有哈希槽分配信息了
(5)将从节点加入到集群中
| 命令 | 功能 |
|---|---|
| redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 | 先将7008节点加入到集群中 |
| redis-cli -c -p 7008 | 进入到该节点中 |
| cluster replicate 7007的节点ID | 指定7008节点为7007节点的从节点 |
| cluster nodes | 查看集群节点信息,7008节点成功添加为7007的从节点 |
3、如何删除Redis集群中的节点
这里我想要删除的节点是7007和7008节点,删除时的顺序应该为:先删除从节点,再删除主节点。
(1)删除从节点
| 命令 | 功能 |
|---|---|
| redis-cli -c -p 7002 | 登陆现有任意节点 |
| cluster nodes | 查看节点信息,此时节点7008是存在的 |
| redis-cli --cluster del-node 127.0.0.1:7008 7008节点ID | 将该节点从集群中删除 |
| redis-cli -c -p 7002 | 登陆现有任意节点 |
| cluster nodes | 查看节点信息,确认节点7008已经删除 |
(2)删除主节点
<1>转移主节点分配的哈希槽
在删除主节点之前,为了防止数据的丢失以及集群功能的正常,先应把主节点所分配的哈希槽转移到其他主节点上。在移动哈希槽时,要注意哈希槽从0开始计数,所以移动时要输入的数字比添加时少1。
redis-cli --cluster reshard 127.0.0.1:7001
想移动多少个哈希槽?这里我输入149。
希望哪个节点ID接收?某一个主节点就可以,这里我选了节点7001的ID。
希望谁提供这些哈希槽?我写了7007的节点ID,然后输入done,表示已经没有其他节点ID需要输入。
使用cluster nodes查看时,节点7007已经没有哈希槽的分配了,而节点7001多了哈希槽的分配,已经在信息中列出。
<2>删除没有哈希槽的主节点
| 命令 | 功能 |
|---|---|
| redis-cli --cluster del-node 127.0.0.1:7007 7007的节点ID | 删除该主节点 |
| redis-cli -c -p 7002 | 登陆现有任意节点 |
| cluster nodes | 查看节点信息,确认节点7007已经删除 |