【Docker】Redis集群扩缩容配置

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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从了。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
22天前
|
网络安全 Docker 容器
|
22天前
|
安全 Docker 容器
|
25天前
|
网络安全 Docker 容器
|
22天前
|
网络安全 数据安全/隐私保护 Docker
|
1月前
|
运维 监控 数据安全/隐私保护
管理 Docker Swarm 集群注意事项
【10月更文挑战第7天】
34 3
|
1月前
|
负载均衡 监控 安全
如何管理 Docker Swarm 集群和节点
【10月更文挑战第7天】
42 3
|
15天前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
26天前
|
存储 NoSQL Redis
Redis 配置
10月更文挑战第14天
22 1
|
5天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
|
5天前
|
调度 Docker 容器
【赵渝强老师】Docker Swarm集群的体系架构
Docker Swarm自1.12.0版本起集成至Docker引擎,无需单独安装。它内置服务发现功能,支持跨多服务器或宿主机创建容器,形成集群提供服务。相比之下,Docker Compose仅限于单个宿主机。Docker Swarm采用主从架构,Swarm Manager负责管理和调度集群中的容器资源,用户通过其接口发送指令,Swarm Node根据指令创建容器运行应用。