Redis集群的扩容与缩容

Redis集群的扩容与收容

Redis集群扩容

目前的redis集群上有7001、7002、7003、7004、7005、7006,六台三主三从的集群,现在要往这个集群扩容,7007,7008两个redis节点,7007作为主节点,7008作为从节点添加到集群中

  1. 基于docker安装redis编写一个安装脚本redis-port.sh

    #!/bin/bash 
    #在/usr/local/server/redis-cluster下生成conf和data目标,并生成配置信息 
    #换行 
    echo -e "\n" 
    
    #输入信息 
    read -p "请输入容器端口:" DOCKER_PORT 
    
    #输入端口赋值 
    port=$DOCKER_PORT;
    echo -e "$port" 
    
    #创建配置文件 
    mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf && mkdir -p ./${port}/data; 
    
    #创建redis容器 
    docker run -d -it -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/server/redis- cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/server/redis- cluster/${port}/data:/data --privileged=true --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; 
    
    #查找ip 
    echo -n "启动$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis- net").IPAddress }}' "redis-${port}")":${port}" 成功!"; echo -e "\n"
    
  2. 添加执行权限

    chmod +x redis-port.sh
    
  3. 执行脚本,创建redis-7007、redis-7008、redis-7009

    ./redis-port.sh
    
  4. 查看集群状态

    查看集群节点 状态

    ./redis-cli -p 7001 cluster nodes
    

    在这里插入图片描述

    从上图可以看出集群关系,如下

    Master:7001		Slave:4
    Master:7002		Slave:5
    Master:7003		Slave:6
    
  5. 添加集群主从节点

    往集群节点中添加一个主节点,将192.168.4.11:7007节点添加到192.168.4.11:7001节点所在的集群中,并添加后作为主节点

    ./redis-cli --cluster add-node 192.168.4.11:7007 192.168.4.11:7001
    

    在这里插入图片描述

    上图可以看出7007是没有分配哈希槽的,所以我们需要重新分配哈希槽

    本文末尾简单介绍一下redis分配卡槽原理

  6. 重新分配哈希槽

    将7001,7002,7003中的100个哈希槽挪给7007,命令如下

    ./redis-cli --cluster reshard 192.168.4.11:7001 --cluster-from 12319176fd61058316dec6eb8545bb1724afdf8a,a86d7b6ed4d3090d42e7ca5c1d1ace3e01b2ea94,0e8ca03480a6e11cbef8fb9fe07929653ee9c3ee --cluster-to dd32e4e5dc381bbf1d3cea164ef51fef724016fb --cluster-slots 100
    

    在这里插入图片描述

    上图可以看出,7001、7002、7003分别分给了7007,0-32(33个槽)、5461-5494(34个槽)、10923-10955(33个槽),共计100个

  7. 添加集群从节点

    集群中7007节点添加一个从节点7008,添加从节点的主要目的是提高高可用,防止主节点宕机后该节点无法提供服务,添加命令如下

    ./redis-cli --cluster add-node 192.168.4.11:7008 192.168.4.11:7007 --cluster-slave --cluster-master-id dd32e4e5dc381bbf1d3cea164ef51fef724016fb
    

    在这里插入图片描述

Redis集群缩容

Redis实现缩容,需要哈希槽重新分配,将需要一处的节点所分配的所有哈希槽的值分配给其他需要运行的工作的节点上,还需要移除该节点的从节点,然后再删除该节点

  1. 移除从节点

    移除7007的从节点7008

    ./redis-cli --cluster del-node 192.168.4.11:7008 98622da3fd4ec079b22c3126bcca5b73ff75eb57
    

    移除后就没有7008节点了

    在这里插入图片描述

  2. 迁移Master的哈希槽

    我们需要将7007节点上的哈希槽迁移到7001、7002、7003节点上

    第一次迁移

    ./redis-cli --cluster reshard 192.168.4.11:7007 --cluster-from dd32e4e5dc381bbf1d3cea164ef51fef724016fb --cluster-to 12319176fd61058316dec6eb8545bb1724afdf8a --cluster-slots 33 --cluster-yes
    

    迁移效果如下

    在这里插入图片描述

    第二次迁移

    ./redis-cli --cluster reshard 192.168.4.11:7007 --cluster-from dd32e4e5dc381bbf1d3cea164ef51fef724016fb --cluster-to a86d7b6ed4d3090d42e7ca5c1d1ace3e01b2ea94 --cluster-slots 34 --cluster-yes
    

    第三次迁移

    ./redis-cli --cluster reshard 192.168.4.11:7007 --cluster-from dd32e4e5dc381bbf1d3cea164ef51fef724016fb --cluster-to 0e8ca03480a6e11cbef8fb9fe07929653ee9c3ee --cluster-slots 33 --cluster-yes
    

    三次迁移后,集群状态查询

    在这里插入图片描述

  3. 删除7007主节点

    ./redis-cli --cluster del-node 192.168.4.11:7007 dd32e4e5dc381bbf1d3cea164ef51fef724016fb
    

    删除后集群的状态

    在这里插入图片描述

哈希槽分配原理

Redis集群并没有使用一致性哈希,而是引入了哈希槽的概念

Redis集群又16384个哈希槽,每个Key通过CRC16校验后,对16384取模来决定放置在哪个槽,集群的每个节点负责一部分的Hash槽

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TRboWxSz-1681118879260)(C:\Users\ct10000\AppData\Roaming\Typora\typora-user-images\image-20221013154114494.png)]

CRC16算法产生的hash值有16bit,这个算法可以产生2^16=65536个值

也就是说值是分布在0~65535之间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值