• (分布式缓存)Redis分片集群


    对应的教程视频:

    高级篇Day3-04-Redis分片集群_哔哩哔哩_bilibili

    一.搭建分片集群

    1.集群结构

    分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-If9nMNjR-1662083428136)(assets/image-20210702164116027.png)]

    这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:

    IPPORT角色
    192.168.150.1017001master
    192.168.150.1017002master
    192.168.150.1017003master
    192.168.150.1018001slave
    192.168.150.1018002slave
    192.168.150.1018003slave

    2.准备实例和配置

    删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:

    1. # 进入/tmp目录
    2. cd /tmp
    3. # 删除旧的,避免配置干扰
    4. rm -rf 7001 7002 7003
    5. # 创建目录
    6. mkdir 7001 7002 7003 8001 8002 8003

    在/tmp下准备一个新的redis.conf文件,内容如下:

    1. port 6379
    2. # 开启集群功能
    3. cluster-enabled yes
    4. # 集群的配置文件名称,不需要我们创建,由redis自己维护
    5. cluster-config-file /tmp/6379/nodes.conf
    6. # 节点心跳失败的超时时间
    7. cluster-node-timeout 5000
    8. # 持久化文件存放目录
    9. dir /tmp/6379
    10. # 绑定地址
    11. bind 0.0.0.0
    12. # 让redis后台运行
    13. daemonize yes
    14. # 注册的实例ip
    15. replica-announce-ip 192.168.150.101
    16. # 保护模式
    17. protected-mode no
    18. # 数据库数量
    19. databases 1
    20. # 日志
    21. logfile /tmp/6379/run.log

    将这个文件拷贝到每个目录下:

    1. # 进入/tmp目录
    2. cd /tmp
    3. # 执行拷贝
    4. echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

    修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:

    1. # 进入/tmp目录
    2. cd /tmp
    3. # 修改配置文件
    4. printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

    3.启动

    因为已经配置了后台启动模式,所以可以直接启动服务:

    1. # 进入/tmp目录
    2. cd /tmp
    3. # 一键启动所有服务
    4. printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

    通过ps查看状态:

    ps -ef | grep redis
    

    发现服务都已经正常启动:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSycAyBD-1662083428139)(assets/image-20210702174255799.png)]

    如果要关闭所有进程,可以执行命令:

    ps -ef | grep redis | awk '{print $2}' | xargs kill
    

    或者(推荐这种方式):

    printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown
    

    4.创建集群

    虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。

    我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。

    1)Redis5.0之前

    Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。

    1. # 安装依赖
    2. yum -y install zlib ruby rubygems
    3. gem install redis

    然后通过命令来管理集群:

    1. # 进入redis的src目录
    2. cd /tmp/redis-6.2.4/src
    3. # 创建集群
    4. ./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

    2)Redis5.0以后

    我们使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:

    redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003
    

    命令说明:

    • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
    • create:代表是创建集群
    • --replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

    运行后的样子:

    在这里插入图片描述

    这里输入yes,则集群开始创建:

    在这里插入图片描述

    通过命令可以查看集群状态:

    redis-cli -p 7001 cluster nodes
    

    在这里插入图片描述

    5.测试

    尝试连接7001节点,存储一个数据:

    1. # 连接
    2. redis-cli -p 7001
    3. # 存储数据
    4. set num 123
    5. # 读取数据
    6. get num
    7. # 再次存储
    8. set a 1

    结果悲剧了

    集群操作时,需要给redis-cli加上-c参数才可以:

    redis-cli -c -p 7001
    

     这次可以了

    二.散列插槽

     总结:

    Redis如何判断某个key应该在哪个实例?

    16384 个插槽分配到不同的实例
    根据  key  的有效部分计算哈希值,对 16384 取余
    余数作为插槽,寻找插槽所在实例即可

    如何将同一类数据固定的保存在同一个Redis实例?

    这一类数据使用相同的有效部分,例如 key 都以 { typeId } 为前缀. 如:

     

    三.集群伸缩

     

     

     四.故障转移

     

     

    五.RedisTemplate访问分片集群 

     上面的第1和第3步和哨兵模式的1和3是一样的,主要差别是第2步

  • 相关阅读:
    前端vue项目生成带logo的二维码
    含文档+PPT+源码等]精品springboot+VUE的学生宿舍管理系统设计与实现[包运行成功]Java毕业设计SSM项目源码
    【CKA考试笔记】十八、StatefulSet
    数学建模竞赛常用代码总结-Python&Matlab
    HTML简单的网页制作期末作业【NBA勒布朗詹姆斯篮球明星】HTML+CSS+JavaScript
    01-go基础-05-数组(声明数组、数组赋值、遍历数组、数组值修改)
    网络安全(黑客)——自学篇
    MySQL-sql的优化
    LeetCode 2562. 找出数组的串联值:模拟(双指针)
    测试周期被压缩?教你9个方法去应对
  • 原文地址:https://blog.csdn.net/QRLYLETITBE/article/details/126656765