docker 安装 redis 集群

news/2024/12/31 6:39:16/文章来源:https://www.cnblogs.com/plumsun/p/18400132

集群搭建(三主三从)

集群搭建

集群中的节点都需要打开两个 TCP 连接。一个连接用于正常的给 Client 提供服务,比如 6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,例如:redis的端口为 6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379

16379 端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权等等。

  1. 运行节点

    docker run -d --net host --name redis-node1 -p 16381:16381 --privileged=true -v /data/redis/share/node1/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6381docker run -d --net host --name redis-node2 -p 16382:16382 --privileged=true -v /data/redis/share/node2/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6382 docker run -d --net host --name redis-node3 -p 16383:16383 --privileged=true -v /data/redis/share/node3/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6383 docker run -d --net host --name redis-node4 -p 16384:16384 --privileged=true -v /data/redis/share/node4/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6384 docker run -d --net host --name redis-node5 -p 16385:16385 --privileged=true -v /data/redis/share/node5/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6385 docker run -d --net host --name redis-node6 -p 16386:16386 --privileged=true -v /data/redis/share/node6/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6386 
    

    --net host:使用宿主的ip和端口

    -p 16386:16386:集群总线端口

    --port:redis占用端口

    注意:一定要开启端口

  2. 进入 redis 节点,创建集群关系,redis-cli --cluster create

    [root@VM-4-7-centos ~]# docker exec -it redis-node1 bash
    root@VM-4-7-centos:/data# redis-cli --cluster create 10.0.4.7:6381 10.0.4.7:6382 10.0.4.7:6383 10.0.4.7:6384 10.0.4.7:6385 10.0.4.7:6386 --cluster-replicas 1
    

    --cluster-replicas:副本数量

    2024-09-06_120531
  3. 查看集群状况,redis-cli --cluster check 10.0.4.7:6381

    image-20240906121137399

    查看集群信息命令很多,以下是常用命令

    需要进入redis内部:

    • cluster nodes
    • cluster info

    不需要进入 redis 内部:

    • redis-cli --cluster check redis机器ip:redis端口
  4. 插入数据测试

    image-20240906121315390

    (error) MOVED 12706 10.0.4.7:6383

    正常单机连接的情况下,插入数据可能会出现以上错误

    k1 经过哈希运算得到的槽为12706,而redis-node只维护了0-5460的槽,路由不到 12706 槽位,所以插入失败

    解决方法:

    使用集群连接状态:redis-cli -p 6381 -c

    -c:开启集群模式

    -c:Enable cluster mode (follow -ASK and -MOVED redirections)

    • ask:临时重定向,后续操作依然在旧节点。
    • moved:永久重定向,后续操作在新节点。
    [root@VM-4-7-centos ~]# docker exec -it redis-node1 bash
    root@VM-4-7-centos:/data# redis-cli -p 6381 -c
    
    image-20240906121633929

扩容

通过 docker 新建两台 redis 机器,一主一从;主机端口:6387,从机端口:6388。

  1. 创建机器,注意端口开放。

    docker run -d --net host --name redis-node7 -p 16387:16387 --privileged=true -v /data/redis/share/node7/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6387
    docker run -d --net host --name redis-node8 -p 16388:16388 --privileged=true -v /data/redis/share/node8/data:/data redis:latest --cluster-enabled yes --appendonly yes --port 6388 
    
  2. 添加主机,redis-cli --cluster add-node new_host:new_port existing_host:existing_port。这个操作会将要加入的那台机器添加进集群,并设置为 master 机器。

    同时添加主从,前面的机器为从机,后面的为主机:

    redis-cli --cluster add-node new_slave_host:new_slave_port new_master_host:new_master_port existing_host:existing_port

    添加从机指定主机id:

    redis-cli --cluster add-node new_slave_host:new_slave_port existing_host:existing_port --cluster-slave --cluster-master-id <id>

    redis-cli --cluster add-node 10.0.4.7:6387 10.0.4.7:6381
    
    image-20240906121934796
  3. 查看集群状况

    redis-cli --cluster check 10.0.4.7:6381
    
    image-20240906122148147
  4. 添加从机

    # --cluster-master-id <arg>:arg 所属主机id
    redis-cli --cluster add-node 10.0.4.7:6388 10.0.4.7:6381 --cluster-slave --cluster-master-id e244827efe2bf120e738567bf5d4cbe7a61e320e
    
    image-20240906122631518
  5. 查询当前集群状况,redis-cli --cluster check 10.0.4.7:6381

    image-20240906123122444
  6. 重新分配槽号,redis-cli --cluster reshard 10.0.4.7:6381

    目前只能手动指定槽数分配,会从其余 master 节点中分配一些槽位到新的节点,如果加入新节点,redis 不能对重新平均分配集群的哈希槽。redis 官网参考

    This allows to build some automatism if you are likely to reshard often, however currently there is no way for redis-cli to automatically rebalance the cluster checking the distribution of keys across the cluster nodes and intelligently moving slots as needed. This feature will be added in the future.

    如果您可能经常重新分片,这允许构建一些自动化,但是目前 redis-cli 无法自动重新平衡集群,检查集群节点之间的密钥分配并根据需要智能移动插槽。此功能将在未来添加。

    image-20240906124958452
    • How many slots do you want to move (from 1 to 16384)?,设置新的节点占用多少个槽位。

    • What is the receiving node ID?,这些槽位分配给那个节点。

    • Please enter all the source node IDs.Type 'all' to use all the nodes as source nodes for the hash slots.

      要从哪些节点获取这些槽位,all:所有 master 节点。

    image-20240906125421371
  7. 查看集群状况,redis-cli --cluster check 10.0.4.7:6381。我这边因为分配了两次,所以 6387 端口的 redis 拥有 8192 个槽位。

    image-20240906125722599
  8. 查看槽位分配的均衡性redis-cli --cluster rebalance 10.0.4.7:6381

    如果当前集群中槽位分配不均匀,rebalance 命令会触发重新分配,将多余的槽位分配给其余 master 节点。因为我上面分配了两次槽位,6387节点槽位为 8192个。

    rebalance之后槽位 = 8192 - 1366 -1365 - 1365 = 4096。(正好和 16384 / 4 相等)

    2024-09-06_130307

    再次执行,节点负责的槽数据差异在2%以内,集群槽位分配是均匀的。

    image-20240906130835682
  9. 再看下集群状况,每个 master 节点都分配了 4096 个槽位。
    image-20240906131055151

缩容

流程:先删除从节点 6388 -> 重新分配槽位 -> 删除主节点 6387

  1. 删除从节点 6388,redis-cli --cluster del-node 节点ip:端口 节点id

    redis-cli --cluster del-node 10.0.4.7:6388 ba4f57a9d38e6b3c52abb4c1008243e2a2fe130e
    

    这里的ip、端口、id都是被删除节点的
    image

    看下集群状态,6388节点已经没了

    image-20240906135218201
  2. 分配槽位,可以将 6387 节点的槽位都分给某一台机器,也可以平均分配,这里我都分配给 6381节点。(如果不满意也可以在 6387 节点删除完后通过 rabalance命令自动分配槽位)

    不能直接删除 master 节点,一定要先重新分配,附上失败图

    image-20240906135744331
    redis-cli --cluster reshard 10.0.4.7:6381
    
    image-20240906135859194

    看下集群状态

    image-20240906140119058

    注意此时 6387 节点退化成了 slave节点,并且所属的 master节点为 6381

  3. 删除 6387 节点

    redis-cli --cluster del-node 10.0.4.7:6387 e244827efe2bf120e738567bf5d4cbe7a61e320e
    
    image-20240906140302569

    看下集群状态,6381 节点下的从节点又变成了 1 个

    image-20240906140340927
  4. 自动分配槽位,redis-cli --cluster rebalance 10.0.4.7:6381,附上集群状态图(3个 master 节点平分 16384 个槽位):
    image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/793112.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-plus 倒计时el-countdown添加背景色

效果图: 实现方法:<el-countdown:time="countdownTime":formatter="formatter"/><div v-html="formattedTime"></div>formatter(time) {const days = Math.floor(time / 1000 / 60 / 60 / 24); // 计算天数const hours = Ma…

echarts 加一个圆环图带阴影

这里面一共三个圆, 最外层是一个半透明的var chartDomymr = document.getElementById(container-ymr);var myChartymr = echarts.init(chartDomymr);var optionymr;var optionymr_data = [{value: 332, name: 类型A, color: new echarts.graphic.LinearGradient(0, 0, 0, 1,[{…

echarts圆环图

外环的渐变是内环的阴影var chartDom2 = document.getElementById(container-workcode2);var myChart2 = echarts.init(chartDom2);var option2;option2 = {tooltip: {trigger: item},legend: {orient: vertical,top: 0%,left: center},title: {text: 60%,subtext: "完成率…

MacTalk 测评通义灵码,如何实现“微信表情”小功能?

目前,通义灵码已经在阿里云、哈啰集团、一汽集团、中华财险等企业落地,下载量超 500 万,在国际权威机构 Gartner 测评中,拿到国内 AI 编码工具最高成绩。作者:池建强,墨问西东创始人 前段时间,我写了篇墨问研发团队放弃 GitHub Copilot 的文章,没想到留言区一些读者推荐…

记录BUUCTF 中 的一道hook掉函数地址的题目

题目 [Zer0pts2020]easy strcmp1 https://files.buuoj.cn/files/2961ba55f464e750aca703838dfca234/easy_strcmp_e1a6208fde4f52fd0c653c0b7e8ff614.tar.gz 刚开始在main函数中发现if ( !strcmp(a2[1], "zer0pts{********CENSORED********}") )puts("Correct!&q…

[C++ Daily] 虚继承与虚析构带来的变化

虚继承 在菱形继承中,若 Student 和 Teacher 继承于 Person, TS 继承于 Student 和 Teacher,则构造 TS 时会调用两次 Person 的 Construct 和 Destruct 函数,若为虚继承,则不会出现上述问题(此类问题主要解决继承带来的多次非法delete) 原继承:结果:虚继承:结果:虚析构 父类指针…

ARP详细介绍

ARP详细介绍,包括动态ARP(基本和“常用协议”博文内容一致)、静态ARP、免费ARP、路由式ARP代理ARP详细介绍 地址解析协议,根据IP地址获取MAC地址,还能检测地址是否有重复 动态ARP 广播ARP报文寻找目标IP的MAC地址主机1通过发送ARP Request报文获取主机2的MAC地址 ​ 由于不…

一个网络安全情报聚合网站《魔盒安全情报》

《魔盒》 一款专为网络安全领域提供服务的多端情报系统。 实时更新安全情报。内容包括威胁情报、数据泄露、漏洞预警、军事情报、安全博客情报等。地址网页端:https://mgb.abyssdawn.com/tg 推送频道 频道地址:mgb_sec_thread感谢 感谢以下大佬收集的安全订阅源https://githu…

mipi屏调试时序问题

mipi屏的时序大同小异,一般都跟以下差不多: 屏参配置如下:&dsi0 {status = "disabled";//rockchip,lane-rate = <1000>;dsi0_panel: panel@0 {status = "okay";compatible = "simple-panel-dsi";reg = <0>;backlight = <&…

java编译中出现 无效的目标发行版:17

java maven 编译中出现 无效的目标发行版:17 解决方法: 将 pom.xml 中的 <maven.compiler.release>17</maven.compiler.release>这段换成<maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.…

火影新版控制中心安装教程

1. 第一步卸载原有控制中心 搜索框搜索控制面板找到卸载程序点击搜索控制中心右键卸载卸载完选择YES重启 2、官网下载控制中心的压缩包 火影官网驱动下载 https://www.firebat.com.cn/index/serve/drive 根据自己是什么机器选择 (t6ax也是t6系,t6系的都选t6ad,处理器是什么就…

记录 ThreadPoolExecutor任务队列放入任务的方式

众所周知,ThreadPoolExecutor内部任务队列属性类型定义为:private final BlockingQueue workQueue; 而其有三种提交任务方式:add、put和offer,好奇其内部用的哪个,又不想查资料,故而跳到源码内部一看。结果如下:三种提交任务方式:put(E element):将指定元素插入队列,…