Redis-切片集群

扩容的思路

  • 纵向扩展 scale up: 一台8G的变成一台24G的
    👍 简单
    👎 受硬件条件的限制
    👎 单机容量大对性能的影响,如Redis的fork操作耗时是和内存数据量正相关的
  • 横向扩展 scale out: 一台8G的变成3台8G的
    👍 扩容灵活,不会增大单机的存储
    👎 机制复杂,包括如何片键分片,避免热片,如何保证通信连接,数据聚合等等

以下主要讲的是Redis Cluster即Redis集群横向扩展的方式。

数据在哪个实例上?

Redis把数据分成了16384个哈希槽(Slot),通过 CRC16(Key)%16384来获取数据应该放在哪个槽。而分片集群,就是把这些槽均匀分布在不同实例上。

例如,如果是有两个主节点的分片集群,那么主1存0-8191号slot,主2存8192-16383号slot;如果是4个主节点的分片集群,主1存0-4095,主2存4096-8191,主3存8192-12287,主4存12288-16383。

部署

集群模式部署的Redis实例如下:

Redis-切片集群

重定向

Redis主节点会互相知道各自存的slot映射关系,客户端也会缓存一份这个哈希槽的映射关系在本地,那么当一个命令(例如get)出现时,客户端可以自己计算键所对应的哈希槽号,然后直接向存该槽的数据节点发送命令。

但是这个映射关系会在1.集群变化,如扩缩容2.负载均衡优化,重新分布slot时,改变。如果客户端缓存的映射和实际的不一致,就要靠Redis提供的重定向机制来保证,假如客户端像实例1请求数据,实例1发现这个数据其实是在实例2上,就会回复客户端 MOVED 哈希槽号 实例2HOST。如果请求时,正在发生数据迁移,那么会回复一个 ASK 哈希槽号 实例2HOST给客户端,表明需要后续再确认。

无中心化

Redis Cluster采用的无中心化模式(无Proxy,客户端与数据节点直连,这和我们在Mongodb看到的Mongos不一样),所以就存在数据节点纠正客户端路由表的能力,和数据节点之间交换路由表的能力。使用哈希槽的方式是为了简化这个路由映射表,减少该表的存储空间,便于扩缩容,负载均衡,数据迁移等。

中心化方案

其他Redis集群化方案如Codis,Twemproxy都是中心化模式(增加Proxy层,像mongos一样的),让客户端操作Redis集群像操作一个Redis实例一样,增加Proxy也势必带来性能的损耗。

Original: https://www.cnblogs.com/rachel-aoao/p/Redis_cluster.html
Author: rachel_aoao
Title: Redis-切片集群

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601474/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL 中的锁机制

    技术是为了解决问题而生的,锁被用来实现隔离性,保证并发事务的正确性。 两段锁 数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁) 加锁阶段:在加锁阶段…

    数据库 2023年6月11日
    088
  • day05-离线留言和离线文件

    多用户即时通讯系统05 4.编码实现04(拓展) 拓展功能: 实现离线留言,如果某个用户不在线 ,当登陆后,可以接收离线的消息 实现离线发文件,如果某个功能没有在线,当登录后,可以…

    数据库 2023年6月11日
    068
  • Jmeter操作ES

    JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎(简称es…

    数据库 2023年6月14日
    084
  • 用Python做一个中秋抢购月饼的脚本

    ; 序言 每逢佳节倍思亲,想买个东西给家里,结果发现手速不够,网速不够快,没有时间下单等等各种原因导致最后想买的东西售罄了… 甚至跟你一起抢购的可能是脚本,太真实了! …

    数据库 2023年6月14日
    091
  • MySQL8新增降序索引

    MySQL8新增降序索引 桃花坞里桃花庵,桃花庵里桃花仙。桃花仙人种桃树,又摘桃花卖酒钱。 一、MySQL5.7 降序索引 MySQL 在语法上很早就已经支持降序索引,但实际上创建…

    数据库 2023年5月24日
    078
  • [spring]spring和mybatis的整合与事务处理

    1.导包 junit junit 4.13.1 mysql mysql-connector-java 8.0.29 org.mybatis mybatis 3.5.3 org.sp…

    数据库 2023年6月16日
    082
  • java读写锁

    工作遇到了金钱计算,需要用到读写锁保证数据安全。记录一下。 单纯读没有限制,读写、写写的时候会有安全问题。 _hashMap_存在并发线程安全问题,而 _hashtable_线程安…

    数据库 2023年6月16日
    070
  • ConcurrentHashMap深入剖析(基于JDK1.7)

    1 package cn.com.pep.concurrent; 2 3 import java.util.concurrent.ConcurrentMap; 4 import j…

    数据库 2023年6月14日
    097
  • 使用clipboard.js复制文字+图片到微信后图片不显示问题处理

    使用clipboard.js复制文字 +图片,粘贴到微信不显示图片,而QQ可以。 解决方案: 图片链接使用http,不要使用https。 使用clipboard.js实现复制功能 …

    数据库 2023年6月14日
    0103
  • Mysql异常——com.alibaba.druid.sql.parser.ParserException

    今天写业务逻辑时候,写完发现控制台出现报错,但是程序可以正常运行。在控制台报错中发现是因为SQL模糊查询格式问题 修改模糊查询 写法后 成功解决该报错 Original: http…

    数据库 2023年6月16日
    0162
  • 编程相关书单

    软工概论软件工程软件工程:实践者的研究方法 职业素养软技能码农翻身技术之瞳程序员修炼之道程序员的职业素养程序员的自我修养 程序设计计算机程序的构造和解释 (SICP) UML软件建…

    数据库 2023年6月11日
    066
  • Indian Math tech

    https://www.youtube.com/watch?v=2j0nHEy5y18 本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:htt…

    数据库 2023年6月11日
    069
  • Mock.js的简单使用

    Mock.js的简单使用 简述 Mock.js 是一款 模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。 功能 根据数据模板生成模拟数据。 模拟 Ajax …

    数据库 2023年6月11日
    099
  • MySQL实战45讲 17

    17 | 如何正确地显示随机消息? 场景:从词汇表中随机选择三个单词。 [En] Scene: three words are randomly selected from a v…

    数据库 2023年5月24日
    088
  • springboot~手动加载thymeleaf模版

    thymeleaf在spring-mvc时代很是盛行,与freemaker组成了两大模版引擎,而进行springboot之后,很多项目都采用前后分离的模式,这使得模板引擎关注度少了…

    数据库 2023年6月6日
    0105
  • 牛客SQL刷题第三趴——SQL大厂面试真题

    结果,保留了两位小数,并根据播放进度以相反的顺序进行排序。 [En] As a result, two decimal places are retained and sorted…

    数据库 2023年5月24日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球