Redis集群Cluster和分片

news/2024/2/25 13:23:31/文章来源:https://blog.csdn.net/2302_76363587/article/details/135637311

1.Cluster集群介绍

  • 背景

    • Sentinel解决了主从架构故障自动迁移的问题
    • 但是master主节点的写能力和存储能力依旧受限
    • 使用Redis的集群Cluster就是为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器
  • 什么是集群Cluster

    • 是一组相互独立的、通过告诉网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理
    • 容易和分布式弄混,分布式系统简单的理解为一个庞大的系统进行拆分多个小系统。同样的功能部署多台为集群;一个大系统拆分成每个独立小系统,每个小系统都处理独立的功能为分布式
  • Redis集群模式介绍

    • Cluster模式是Redis3.0开始推出

    • 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接

    • 官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用

    • 各个节点会互相通信,采用gossip协议交换节点元数据信息

    • 数据分散存储到各个节点上

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.Cluster数据分片和虚拟哈希槽介绍

  • 背景
    • 主节点的写能力和存储能力受限
    • 单台机器无法满足需求,因此把数据分散存储到多个机器
    • 类似案例:mysql分库分表
  • 常见的数据分区算法
    • 哈希取模:对选择的partitioning key计算其哈希值,得到的哈希值就是对应的分区
    • 范围分片:通过确定分区键是否在某个范围内来选择分区
    • 一致性hash分区
    • Redis Cluster集群没有采用一致性哈希方案,而是采用数据分片中的哈希槽来进行数据存储与读取的
  • 什么是Redis的哈希槽slot
    • Redis集群预分好16384个槽,当需要在Redis集群中放置一个key-value时,根据CRC16(key) mod 16384的值,决定将一个key放到哪个桶中
  • 大体流程
    • 假设主节点的数量为3,将16384个槽位按照【用户自己的规则】去分配这3个节点,每个节点复制一部分槽位
      • 节点1的槽位区间范围为0-5460
      • 节点2的槽位区间范围为5461-10922
      • 节点3的槽位区间范围为10923-16383
      • 注意:从节点是没有槽位的,只有主节点才有
    • 存储查找
      • 对要存储查找的键进行CRC16哈希运算,得到一个值,并取模16384,判断这个值在哪个节点的范围区间
      • 假设CRC16(“test_key”) % 16384 = 3000,就是节点一
      • CRC16算法不是简单的hash算法,是一种校验算法
  • 使用哈希槽的好处就在于可以方便的添加或移除节点
    • 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了
    • 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了

3.Cluster集群搭建

  • 说明

    • 旧版本的需要使用Ruby语言进行构建,新版5之后直接用redis-cli即可
    • 6个节点,三主三从,主从节点会自动分配,不是人工指定
    • 主节点故障后,从节点会替换主节点
  • 配置

    # 是否开启集群
    cluster-enabled yes
    # 生成的node文件
    cluster-config-file nodes-6381.conf
    # 节点连接超时时间
    cluster-node-timeout 15000
    # 集群节点的IP,当前节点的IP
    cluster-announce-ip 192.168.1.12
    # 集群节点映射端口
    cluster-announce-port 6381
    # 集群节点总线端口,节点之间互相通信,常规端口+1万
    cluster-announce-bus-port 16381
    
  • 创建6个配置文件,注意修改配置端口号和日志文件

    bind 0.0.0.0
    port 6381
    daemonize yes
    requirepass 123456
    logfile "/usr/local/redis6/log/redis1.log"
    dbfilename redis1.rdb
    dir /usr/local/redis6/data
    appendonly yes
    appendfilename "appendonly1.aof"
    masterauth 123456
    cluster-enabled yes
    cluster-config-file nodes-6381.conf
    cluster-node-timeout 15000
    cluster-announce-ip 192.168.1.12
    cluster-announce-port 6381
    cluster-announce-bus-port 16381
    
  • 启动6个节点

    /usr/local/redis6/bin/redis-server /usr/local/redis6/data/redis1.conf
    /usr/local/redis6/bin/redis-server /usr/local/redis6/data/redis2.conf
    /usr/local/redis6/bin/redis-server /usr/local/redis6/data/redis3.conf
    /usr/local/redis6/bin/redis-server /usr/local/redis6/data/redis4.conf
    /usr/local/redis6/bin/redis-server /usr/local/redis6/data/redis5.conf
    /usr/local/redis6/bin/redis-server /usr/local/redis6/data/redis6.conf
    
  • 加入集群(其中一个节点执行即可)

    • –cluster构建集群全部节点信息
    • –cluster-replicas 1主从节点的比例,1表示1主1从的方式
    /usr/local/redis6/bin/redis-cli -a 123456 --cluster create 192.168.1.12:6381 192.168.1.12:6382 192.168.1.12:6383 192.168.1.12:6384 192.168.1.12:6385 192.168.1.12:6386 --cluster-replicas 1
    

    在这里插入图片描述

  • 检查状态信息(其中一个节点执行即可)

    /usr/local/redis6/bin/redis-cli -a 123456 --cluster check 192.168.1.12:6381
    
  • 集群状态

    # 连接客户端
    /usr/local/redis6/bin/redis-cli -c -a 123456 -p 6381
    # 集群信息
    cluster info
    # 节点信息
    cluster nodes
    
  • 测试集群读写命令set/get

    • key哈希运算计算槽位
    • 槽在当前节点的话直接插入/读取,否则自动转向到对应的节点
  • 操作都是主节点操作,从节点只是备份

  • 流程解析

    • 启动应用
    • 加入集群
    • 从节点请求复制主节点(主从复制一样)
      • 先全量
      • 再增量

4.Redis Cluster集群整合SpringBoot

  • 配置文件

    spring:redis:password: 123456cluster:# 最多转发次数max-redirects: 3nodes: 192.168.1.12:6381,192.168.1.12:6382,192.168.1.12:6383,192.168.1.12:6384,192.168.1.12:6385,192.168.1.12:6386
    

5.高可用架构总结

  • 主从模式:读写分离、备份,一个master可以有多个slave
  • 哨兵Sentinel:监控、自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器
  • 集群Cluster:为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,提高并发量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_925275.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于Java的药店药品信息管理系统的设计与实现论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,药品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大…

布隆过滤器四种实现(Java,Guava,hutool,Redisson)

1.背景 为预防大量黑客故意发起非法的时间查询请求,造成缓存击穿,建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数(哈希函数)来记录与识别某个数据是否在一个集合中。如果数据不在集合中…

Alibaba-> EasyExcel 整理3

1 导入依赖 <!-- easyExcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version >3.2.1</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</art…

SQL-分页查询and语句执行顺序

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

LLVM系列(1): 在微软Visual Studio下编译LLVM

参考链接&#xff1a; Getting Started with the LLVM System using Microsoft Visual Studio — LLVM 18.0.0git documentation 1.安装visualstudio&#xff0c;版本需要大于vs2019 本机环境已安装visual studio2022&#xff0c;省略 2安装Makefile&#xff0c;版本需要大…

【K8s学习】

k8s的简单执行流程&#xff1a; Kubernetes Master&#xff08;API Server、Scheduler等组件&#xff09;负责调度Pod到合适的Node上。 当Pod被调度到某个Node时&#xff0c;该Node上的kubelet代理会收到指令并开始执行Pod的生命周期管理任务&#xff0c;包括创建、监控和终止P…

【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

阿里 P7 三面凉凉,kafka Borker 日志持久化没答上来

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;阿里巴巴淘天Java开发工程师&#xff0c;CSDN博客专家&#x1f4d5;系列专栏&#xff1a;Spring源码、Netty源码、Kafka源码、JUC源码、dubbo源码系列&#x1f525;如果感觉博主的文章还不错…

JVM基础(7)——ParNew垃圾回收器

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

市场复盘总结 20240116

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 18% 二进三&#xff1a; 进级率低 60% 最常用的二种方法&#xff1a; 方法一&am…

【iOS】数据持久化(四)之FMDB基本使用

正如我们前面所看到的&#xff0c;原生SQLite API在使用时还是比较麻烦的&#xff0c;于是&#xff0c;开源社区就出现了一系列将SQLite API进行封装的库&#xff0c;其中FMDB的被大多数人所使用 FMDB和SQLite相比较&#xff0c;SQLite比较原始&#xff0c;操作比较复杂&#…

GPT/GPT4在人工智能,深度学习,编程等领域应用

详情点击链接&#xff1a;GPT/GPT4在人工智能&#xff0c;深度学习&#xff0c;编程等领域应用 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Ge…

价值7500的在线授权网站源码支持IP+域名+双向授权全开源

PHP授权验证更新系统完整版&#xff0c;一键更新系统&#xff0c;一键卡密生成自助授权功能&#xff0c;域名ip双重验证功能等等 修复盗版检测&#xff0c;确保实时查看盗版 修复在线加密系统&#xff0c;一键加密 授权系统几乎所有的程序都能整合使用,包括您的app和计算机程序…

数据结构实战:变位词侦测

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;逐个比较法1、编写源程序2、代码解释说明&#xff08;1&#xff09;函数逻辑解释&#xff08;2&#xff09;主程序部分 3、运行程序&#xff0c;查看结果4、计算时间复杂度 &#xff08;二&#xff09;排序比较法1…

docker 安装 zookeeper ( 亲测有效 )

目录 1 安装2 验证 1 安装 上传 zookeeoer.tar 包 到服务器 上传之后tar 包&#xff0c;将他变成镜像 输入docker images,发现目前是没有镜像的&#xff0c;现在将tar 包变成镜像 docker load -i zookeeper.tar因为我们要使用 Docker-compose 去管理容器&#xff0c;所以要使…

网络共享服务

存储类型&#xff1a;直连式&#xff08;DAS&#xff09;:距离最近&#xff0c;存储设备且直接连接到服务器上 存储区域网络&#xff08;SAN&#xff09;&#xff1a;适用于大型应用或数据库系统&#xff0c;可以使用文件的空间&#xff0c; 以及管理空间…

深入理解 Flink(五)Flink Standalone 集群启动源码剖析

前言 Flink 集群的逻辑概念&#xff1a; JobManager(StandaloneSessionClusterEntrypoint) TaskManager(TaskManagerRunner) Flink 集群的物理概念&#xff1a; ResourceManager(管理集群所有资源&#xff0c;管理集群所有从节点) TaskExecutor(管理从节点资源&#xff0c;接…

使用WAF防御网络上的隐蔽威胁之SSRF攻击

服务器端请求伪造&#xff08;SSRF&#xff09;攻击是一种常见的网络安全威胁&#xff0c;它允许攻击者诱使服务器执行恶意请求。与跨站请求伪造&#xff08;CSRF&#xff09;相比&#xff0c;SSRF攻击针对的是服务器而不是用户。了解SSRF攻击的工作原理、如何防御它&#xff0…

贪心算法(思路)

最近在cf上做了很多贪心的题&#xff0c;写篇博客来总结一下 Problem - C - Codeforces 看第一道题 不难看出&#xff0c;我们需要在数组中找到一段奇偶相间的序列&#xff0c;要使他们的和最大&#xff0c; 在图中我们假设[1,2]和[3,4]是奇偶相间的序列&#xff0c;我们在在…

【Docker】数据卷挂载以及宿主机目录挂载的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…