首页 > 数据库 >docker分布式存储之哈希槽3主3从redis集群配置+主从扩容缩容

docker分布式存储之哈希槽3主3从redis集群配置+主从扩容缩容

时间:2023-07-17 13:37:35浏览次数:43  
标签:缩容 node -- redis 192.168 cluster 哈希 节点

创建开启六台redis容器

systemctl restart docker 
docker pull redis:6.0.8      根据需求下载redis的镜像版本

配置3主3从  开启六台redis容器  分别用node-1 ~ node-6 来区分

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

--net host           	 使用宿主机的IP和端口(默认)
--cluster-enabled yes    表示是否打开redis集群
--privileged=true	 获取宿主机root权限
--appendonly yes	 开启持久化

启动结果 如图所示

image.png

进入 node-1 为6台机器构建集群关系(分配哈希槽)

docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.20.128:6381 192.168.20.128:6382 192.168.20.128:6383 192.168.20.128:6384 192.168.20.128:6385 192.168.20.128:6386  --cluster-replicas 1

执行结果如下图所示 
按图中所示:M为主,S为从。即:6381~6383 (node-1~3为主,node-4~6为从)

PS:IP地址为真是宿主机的IP + 每个redis容器的端口号
redis-cli 	  	进入到redis
--cluster create 	构建集群
--cluster-replicas 1    表示为每一个 master 创建一个 slave 节点 (六台机器,1:1一个对一个)

image.png

以node-1 作为切入点 查看集群状态

redis-cli -p 6381
cluster info        查看集群信息 如下图一所示
cluster nodes       查看3主3从都是谁挂在谁下  如下图二所示

PS:根据图中红框所示,以红框1的端口号确认是哪台机器(确认为node-1节点)
   红框2跟右侧红框3比对,即知道红框3的端口号为6386(确认node-6节点)
   以此类推即 6台机器的挂载对象分别为: 
   node节点123为主,456为从,1-6 、2-4、3-5 分别为一对(一主一从)
   

image.png

image.png

redis 单机、集群方式连接的区别

docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381     单机方式连接
redis-cli -p 6381 -c  集群方式连接

二者的区别在于,
单机方式连接: 创建数据时,会根据自己分配的槽位数进行创建,如果创建的数据槽位
		       超过登入本机分配的槽位数时创建失败。
集群方式连接: 创建数据时,创建的数据槽位数如果超过登入的本机分配的槽位数量时,
			   会自动跳到对应槽位数的服务器节点上。
			   
槽位是根据CRC算法生成的

PS: 个节点槽位数分配如图所示

image.png

docker exec -it redis-node-1 /bin/bash    以node1节点演示
redis-cli -p 6381        单机方式连接 如下图所示

image.png

防止路由失效 -c 集群环境连接

docker exec -it redis-node-1 /bin/bash    以node1节点演示
redis-cli -p 6381 -c     集群方式连接 如下图所示

image.png

查看集群内的详细信息

redis-cli --cluster check 192.168.20.128:6381    如图所示
--cluster check        集群检查

image.png

容错切换迁移

由上图得知 有两个key在两个主节点上,节点1上有一个key,而节点1是主,节点6是从,
测试主节点1宕机,从节点6是否能正常上位接收数据。

docker stop redis-node-1                停掉节点1
docker exec -it redis-node-2 /bin/bash  以主节点2登入
redis-cli -p 6382 -c  

如下图一所示:也能使用 get 查询出数据

image.png image.png

而如果node1节点重新启动后

如图所示:
节点1会从原来的主服务器(master)变成节点6的从服务器(slave)。
即因master主服务器停机后,slave从服务器上位变成master主服务器,
不会因为原来的master主服务器重新启动后,就会变回去,而是由原来的主从身份对换。

PS:如果还想让节点1变成主服务器,就将节点六容器重启下,就会主从身份再次对调。

redis-cli --cluster check 192.168.20.128:6382  查看验证本机数据是否有丢失……

image.png

主从扩容

需求: 3主3从 扩容成4主4从,且将6388(从 node-8)挂载到6387(主 node-7)

docker run -d --name redis-node-7 --net host --privileged=true -v /tmp/redis/share/redis-node-7:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /tmp/redis/share/redis-node-8:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

新建6387、6388两个节点
docker ps  查看验证是否为八个节点

docker exec -it redis-node-7 /bin/bash  登入想要作为master节点的7号机
redis-cli --cluster add-node 192.168.20.128:6387 192.168.20.128:6381
如下图一所示,需要将7号机加入原有集群的6381(主节点1号机)

redis-cli --cluster check 192.168.20.128:6381 
如下图二所示,查看新增主节点的信息(6387)

image.png

image.png

重新为新添加的节点分配槽位数

redis-cli --cluster reshard 192.168.20.128:6381   重新分配槽位 
如下图所示(16384➗master数(4)) 
如图依次按步骤执行即可

image.png image.png image.png

redis-cli --cluster check 192.168.20.128:6381    再次验证 如下图所示

PS: 新增加的节点的槽位,是前面三个分别每个匀了一些凑出来给的,并不是全部重新删除分配的。

image.png

为主节点6387分配从节点6388

redis-cli --cluster add-node 192.168.20.128:6388 192.168.20.128:6387 --cluster-slave --cluster-master-id 5ebc7fe6e01400fbadd07be045bcdd4fbdb437de
最后面的id 是 6387 的id 注意不要写错。  ip地址为自己宿主机的ip

如图所示:

image.png

redis-cli --cluster check 192.168.20.128:6381  
如图所示 4主4从 扩容完成

image.png

主从缩容

需求: 将4主4从缩容为3主3从

删除从机6388节点

# 因为主机负责写如,所以删除(缩容)最好是以从机先开始删除

redis-cli --cluster del-node 192.168.20.128:6388 5b5dcbff222267e9949e64e07499313acf0fc89d
删除6388从节点
命令:del-node 删除节点 + 宿主机i:从机端口 + 从机6388节点ID

redis-cli --cluster check 192.168.20.128:6381 
查看验证 如图所示  已删除从机6388节点

image.png

删除从节点之后重新分配槽位

redis-cli --cluster reshard 192.168.20.128:6381 
重新分配槽位以6381为切入点操作整个集群,(也可选择别的主机点)
因为要删除节点,节点删除之后空出来的槽位

如下图所示:

image.png image.png

验证槽位分配情况

redis-cli --cluster check 192.168.20.128:6381  
查看验证 确认 6387节点槽位数为零 而6381槽位数增加 
如图所示

image.png

删除6387主节点 并验证

redis-cli --cluster del-node 192.168.20.128:6387 5ebc7fe6e01400fbadd07be045bcdd4fbdb437de
删除6387主节点
命令:del-node 删除节点 + 宿主机i:从机端口 + 从机6388节点ID

redis-cli --cluster check 192.168.20.128:6381 
查看验证 如图所示  已删除主机6387节点

image.png

标签:缩容,node,--,redis,192.168,cluster,哈希,节点
From: https://blog.51cto.com/cyfang/6750000

相关文章

  • Java 实现 WebSocket 集群转发:使用 Redis 发布订阅
    场景浏览器客户端client1连接到了服务端A的websocket节点。浏览器客户端通过弹性负载均衡,把请求分配到了服务端B,服务端B上没有client1的连接。需求服务端B把消息转发到服务端A上,找到客户端client1的连接,发送出去。画示意图......
  • 动态配置Redis参数
    在redis的使用过程中,有时候需要急需修改redis的配置,比如在业务运行的情况下,内存不够怎么办,这时要么赶紧删除无用的内存,要么扩展内存。如果有无用的内容可删除那么所有问题都已经解决,如果内容都是重要的,那只能选择扩展内存。CONFIGSET具体含义1CONFIGSETparametervalue2......
  • Redis多级缓存
    什么是多级缓存传统缓存的问题传统的缓存在请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在以下问题:请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时,会对数据库产生冲击多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提......
  • redis序列化配置
    redis序列化配置@ConfigurationpublicclassRedisTemplateConfiguration{/***@paramredisConnectionFactory*@return*/@BeanpublicRedisTemplate<Object,Object>redisTemplate(RedisConnectionFactoryredisConnectionFactory){......
  • 如何在.NET Core中使用redis
    一、1.添加Redis依赖项:在.NETCore项目中,你需要添加对StackExchange.Redis库的引用。你可以通过NuGet包管理器或手动添加依赖项来完成此操作。2. 配置Redis连接:在appsettings.json文件中,添加Redis连接配置。例如:"Redis":{"ConnectionString":"localhost:6379"}3.......
  • 记录一次.net core使用redis报错
    一、记录一次报错:报错信息如下RedisTimeoutException:Timeoutawaitingresponse(outbound=0KiB,inbound=1KiB,12063mselapsed,timeoutis1000ms),command=SCAN,next:SCAN,inst:0,qu:0,qs:1,aw:False,bw:Inactive,rs:DequeueResult,ws:Idle,in:0,in-......
  • redis keys *
    RedisKeys命令的使用及示例在Redis中,Keys命令用于获取满足指定模式的key列表。它是一个非常有用的命令,可以用来查找和操作Redis中的key。本文将介绍RedisKeys命令的使用方法,并提供一些代码示例帮助读者更好地理解和使用该命令。RedisKeys命令的语法RedisKeys命令的基本语法......
  • redis insight
    如何实现RedisInsight简介在这篇文章中,我将教你如何实现RedisInsight。RedisInsight是一个开源的Web界面,用于可视化和管理Redis数据库。它提供了一个友好的用户界面,让你可以方便地查看和操作Redis数据库。流程概述下面是实现RedisInsight的大致流程:步骤描述1......
  • redis hash命令 过期
    Redishash命令过期的实现步骤为了教会你如何实现Redis中的hash命令过期功能,我将分为以下几个步骤来进行讲解。首先,我们需要创建一个Redis的连接,并确保你已经安装了Redis和相应的Redis客户端库。接下来,我们将创建一个hash并设置其过期时间。最后,我们将检查这个hash是否已经过期。......
  • redis docker 配置文件
    RedisDocker配置文件详解Redis是一个基于内存的开源数据库,用于存储和检索数据。Docker是一种轻量级容器化平台,可以快速部署和管理应用程序。通过将Redis与Docker结合使用,我们可以轻松地创建和管理Redis实例。在使用Docker部署Redis时,我们需要创建一个配置文件,用于定义Redis的行......