美文网首页从零学Java笔录凯哥Java-工作总结
Docker高级篇:实战Redis集群!从3主3从变为4主4从

Docker高级篇:实战Redis集群!从3主3从变为4主4从

作者: 凯哥Java | 来源:发表于2022-12-21 10:03 被阅读0次

    通过前面两篇,我们学会了三主三从的Redis集群搭建及主从容错切换迁移,随着业务增加,可能会有主从扩容的,所以,本文我们来实战主从扩容

    PS本系列:《Docker学习系列》教程已经发布的内容,凯哥会在文末加上。

    在之前3主3从的架构,随着业务的增加,流量扛不住了。需要由3主3从变为4主4从。架构变化图如下:

    dd0f4dfc861a62cd60e3d25204c8b989.png

    回顾下之前3主3从槽位分配如下:

    image.png

    那么现在变成了4主4从了。多出来的这一对主从,槽位怎么分配ne?

    实战步骤

    1:新建6387、6388两个节点+新建后启动+查看是否8个节点

    命令

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-nod-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
    docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-nod-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
    </pre>

    2b5c356d74e7737955550c0609b4a56c.png

    通过docker ps 可以查看8个redis都成功

    2:进入6387容器实例内部

    命令:

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">docker exec -it redis-node-7 /bin/bash
    </pre>

    3:将新增的6387节点(空槽号)作为master节点加入原集群中

    将新机器加入集群的命令公式:

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli -cluster add-node ip:6387 ip:6381
    </pre>

    命令说明:

    add-node:加入节点

    ip:自己宿主机的实际ip

    6387:将要作为master的新增节点端口

    6381:就是原来集群节点的领路人。相当于是6387拜了6381的码头了。从而找到了组织加入了集群

    比如我们需要将6387这台redis作为master加入集群中。

    根据命令公式,替换成我们自己的宿主机ip:192.168.50.128

    所以本次将6387加入集群的命令为:

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli --cluster add-node 192.168.50.128:6387 192.168.50.128:6381
    </pre>

    image.png

    new node added correctly.

    4:检查集群情况第1次

    使用cluster chk命令。

    进入之前任意三个master容器后执行命令:

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli --cluster check 192.168.50.128:6381
    </pre>

    image.png

    我们可以看到,6387已经作为master加入集群了。其对应的从节点是0个。

    image.png

    5:重新分配槽号

    新命令,公式:

    <pre class="brush:as3;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli --cluster reshard ip:端口
    </pre>

    参数说明:

    --cluster reshard :重新hash分配槽位

    ip:宿主机的ip(对应本次实战凯哥宿主机的ip:192.168.50.128)

    端口:集群的领路人的端口(对应本次实战凯哥宿主机的ip:6381)

    实战命令:

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli --cluster reshard 192.168.50.128:6381
    </pre>

    870c70c8879b5e79138ffe1e3312a043.png d8bcac9822800a3d0ad8d430c35e6a2e.png

    我们可以看到,询问我们打算怎么重新分配?

    我们来算下:16384/4=4096.所以,我们就写4096

    输入4096后,又询问了:

    145e8430166659da83dad3f6d43ff3b2.png

    这4096准备分配给node id呢?

    请注意,这里只能分配给新加入的节点的id.也就是本次案例中6387对应的node节点

    image.png

    接着又询问了

    c6a875582c5f51cd4eb632fe05233b11.png

    我们输入all.

    因为16384/master机器数量=4096

    输入yes后,所有槽位就会重新分配了。

    重新分配需要等待一段时间。耐心等待。

    6:检查集群情况第2次

    命令:

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli --cluster check 192.168.50.128:6381
    </pre>

    fd7bd5c0b47d23ac5ceee5e2f8261454.png

    我们可以发现了6387的槽位不是连续的。而是由三段槽位组成的。

    所以,我们可以知道,新加入的master节点,是从原来所有节点都给出一些槽位,最终使得新master节点达到预设的槽位的。

    为什么要这么设计呢?

    为什么6387是3个新区间呢?原来三个主节点还是连续的?

    因为重新分配的成本太高了。所以前3个主节点各自匀出一部分,从6381/6382/6383三个旧节点分别匀出1364个槽位给了新加入master节点6387了。

    7:为主节点6387分配从节点6388

    新命令:

    redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点id

    命令参数说明:

    ip:宿主机的ip。对应本次案例就是:192.168.50.128

    新slave端口:对应本次案例就是6388

    新master端口:对应本次案例就是6387

    新主机节点id:可以通过cluster check 命令查看

    所以本次案例的命令为:

    <pre class="brush:as3;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli --cluster add-node 192.168.50.128:6388 192.168.50.128:6387 --cluster-slave --cluster-master-id 2b0751e59cdf0ae0f74be7ab74981ab41e37e372
    </pre>

    image.png

    8:检查集群情况第3次

    <pre class="brush:bash;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">redis-cli --cluster check 192.168.50.128:6381
    </pre>

    image.png

    所以最终4主4从的架构及槽号如下图:

    image.png

    结束语

    如操作有问题欢迎去 我的 个人博客(www.kaigejava.com)留言或者 微信公众号(凯哥Java)留言交流哦。

    本系列教程直通车

    直通车,本系列教程已发布文章,快速到达,《Docker学习系列》教程已经发布的内容如下:

    【图文教程】Windows11下安装Docker Desktop

    【填坑】在windows系统下安装Docker Desktop后迁移镜像位置

    【Docker学习系列】Docker学习1-docker安装

    【Docker学习系列】Docker学习2-docker设置镜像加速器

    【Docker学习系列】Docker学习3-docker的run命令干了什么?docker为什么比虚拟机快?

    【Docker学习系列】Docker学习2-常用命令之启动命令和镜像命令

    【Docker学习系列】Docker学习系列3:常用命令之容器命令

    【Docker学习系列】Docker学习4-常用命令之重要的容器命令

    【Docker教程系列】Docker学习5-Docker镜像理解

    【Docker教程系列】Docker学习6-Docker镜像commit操作案例

    【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云

    【Docker学习教程系列】8-如何将本地的Docker镜像发布到私服?

    「Docker学习系列教程」9-Docker容器数据卷介绍

    「Docker学习系列教程」10-Docker容器数据卷案例

    Docker学习11-Docker常规方式安装软件

    「Docker学习系列教程」基础篇小总结及高级篇预告

    docker高级篇1-dockeran安装mysql主从复制

    docker高级篇2-分布式存储之三种算法

    docker高级篇第二章-分布式存储之实战案例:3主3从redis集群扩容配置

    docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例

    【Docker学习教程系列汇总】笔记及遇到问题解决文章

    相关文章

      网友评论

        本文标题:Docker高级篇:实战Redis集群!从3主3从变为4主4从

        本文链接:https://www.haomeiwen.com/subject/usiuqdtx.html