首页 > 数据库 >docker 安装 redis 集群

docker 安装 redis 集群

时间:2024-09-06 16:16:59浏览次数:3  
标签:cli -- redis cluster 集群 docker data 节点

集群搭建(三主三从)

集群搭建

集群中的节点都需要打开两个 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 6381
    
    docker 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

标签:cli,--,redis,cluster,集群,docker,data,节点
From: https://www.cnblogs.com/plumsun/p/18400132

相关文章

  • 【K8s】专题十三:Kubernetes 容器运行时之 Docker 与 Containerd 详解
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口Linux专栏 | Docker专栏 | Kubernetes专栏往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决方法【Docker】(全网首发)Kyli......
  • Docker的镜像设置
    一、启动hello-world二、查看镜像dockerimages三、设置docker镜像地址打开阿里云网址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrorsbash执行这段命令sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json<<-'EOF'{"registry-mirrors":[&qu......
  • 828华为云征文 | 在Flexus X实例上部署Portainer,实现Docker可视化管理
    Docker轻量级可视化工具Portainer需要了解本文章主要讲述在华为云FlexusX实例上通过docker技术搭建开源的容器管理平台,使用的WebUI界面来简化和优化容器及集群的管理和监控选择合适的云服务器:本文采用的是华为云服务器FlexusX实例(推荐使用)连接方式:本文通过本......
  • 【随手记录】关于docker启动后一直处于Active: activating (start)状态
    docker部署之后systemctlstartdocker启动服务,服务状态一直处于Active:activating(start)状态,使用journalctl-n50|grepdocker查看日志,第一次发现有错误信息:warningmsg="couldnotchangegroup/var/run/docker.socktodocker:groupdockernotfound"这个错误表......
  • [Docker] Run langs on Docker
    Node.jsonContainersSonowwhatifwewantedtorunacontainerthathasNode.jsinit?ThedefaultUbuntucontainerdoesn'thaveNode.jsinstalled.Let'suseadifferentcontainer!dockerrun-itnode:20Theversionhereiswe'reusingi......
  • [Docker] Docker Images with Docker
    Soit'smucheasiertodowhatwedidwithDocker.Runthiscommand:dockerrun--interactive--ttyalpine:3.19.1#or,tobeshorter:dockerrun-italpine:3.19.1Abiteasiertoremember,right?ThiswilldropyouintoaAlpineashshellinsideof......
  • Docker 容器技术:简化 MySQL 主从复制部署与优化
    文章目录前言一、为什么基于Docker搭建?二、利用Docker搭建主从服务器2.1配置Master(主)2.2配置Slave(从)2.3链接Master(主)和Slave(从)2.4测试主从复制三、常见问题3.1什么时候用读写分离?3.2MySQL主从复制原理3.3解决主从复制延迟有几种常见的方法?3.4造成mysql同步......
  • debian11 申通 无感考勤 mysql postgresql nacos集群
     echo"nameserver114.114.114.114nameserver8.8.8.8">/etc/resolv.conf echo"debhttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdeb-srchttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdebhttps://......
  • grafana/K6 的 Docker 镜像pull另存为tar的文件
    因国内环境限制,如果直接pull grafana/K6的镜像会失败,可通过以下方式pull配置方式1:临时使用直接使用,直接拿镜像域名拼接上官方镜像名,例如要拉去镜像dockerpullloadimpact/k6,可以用下面写法dockerpulldocker.registry.cyou/loadimpact/k6配置方式2:长久有效修改文件 /......
  • 如何查看Linux系统下Redis连接池是否已满
    Redis作为一个高性能的内存数据库,广泛应用于各类高并发场景中。然而,在使用Redis时,连接池的管理至关重要,特别是在高并发应用中,Redis的连接池是否已满会直接影响系统的性能和稳定性。因此,了解如何在Linux系统中监控Redis连接池的状态,尤其是在连接池接近或达到上限时,显得尤为重要。本......