【Redis 开发】Redis分片集群

分片集群

分片集群

在我们使用哨兵进行高并发读的问题,但是还有海量数据存储,高并发写的问题,使用分片集群可以解决:

特征:

  1. 集群中有多个master,每个master保存不同的数据
  2. 每个master都可以有多个slave节点
  3. master之间通过ping检测彼此健康状态
  4. 客户端请求可以访问集群的任意节点,最终都会被转发到正确节点中

搭建分片集群

  1. 在/tmp目录下创建7001 7002 7003 8001 8002 8003目录
  2. 在/tmp目录下创建一个新的redis.conf文件,重新创建配置信息
txt 复制代码
port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
#节点心跳失败的超时时间
cluster-node-timeout 5000
#持久化文件存放目录
dir /tmp/6379
#绑定地址
bind 0.0.0.0
#让redis后台执行
daemonize yes
#注册的实例ip
replica-announce-ip 192.168.75.135
#保护模式	
protected-mode no
#数据库数量
databases 1
#日志
logfile /tmp/6379/run.log 
  1. 将redis.conf配置文件拷贝到各个目录中去
    echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
  2. 修改每个目录下的redis.conf文件,将其中的6379修改为所在目录一致:
    printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I {} -t sed -i 's/6379/{}/g' {}/redis.conf
  3. 在/tmp目录下一键启动所有服务
    printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I {} -t redis-server {}/redis.conf
    关闭所有进程:ps -ef | grep redis | awk '{print $2}'| xargs kill
  4. 创建集群:redis-cli --cluster create 192.168.75.135:7001 192.168.75.135:7002 192.168.75.135:7003 192.168.75.135:8001 192.168.75.135:8002 192.168.75.135:8003 --cluster-replicas 1
  1. 通过redis-cli -p 7001 cluster nodes命令来查看集群的状态

散列插槽

Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上

插槽的利用是为了分辨我们所添加的数据最后存储在了哪一个master上

数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:

  1. key中包含{},且{}中至少包含一个字符,{}中的部分是有效的部分
  2. key中不包含{},整个key是有效部分

key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值

为什么key要与插槽进行绑定:

在主节点出现宕机的情况下,如果使用插槽,可以进行将宕机节点对应的插槽转移到对应或者的节点

注意:在集群模式下客户端连接redis命令:redis-cli -c -p 7001(-c表示集群模式)

集群伸缩

就是在集群已经建立好的情况下,添加和删除节点

向集群中添加一个新的节点master节点

  1. 在/tmp文件下创建目录7004 mkdir 7004

  2. 复制新的redis.conf文件到7004中

  3. 修改配置文件中的端口为7004

  4. 运行redis服务redis-server 7004/redis.conf

  5. 将该节点插入到集群当中
    redis-cli --cluster add-node 192.168.75.135:7004 192.168.75.135.7001

    后边的--cluster-slave:参数将添加的节点设置为从节点,并可以指定对应的主节点,如果没有参数默认添加的节点为主节点

  6. 注意因为key是按照插槽存储,添加节点后还要重新分片
    redis-cli --cluster reshard 192.168.75.135:7001:将7001的主节点插槽分配
    redis-cli -p 7001 shutdown: 使一个Redis停机

故障转移

当集群中有一个master宕机会发生什么?

  1. 首先是该实例与其他实例失去连接
  2. 然后疑似宕机
  3. 最后确定下线,自动提升一个slave为新的master

手动切换主从关系:

利用cluster failover命令可以让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点上,实现无感的数据迁移

手动的failover支持三种模式:
缺省:如上图的流程,首先发送请求,得到现在的offset值,判断是否一致,不一致进行追赶,然后进行故障转移
force:省略了对offset的一致性校验
takeover:直接执行第5步,忽略数据一致性,忽略master状态和其他master的意见

RedisTemplate访问分片集群

RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:

  1. 引入redis的starter依赖
  2. 配置分片集群地址
  3. 配置读写分离
    与哨兵模式相比,其中只有分片集群的配置方式将所有的主从节点都填写进去:
相关推荐
虚拟世界AI16 分钟前
Kronos 时间序列数据库新手部署与实战指南
数据库
愤怒火龙果33 分钟前
AI攻防 AIRT03-RAG Exploitation & Vector Database Attacks
数据库·人工智能·网络安全
SelectDB1 小时前
高并发 BI 看板怎么撑住:隔离与加速配置速查
大数据·数据库·数据分析
l1t1 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
麦壳饼2 小时前
SonnetDB:向量召回率评估中的精确基线与参数记录
数据库·sonnetdb
ClouGence2 小时前
数据如何随时可用?广西水牛先生的 MySQL 实时同步实践
数据库·mysql·数据分析
斯晨的AI笔记2 小时前
rsync 部署避坑:脚本执行位被 git 模式位抹掉,巡检备份双静默失败的排查与根治
数据库
这个DBA有点耶2 小时前
innodb_autoinc_lock_mode的三种模式:批量插入时自增锁的持有逻辑与调优
数据库·架构·代码规范
我命由我123452 小时前
5-1.Python 编码进阶 - 函数进阶(参数、返回值、递归、函数作为参数传递、lambda 匿名函数)
java·服务器·数据库·后端·python·java-ee·python3.11
小蒜学长3 小时前
基于Spring Boot+Vue3的在线游戏技术指导师匹配系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·在线游戏技术指导