基于哈希槽实现
在 Docker 中创建 6 个 Redis 的容器实例.
格式如下:
docker run -d --name=redis-node1 \
--net host --privileged=true \
-v /data/redis/share/redis-node-1:/data \
redis:6.0.8 --cluster-enabled yes \
--appendonly yes --port 6381
创建好容器后随便进入其中之一, 调用如下命令为这6台容器构建集群关系
redis-cli --cluster create \
ip地址:6381 \
ip地址:6382 \
ip地址:6383 \
ip地址:6384 \
ip地址:6385 \
ip地址:6386 \
--cluster-replicas 1
会智能化分配, 在决定好分配方案后, 没有问题输入yes即可.
搭建好后, 可调用如下命令查看集群状态
redis-cli --cluster check ip:6381
此处的6381填写其他结点端口也可以, 这个6381相当于是一个定位, 通过这个端口找到其所在的集群
在上文搭建的集群时3主3从集群, 现在希望扩容为4主4从集群
这就需要再创建两个结点, 我这里将其端口设置为6387、6388
第一步:将6387作为主节点加入到集群
进入redis容器实例
调用如下命令
redis-cli --cluster add-node ip:6387 \
ip:6381
此时638虽加入结点, 但还没有槽位
第二步: 重新分配槽位
redis-cli --cluster reshard 192.168.35.131:6381
输入完命令后会问你三个问题:
① 每个分配多少个槽位?
因为 4 个主节点, 采用 AA 分配, 所以是 16384/4=4096个
② 分配给机器的ID?
此处填写6387结点的ID
③ 从哪台机器上分配给6387?
此处填写 all
这里的分配模式是, 从其余结点上截取一些槽位分配给6387, 这样的好处就在于不用像以前一样, 每次扩缩容都需要重新洗牌, 极大的减少成本.
第三步: 为主节点6387添加从结点6388
这里直接调用如下命令即可
redis-cli --cluster add-node ip:要添加的slave端口(6388) \
ip:添加到的master端口(6387) \
--cluster-slave --cluster-master-id 新主节点ID(6387的ID)
此处以删除6387与6388为例子, 将6387持有的结点平均分配回其他结点
嫌平均分配比较麻烦, 也可以直接分配给一个结点
第一步: 从集群中先将从结点6388删除
redis-cli --cluster del-node ip:从机端口 从机节点ID
第二步: 将6387的槽位分配给其他结点
6387 目前持有的槽位是4096
分配给其他结点的槽位可以是 1365 + 1366 +1365
在 Redis 容器实例中调用如下命令
redis-cli --cluster reshard ip:6381
问题:
① 分配多少个槽位
1365
② 接收槽位的ID
此处填写6381的ID
③ 分配模式
输入6387的ID
done
处理好后, 按照此方法处理分配给其余两个master结点
都分配好后, 查看集群信息, 看是否将6387的槽位都分配出去了
第三步: 删除6387结点
redis-cli --cluster del-node ip:端口 6387的结点id
建立Redis集群容器实例
docker run -d --name=redis-node1 \
--net host --privileged=true \
-v /data/redis/share/redis-node-1:/data \
redis:6.0.8 --cluster-enabled yes \
--appendonly yes --port 6381
搭建集群
redis-cli --cluster create \
ip地址:6381 \
ip地址:6382 \
ip地址:6383 \
ip地址:6384 \
ip地址:6385 \
ip地址:6386 \
--cluster-replicas 1
查看集群信息
redis-cli --cluster check ip:端口
将容器实例作为master结点加入已有集群
redis-cli --cluster add-node 192.168.35.131:6387 \
192.168.35.131:6381
redis-cli --cluster reshard 192.168.35.131:6381
为某一主节点添加从节点(也是将某结点作为从节点加入集群)
redis-cli --cluster add-node ip:要添加的slave端口(6388) \
ip:添加到的master端口(6387) \
--cluster-slave --cluster-master-id 新主节点ID(6387的ID)