上节回顾

上一节我们讲了AKF拆分原则,讲了Redis主从复制的方式,是X轴方向的拓展,实现了HA,但是没有解决单节点数据的容量有限问题。

如何解决单节点数据容量的问题

如果数据可以分类,交集不多,可以考虑按业务拆分

如果数据没有办法划分拆解:

采用sharding分片
下面这三种方案都发生在客户端

1、Hash+取模(几乎没人用)

2、使用random随机分配节点,适合做消息队列

3、使用kmeta一致性哈希,规划一个环形哈希环
一致性哈希:https://www.jianshu.com/p/735a3d4789fc

物理节点:本来有两个redis的物理节点。
虚拟节点:可以让一个物理设备出现在好几个节点上。环上就有20个物理点。这样解决了数据倾斜的问题。
这种方案更倾向于作为缓存,而不是数据库用。
(拓扑关系图)

redis连接对server端的成本很高,是对server端造成的


解决方式:
类似于nginx反向代理,增加一个接入层
我们增加一个代理层,我们只需要关注代理层性能就可以了。
代理层里面有了逻辑实现,例如modula,random,kemata,这叫无状态的。这样减轻了客户端的代码。
如果请求压力太大,代理层hold不住怎么办?我们看图的下半部分这个模型。
在代理层前面加一个LVS,LVS做一个主备,主备之间通过keepalived,除了监控两个LVS的健康状态之外,也监控proxy的健康状态。

这些内容来自于哪儿?https://github.com/twitter/twemproxy

无论你企业后面技术多么复杂,对于客户端,都是透明的。你要考虑客户端代码逻辑的复杂度成本,

不要因为技术而技术。redis连多线程都没有使用,它并不希望redis被引入那么多的功能。

以上三种模式的弊端是不能做分布式数据库用。一致性哈希增删节点的时候会让一部分数据时间窗不可用。

新增节点会对算法带来挑战,比如rehash等,怎么解决这个问题?
我们引入预分区的概念

预分区

以前我们模3,如果现在我们模10,中间再加一层mapping

新增节点,迁移数据的时候,把槽位中部分数据拿出来,放进新的节点即可

redis cluster模式:无主模型
http://redis.cn/topics/partitioning.html
客户端可以去任意一个redis节点取数据,每一个redis都有所有key的映射关系算法,知道别人持有哪些分片,会给客户端返回应该重定向到的redis,由客户端自己去正确的redis上取。
例如,客户端去redis3上找k1,redis2说,你应该去redis3找。于是客户端就去redis3上取k1

数据分治会带来一个问题:聚合操作很难实现。
事务很难实现
两个set取交集,可以实现但是redis并没有去实现,因为其中有一个数据移动的过程->redis的作者想要计算向数据移动,而不是去移动数据。redis的作者做了取舍,将影响性能的功能都取消掉了。
redis代理关闭了一些操作:

可以由人去实现:hash tag
例如我们将带有相同前缀的key放在一个节点上(我手动把它放到一起去,就能实现事务了)

Predixy

github上有完整的中文安装步骤

Redis实战(七):redis的集群:主从复制、CAP、PAXOS、cluster分片集群 2相关推荐

  1. Docker下Redis Cluster分片集群的搭建、基本操作、集群扩容和集群故障转移(非关系型数据库技术课程 第九周)

    文章目录 Docker 下Redis Cluster 分片集群搭建 1. Cluster 分片集群 1.1 Cluster 集群的结构和作用 1.2 Cluster 分片集群 的作用 1.3哈希槽(h ...

  2. 深入剖析Redis系列(七) - Redis数据结构之列表

    前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...

  3. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  4. redis(二)redis实战 使用redis进行文章的排序

    2019独角兽企业重金招聘Python工程师标准>>> http://www.beckbi.cn/?p=172 redis实战使用redis进行文章的排序 转载于:https://m ...

  5. Redis实战 - 09 Redis BitMaps 实现用户签到,统计签到次数,统计签到情况等功能

    文章目录 1. 需求分析 2. 设计思路 3. 用户签到和统计连续签到的次数 1. 签到控制层 SignController 2. 签到业务逻辑层 SignService 3. 测试 4. 按月统计用 ...

  6. 用mongoshake实现mongo分片集群到单实例和分片集群的数据同步

    一 实验环境 这里演示只同步源端ccc库下的t1,t2表,ddd库下的所有表到两个目标端. 二 实验步骤 2.1 创建专用账号 2.1.1 在源端创建账号 2.1.1.1 登录其中一个mongos节点 ...

  7. C# Redis实战(七)

    七.修改数据 在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据.大家都知道Redis是key-value型存储系统,所以应该可以修改key, ...

  8. Redis实战(七)

    修改数据 C#语言修改Redis示例. 1.通过key修改单个value using (var redisClient = RedisManager.GetClient()){var user = r ...

  9. Redis实战 - 04 Redis 分布式锁应用之抢购代金券

    文章目录 1. 数据库表结构 1. 代金券表 2. 抢购活动表 3. 订单表 2. 秒杀场景的解决方案 3. 创建秒杀服务 ms-seckill 4. 代金券抢购功能开发 - 关系型数据库实现 1. ...

最新文章

  1. 品牌网络推广方案浅析在编写文章标题时都有什么技巧?
  2. php获取函数里参数吗,php函数中获取参数信息方法(记录)
  3. Python实现遍历目录与子目录,并找到以.txt结尾的文件
  4. 【硬盘整理】使用UltimateDefrag将常用文件放置在磁盘最外圈
  5. P2280-激光炸弹【二维前缀和】
  6. php自动加载原理,php中的自动加载类机制原理
  7. c++ 构造函数数组_从 JS 数组操作到 V8 array.js
  8. java吃豆人代码讲解_在吃豆人的这一关里,隐藏着来自程序员的深深恶意
  9. linux定时任务的设置 crontab 配置指南
  10. HTML网页设计CSS样式代码大全
  11. 最大流的四种常用算法
  12. Android应用程序访问linux驱动第二步:实现并测试hardware层
  13. 怎样黑网吧的万象系统_5636小编教你如何进入万象网管系统
  14. 使用python,生成符合zipf分布的数据集
  15. 高中生该怎样自学编程?
  16. PMU电池管理配置与io-domain电源域
  17. 工匠精神消失的手机2020:衰落、变局、绝唱、破圈
  18. Android 上面实现红外解析(NEC编码)
  19. Message创建方式:new Message和obtainMessage的区别
  20. 洋河梦之蓝M9政府专供 是真是假?

热门文章

  1. POJ - 2352 Stars(线段树/树状数组)
  2. python读数据库的通信协议是,Python操作SQLite数据库过程解析
  3. 通过条件判断文本框是否隐藏_如何通过风速来判断高效过滤器是否达到更换要求...
  4. 机器学习-机器学习简介
  5. java web转码_web/java实现多种格式视频上传、转码、截图、播放、下载等功能附源码(详细)...
  6. 当鼠标滑过文本框自动选中输入框内容JS代码
  7. 动态开点线段树(多棵线段树)的内存分配与回收
  8. C++中空指针调用类成员函数的原理
  9. webrtc简单案例——音视频采集和播放
  10. Hadoop之Yarn工作机制详解