【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
相关文章
|
6天前
|
应用服务中间件 Docker 容器
docker应用部署---Tomcat的部署配置
这篇文章介绍了如何使用Docker部署Tomcat服务器,包括搜索和拉取Tomcat镜像、创建容器并设置端口映射和目录映射,以及如何创建一个HTML页面并使用外部机器访问Tomcat服务器。
docker应用部署---Tomcat的部署配置
|
6天前
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置
|
6天前
|
应用服务中间件 nginx Docker
docker应用部署---nginx部署的配置
这篇文章介绍了如何使用Docker部署Nginx服务器,包括搜索和拉取Nginx镜像、创建容器并设置端口映射和目录映射,以及如何创建一个测试页面并使用外部机器访问Nginx服务器。
|
1月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
1月前
|
Linux Docker Windows
Docker配置https证书案例
本文介绍了如何为Docker的Harbor服务配置HTTPS证书,包括安装Docker和Harbor、修改配置文件以使用证书、生成自签名证书、配置证书以及验证配置的步骤。
35 2
Docker配置https证书案例
|
2月前
|
缓存 Serverless Docker
函数计算产品使用问题之怎么修改Docker守护进程配置
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
jenkins Java 持续交付
jenkins学习笔记之十九:Docker安装jenkins master及动、静态配置slave
jenkins学习笔记之十九:Docker安装jenkins master及动、静态配置slave
|
存储 监控 API
业务运维如何做?Docker集群、监控来帮忙
在2017游戏行业全球同服和安全攻防技术沙龙上,来自心动网络的吴涵分享了《浅谈Docker业务运维》。他主要从运维职责(部署阶段、运行阶段)、潜在的问题、选择Docker的原因、Docker集群、Docker监控、Docker未来六个方面以运维人员的角度分享了Docker的使用经验。
4219 0
|
14天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
12天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
192 69
下一篇
无影云桌面