作者:贲绍华

爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、集群架构的一些基本概念

当我们只使用一台 Redis 实例也就是 Single 架构时,需要考虑一些非常实际的问题,如:单节点一但宕机则业务停摆、单节点的容量不可能是无限制的、性能同样存在瓶颈等......

集群架构模式最主要的三个目的就是:高可用、提升资源限制瓶颈、提升网络吞吐:

1.1 高可用 - Sentinel

Redis Sentinel 是一个分布式系统, 可以在一个架构中运行多个 Sentinel 进程(progress)

这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

1.2 提升资源限制瓶颈 - 数据分区存储(Partitioning)

将数据通过对应的算法规则,自动分割数据到不同的节点上,每一个节点都是主,都承担一部分数据。

在整个集群的部分节点失败或者不可达的情况下依然能够继续处理命令。

数据的拆分可以依据 AKF 原则根据不同维度进行灵活拆分:

1.3 提高网络吞吐

Redis 使用的是 epoll IO 模型,单机吞吐量也足够优秀,但当业务流量单一入口不能兜住时则需要考虑分流策略了。

如:增加 slave 节点、使用 proxy 作为流量入口、Redis cluster、LVS等

灵活的架构能使业务侧不需要太关心具体到哪个节点,节点资源瓶颈如何。均使用统一流量入口即可。

二、客户端分区

此处的客户端指的就是业务侧,根据业务类型分类存取,自行维护一个 key - redis node 的映射关系或服务发现机制。

简单场景下这么做并不会有什么问题,但是也存在一些缺点,如:

  • 存取规则需要统一,需要考虑扩缩容时业务逻辑调整的影响面

  • 业务其实并不清楚 Redis 节点机器的瓶颈

  • 每个客户端都需要连接所有的 Redis 节点

三、代理分区

Redis 也有一些优秀的 proxy ,它们在作为统一流量入口的同时也提供了一些非常实用的功能,如数据 sharding 。

根据一定规则使对应的 key 落到集群的不同节点上,下边简单介绍一下常见的 redis proxy 与分片的算法逻辑:

3.1 Modula [ 根据算法 + 取模存取 ]

通过算法对key进行取模,决定最终需要在哪个节点上进行存取。

  • 缺点:可能会出现数据分布节点不均匀的情况,机器扩缩容时需要调整取模策略

3.2 Random [ 随机存取 ]

作为消息队列使用时候,可以将多个Redis实例组成Topic,生产者存入(lpush)数据,消费者消费(rpop)

  • 缺点:可能会出现数据分布节点不均匀的情况

3.3 Ketama [ 一致性哈希 ]

一致哈希算法是对一组数进行取模运算的结果值组织成一个圆环,就像钟表一样,它可以被想象成带有60个刻度的圆,这个圆环被称为哈希环。在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。

一致性哈希解决了简单哈希算法在分布式哈希表中存在的动态伸缩等问题。

  • 优点:增加节点可以分担其他节点存储压力,因为没有取模过程不会影响其他节点的存储策略

  • 缺点:新增节点会造成一小部分数据不能命中(此时应再取附近的2个节点查看数据是否存在)

操作步骤:

  1. 规划一个哈希环,环上node hash后的槽位为物理节点,其余为虚拟节点

  2. 将所有物理节点标记起来

  3. 数据(key)加进来时通过hash过后查询该槽位是否为物理节点,如果是虚拟节点,则找寻离它最近的物理节点后存入

四、Redis Cluster(无中心架构)

Redis Cluster没有使用一致性hash, 而是引入了哈希槽的概念。每一台实例都会分配对应的槽位,自带了算法与集群内所有槽位的记录,所以每一台都是主。客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。简单的说就是每一个节点的组成都是:数据+路由

  • 优点:扩缩容方便,Redis自带了工具与脚本对于Redis cluster架构也有很好的支持

  • 缺点:客户端连接直接压在了实例自身(可以在上层增加 proxy),删除重定向也会造成过多的请求转发与处理流程

为了方便理解,下边通过图解进行说明:

五、其他

当使用 Redis cluster 架构时候:

  • 涉及多个 key 的操作通常不会被支持。例如不能对两个集合求交集,因为他们可能被存储到不同的 Redis 实例(KEYS *、WATCH、MULTI...)

  • 同时操作多个 key ,则不能使用 Redis 事务

本文关键字:#Redis集群# #Redis分区#


文章推荐:

技术分享 | TiUP工具 - TiDB集群滚动升级核心流程解析

故障分析 | OceanBase Proxy 无法连接 OBserver 集群

技术分享 | Xtrabackup 不备份 binlog 怎么保证一致性?

技术分享 | 怎么找到上锁的 SQL 语句


关于SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

SQLE 获取

类型 地址
版本库 https://github.com/actiontech/sqle
文档 https://actiontech.github.io/sqle-docs-cn/
发布信息 https://github.com/actiontech/sqle/releases
数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

更多关于 SQLE 的信息和交流,请加入官方QQ交流群:637150065...

技术分享 | Redis 集群架构解析相关推荐

  1. 那些年用过的Redis集群架构(含面试解析)

    作者:孤独烟,平安银行资深后端工程师一枚! 引言 今天是2019年2月13号,也就是大年初九,我接到了高中同学刘有码面试失利的消息. 他面试的时候,身份是某知名公司的小码农一枚,却因为不懂自己生产上R ...

  2. 分布式一致性协议 Gossip 和 Redis 集群原理解析

    分布式一致性协议 Gossip 和 Redis 集群原理解析 Redis 是一个开源的.高性能的 Key-Value 数据库.基于 Redis 的分布式缓存已经有很多成功的商业应用,其中就包括阿里 A ...

  3. 一文道明Redis集群架构工作原理及搭建

    文章目录 前言 一.Redis-Cluster(集群)长什么样子? 二.Redis-Cluster集群搭建 1. Redis集群搭建 2. 客户端测试 3. 增加主节点(6000)到集群环境中 4. ...

  4. java集群解析文件_java相关:springboot整合redis集群过程解析

    java相关:springboot整合redis集群过程解析 发布于 2020-4-13| 复制链接 摘记: 简介 在springboot使用搭建好的redis集群添加redis和连接池依赖 ```x ...

  5. Redis集群架构搭建和原理

    Redis集群架构教程 Redis常见的架构有主从.哨兵.高可用集群,接下来的文章分四章分别介绍linux安装redis.主从架构搭建.哨兵模式搭建.集群架构搭建 第一章 Redis的安装 我的cen ...

  6. Redis集群架构搭建详解

    一.简介 这其实是一种分布式数据库,就是通过分片的机制储存数据,cluster中的每个节点仅仅储存数据哭的一部分数据,本质上就是实现数据库分片. 这种集群是一种去中心化的集群,也就是说,集群中的每个节 ...

  7. 03 ElasticSearch笔记-搜索技术深入与集群架构原理

    回顾: 1.通过term 和 match查询数据时细节点以及数据类型keyword与text区别 1.1 term查询 1.1.1 term查询keyword字段. term不会分词.而keyword ...

  8. 技术分享 | mongo 集群连接数暴涨处理案例一则

    作者:任坤 现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL.mongoDB 和 Redis 维护工作. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授 ...

  9. 技术分享 | 无人机集群——分布式控制算法

    上期我们讲解了四种集群分布式控制算法之后,那么,接下来向大家介绍一下分布式控制中的常用算法吧.但是为了帮助大家更好的理解raft算法,先从一个简单的例子入手吧! 假如某班(组成人员:follower) ...

最新文章

  1. C#.NET跨线程控件的相关操作
  2. Boyer-Moore 字符串匹配算法
  3. 【UIKit】UITableView 1
  4. 笑死!“盒马”把自己的ID给玩没了...
  5. Activiti+Oracle,在数据量大的时候报错:无法支持1000列以上
  6. 隐藏标准选择界面按钮
  7. 身份证到期需更换 警方提醒市民提前办理
  8. .netcore mysql_.netcore基于mysql的codefirst
  9. 有望年底登场!小米12系列即将备案:骁龙895+2亿像素!
  10. 虚拟机服务器被攻击,Linux服务器被攻击用来挖矿了
  11. 深度学习之激活函数篇(Sigmoid、tanh、ReLU、PReLU)
  12. HTML中可以有多个meta吗,HTML5中meta标签有三个主要属性是什么
  13. 《图解HTTP》读书笔记(二:各种协议与HTTP协议之间的关系)
  14. unity IEnumerator 协程的理解
  15. 【雷达通信】基于matlab GUI雷达脉冲压缩【含Matlab源码 303期】
  16. WEB页面实时播放海康、大华等摄像头RTSP视频流完全方案
  17. 《统计学》第八版贾俊平第一章课后习题及答案总结
  18. 开源人脸识别库,face_recognition
  19. Linux中的screen命令使用
  20. android 谷歌地图真实距离,Android谷歌地图点之间的距离

热门文章

  1. (转载)MatLab绘图
  2. Echarts的常用api
  3. 征途服务器维护后可以判国家吗,12月22日全服更新维护公告
  4. wx._core.wxAssertionError: C++ assertion “GetEventHandler() == this“ failed at ..\..\src\common\winc
  5. 计算机毕业设计 SSM汽车维修保养平台 汽车维修维护平台 汽车信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  6. Linux与.Net Core(二) Centos系统安装和网络配置
  7. ASP.NET网站开发——LINQ TO SQL 查询数据库数据(八大子句)
  8. php中上传图片,原生代码
  9. 微星主板黑苹果_技嘉X79-UD7主板设置一键启动u盘方法【详解】
  10. 计算机电源认证,买PC电源就一定要看80Plus认证吗?