【Docker】Redis集群扩缩容配置

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Docker】Redis集群扩缩容配置

3主3从搭建

使用docker能快速的扩缩容redis集群。

使用docker创建3主3从的Redis集群配置首先要求先从docker的仓库中下载redis的镜像。

使用如下命令拉取redis镜像文件。

docker pull redis

redis镜像拉取完毕之后,就可以快速的开启多个redis容器了,而想要配置3主3从的redis集群首先就需要先创建6个redis容器。

使用如下命令可以快速创建完毕6个redis容器

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:latest --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:latest --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:latest --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:latest --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:latest --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:latest --cluster-enabled yes --appendonly yes --port 6386

创建完毕redis容器之后,进入其中某一个redis容器之中,并且进行集群的构建。

redis-cli --cluster create 192.168.146.119:6381 192.168.146.119:6382 192.168.146.119:6383 192.168.146.119:6384 192.168.146.119:6385 192.168.146.119:6386 --cluster-replicas 1

如果显示如上内容说明集群主从配置已经配置成功了,3主3从已经配置成功了。

然后使用如下命令就可以查看集群状态了

redis-cli -p 6381
cluster info

使用cluster nodes就可以查看每个集群的哈希槽的分配范围以及主从关系。

其中第一个UUID是该redis的id,第一个UUID就是从机对应的主机的id。

例如6385端口的redis的主机就是37ff也就是6383端口对应的redis。

6381----》6386

6382----》6384

6383----》6385

集群数据插入错误的解决

在按照如上方式配置完毕3主3从之后,向redis插入数据的时候就会经过哈希槽了,而不是直接向登录的redis客户端进行数据插入,因此登录某个客户端插入数据的时候,如果根据哈希算法分配到的redis节点不是当前登录的redis客户端,那么就会报错,如下

因此必须有一个办法去解决这种情况。

而这种解决方法就是在登录客户端的时候以集群环境登录,如下

此时如果当前key对应的槽位不为当前的redis客户端,那么这个key就会自动被路由到对应的槽位对应的redis中去,因此我们当前登录的redis客户端将无法查询到被重定向到其他redis客户端的数据,情况如下

登录到6382对应的redis之后就可以发现我在6381端口的redis中插入的数据被重定向到6382了,当然,只要你读取的key在这些redis节点中,那么查询请求也会自动重定向过去

主从容错切换迁移

使用如下命令可以查看目前集群的情况,可以分析得出每个节点的主从关系。

redis-cli --cluster check ip:端口 # 查看集群配置

而设置主从集群,首先就是为了应付大数据量的存储的同时还能防止由于redis服务器宕机导致的服务失效问题,因此主从集群要求主节点宕机之后从节点代替主节点的位置,也就是进行主从之间的迁移,让从机代替主机的位置,在没有集群模式之前,哨兵模式可以解决这个问题,主从模式虽然可以解决这个问题,但是却要求运维人员手动进行故障切换,因此集群模式合并了哨兵与主从模式的优点,会自动的进行故障迁移。

目前情况是,6381(主机)的从机是6386。因此我们需要验证6381下机之后,6386是否会变为主机,同时在6381恢复之后6381是否会变为6386的从机。

首先对6381进行下线。

docker stop redis-node-1

此时可以登录6382进行验证,来判定6386是否变为了主节点,同时判定6381下机之后6386是否保留了原有的存留在6381节点里的数据。

使用cluster nodes命令对目前集群节点进行状态查看,可以发现6386成功上位变为了master,而6381的状态为fail

之后我们重启6381

可以发现6381变为了6386的从机,6386上位成功。

之所以6386在6381上线之后会继续保持主机的位置是由于6386在得知主机下线之后被redis服务器设定了slave of noone命令,也就是6386再也不做从机了,并且redis服务器会在6381上线之后对6381发送slave of 6386的命令,因此6381一上线就是6386的从机。

主从扩容

有的时候可能3主3从的redis集群也已经不够用了,此时就需要对集群进行扩容,例如变为4主4从redis集群。

但是有一个问题就是在3主3从的时候redis的哈希槽已经分配完毕了,那么如果此时再添加一个redis主从结构,应该怎么做呢?

首先,就是先添加两台redis服务器,方法按照上面的即可

此时这两台redis服务器与原本的redis集群并没有联系。

那么就先进入新增的节点进行配置。

docker exec -it redis-node-7 bash

然后我们先将6387添加到集群中。

redis-cli --cluster add-node 192.168.146.119:6387 192.168.146.119:6381

添加完毕之后先检查一下集群状态,可以发现已经变为了四台主机

redis-cli --cluster check 192.168.146.119:6381

其中认真看可以发现新加入的节点的槽位是0,也就是还没有被分配槽位,那么此时由于这个节点没有槽位,那么无论插入什么样子的数据都不会被分配到该redis节点进行存储,因此之后我们需要对这个redis节点进行槽位的分配。

我们可以使用如下命令进行槽位的重新分配

redis-cli --cluster  reshard 192.168.146.119:6381

进行槽位的重新分配的时候,会出现提示询问要分配多少个槽位给每个的主机,此时一共又16384个,我们除以主机数4得到4096

之后会询问要接收这4096个槽位的redis的id,那么我们就输入6387对应的redis的id即可。

之后会询问选择那些redis来为新的节点提供槽位,那么我们直接选择all,让每一个原先的redis主机平均分配一点节点给新redis节点。

当然,如果你了解redis的槽位分配的话,也可以自己手动的进行槽位的分配,比较麻烦就是了。

分配完毕之后再次查看集群状态,可以发现6387已经有了三个槽位了。

槽位分配完毕之后,我们就可以把6388这个从机添加到集群中作为6387的从机了。

redis-cli --cluster add-node 192.168.146.119:6388 192.168.146.119:6387 --cluster-slave --cluster-master-id 5918d8ddce56e58c035763704fad06d7ecc1efd0

到此位置集群扩容已经完成了。

主从缩容

主从缩容的问题在于,槽位如何重新分配以及先删从节点还是先删主节点。

这里先删除从节点

redis-cli --cluster del-node 192.168.146.119:6388 33768461763aae07b412be731e2782bead0b82c

redis-cli --cluster reshard 192.168.146.119:6381

之后输入要重新分配的槽位大小,这里我们刚才新添加的节点的槽位大小为4096

第二个参数填写需要被分配这些槽位的redis的id,这里填写6386,他是一个主机

下一个参数填写需要分配出去空间的redis的id,这里填写6387,然后输入done表示确认。

此时再把6387给删除就没有问题了

redis-cli --cluster del-node 192.168.146.119:6387 5918d8ddce56e58c035763704fad06d7ecc1efd0

再次查看集群状态可以发现集群以及变为了3主3从了。


相关文章
|
2月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
207 2
kde
|
3月前
|
Kubernetes 关系型数据库 文件存储
手把手教你完成极空间 NAS Docker 镜像加速配置
本教程详细介绍了如何在极空间NAS上配置轩辕镜像加速器,以提升Docker镜像的下载速度与稳定性。内容涵盖账号注册、网络确认、加速器设置及验证方法,并提供常见问题解决方案,帮助用户高效完成容器化应用部署。
kde
969 1
|
13天前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
kde
|
3月前
|
文件存储 数据安全/隐私保护 开发者
群晖NAS Docker镜像源加速配置教程
本教程介绍了群晖NAS用户如何通过配置轩辕镜像加速服务提升Docker镜像拉取速度。内容包括配置前准备、详细设置步骤及日常使用说明,帮助用户快速完成配置并享受高效稳定的镜像下载体验。
kde
1990 59
kde
|
Docker 容器 文件存储
飞牛fnOS Docker镜像加速配置全攻略
本文介绍了如何在飞牛fnOS中配置Docker镜像加速服务,通过设置轩辕镜像仓库加速器,提升镜像拉取速度与稳定性。内容涵盖配置前准备、加速源设置、首选加速源调整及使用指南,帮助用户高效完成镜像操作。
kde
1187 56
|
2月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
3月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
100 5
|
3月前
|
Java 分布式数据库 Docker
使用Docker配置并连接HBase的Java API
本流程概要的解释了如何在Docker上配置并启动HBase服务,并通过Java API进行连接和操作表,不涉及具体的业务逻辑处理和数据模型设计,这些因应用而异需由开发者根据实际需求进行实现。
166 13
|
3月前
|
NoSQL 安全 Linux
设置Redis在CentOS7上的自启动配置
这些步骤总结了在CentOS 7系统上设置Redis服务自启动的过程。这些命令提供了一个直接且明了的方式,确保Redis作为关键组件在系统启动时能自动运行,保障了依赖于Redis服务的应用的稳定性和可用性。
393 9