在Redis集群技术上,你不可错过的四大集成者

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 阿里云开源的飞天缓存ApsaraCache、Redis Enterprise、Codis和Redisson功能及特点总结和分析

前阵子有幸现场聆听了云栖大会Redis专场的分享,可以说是不虚此行:会上见到了Redis之父Salvatore Sanfilippo,Redis labs CTO Yiftach Shoolman,Redisson 联合创始人 Jack Gu,Codis 作者王乃峥以及阿里云Redis团队的众多技术大牛。演讲的内容干货也很多,这里稍作总结跟大家分享。

一、阿里云ApsaraCache

先介绍一下阿里云开源的飞天缓存ApsaraCache项目(https://github.com/alibaba/ApsaraCache),这是在社区2.8版基础上开始维护的分支,并backport了部分3.0分支的功能。

那与社区版Redis相比有哪些特点呢?阿里云技术专家白宸在演讲中做了很详细的介绍,先从架构上有一个整体的认识:

架构图

image.png

特点:

image.png

与Redis相比,ApsaraCache的显著特点是与场景有关,与数据规模无关。其技术特点和优势,主要表现在:

  • 灾备深度加固,可以重构内核同步机制,解决了原生内核在弱网条件下容易复制中断导致的全量同步问题。(作者注:社区版2.8引入psync机制在一定程度上解决了类似问题)

  • 兼容Memcached协议,能支持双副本的Memcached,数据可持久化,提供更可靠的Memcached服务。(作者注:Memcached是一种in-memory KV 存储,实例重启数据丢失,极容易导致“雪崩”)

  • 短链接优化,使短链接场景下性能提升30%以上,对PHP短连接应用居多的应用提升效果明显。

  • AOF强化,避免AOF Rewrite频繁造成的主机稳定性瓶颈,且能精确到秒级的按时间点恢复。(作者注:单机上部署多个实例如同时触发bgsave或bgrewriteaof操作,在copy-on-write机制作用下,非常可能会导致服务器内存很快耗尽,从而导致Redis服务崩溃,微博也作了类似的改造,废弃掉了aof重写机制,增加了定时持久化操作的配置项cronsave,相当于一个定时任务)

  • 独特的热升级机制,增加了热升级的功能,能够在3ms内完成一个实例的热更新。(作者注:这个功能可以避免由于升级造成的业务影响)

  • 实例的可用性检测等。

除了上面的,在Redis Cluster上面,阿里云团队也做了很多的工作,比如:

  1. 集群支持select、pub/sub、blpop的能力;

  2. 对热key的感知和处理;

  3. 读写分离;

  4. 多数据中心的灾备以及稳定可靠的基于aof log的复制等。

image.png

image.png

二、Redis Enterprise

来自Redis labs的联合创始人&CTO YiftachShoolman先生在会上提到的一点非常有意思,根据similarweb.com的统计,在Redis使用者TOP5中,中国排第一,远超第二名美国,可见国内Redis用户群体之多。

image.png

另外,他还给大家普及了一下Redis的基础,比如Redis的数据结构。

image.png

Redis modules 这个功能,相信大家不陌生吧?就是Redis labs这个公司所提出的,并且在此基础上开发了很多的扩展功能,其中本文作者就翻译过其中几篇介绍的文章,比如有:ReJSON、Redis-ML、RediSearch等。

链接:

  • http://www.sohu.com/a/155063241_99937638

  • http://www.sohu.com/a/155010567_99937638

  • http://www.sohu.com/a/154690419_99937638

还讲了很多关于Redis labs产品相关的内容,最后讲到了Redis 企业版的优势,听上去他们真的做了很多的事情,有很多值得学习地方。如下:

image.png

image.png

image.png

image.png

三、Codis集群演化和Redis异步迁移

1、Codis集群演化

Codis作者spinlock9首先分享了Codis出现的背景和开发中的挑战,他们也跟大多公司一样,也经历过多次的技术选型上的迭代,也曾在Redis + Twemproxy和Redis Cluster进行过尝试,踩过坑,比如twitter 在2015年就不再贡献Twemproxy代码,它最大的缺点是一个静态的Sharding 策略,随着业务的增长也几乎没有办法进行动态的扩缩容。而当时Redis Cluster也只是推出了beta版本,对于线上的业务存在风险。故最终确定在2014年酝酿要开发Codis,15年开始Release出来,会上他介绍了开发过程需要解决的问题,比如:


  • 兼容所有语言的客户端

  • 能支持GB到TB级别的水平扩展能力

  • 也能提供Redis同样的高吞吐和低延迟的优势

  • 高可用等

挑战:

image.png

Redis Cluster和Codis的特性比较:

image.png

需要特别提醒一下的是:Codis在3.2版本的时候就允许异步迁移,能够进行平滑的扩容缩容,这是比Redis Cluster进步的地方。

架构设计:

image.png

优缺点:

image.png

特性介绍

高吞吐

  • - 指令流水

  • - 实现效率 + 优化GC

并发多连接

  • - 单连接 – Redis

  • - 多连接 – SSD(RocksDB)

多DB支持

  • - 默认16个DB

访问控制

  • - 指令黑名单

  • - SessionAuth – Proxy 独立配置

  • - ProductAuth – Codis 集群共享

读写分离 – 跨机房优化(默认是关闭的)

  • - 牺牲一致性

  • - 写:写主

  • - 读:同IP > 同IDC > 跨IDC (优先级策略)

高可用

  • - Sentinel 替换了HA

image.png

image.png

他还讲述了未来的规划,提到了有如下几点:

  • - 兼容Redis,升级到Redis4.2,做到最小修改,兼容分片策略等;

  • - 完善Codis,完善K8S的支持,提升自动化部署程度、实现Transaction等,集成Sentinel功能等。

更大的挑战

  • - 更大的副本容量:单副本100TB以上

  • - 更高的集群吞吐:QPS 500 ~ 1000w/s

  • - 更复杂的访问模式1)普通业务 – 低延迟

    2)数据平台 – 高吞吐

  • Codis + RocksDB开源方案Pika

image.png

2、Redis异步迁移

听到这里时,还以为上面是重点,结果不是,重点下面才真正开始。

image.png

Redis同步迁移存在的问题:

降低服务质量

  • - 阻塞服务

  • - 误触HA、丢失数据

限制数据规模

  • - 实际建议<2MB(RESP限制<512MB)

迁移受网络质量(RTT)影响

  • - 增加阻塞时间、降低迁移效率

增加错误处理难度

  • - 错误恢复困难、人工介入困难

举个栗子:

image.png

那么上述的问题的解决思路是什么呢?他继续分享到:

指令分解

  • - 单个复杂、耗时的操作,分解成多个简单、高效的指令

  • - 分摊CPU分摊,单指令us级别

  • - 支持AUTH、SELECT指令

异步IO + 指令流水

  • - 连接复用

  • - 流量控制 – 发送窗口

  • - 批量迁移(Batch)

错误处理 – 脏数据处理

  • - 主动清理

  • - 过期清理

迁移状态机

  • - 发送窗口初始化

  • - 确定传输模式:简单 or 分片?

  • - 连接初始化(start)

  • - REPLACE语义

  • - 发送分片(Chunked)

  • - 临时TTL = RTT x 3

  • - 迁移完成

  • - 重置TTL

  • - 标记完成(Done)

  • - 异步删除 – BIO thread

访问冲突

  • - 迁移间隙 – Key Missing

  • - 迁移过程中 – 1)读 – 迁冲突; 2)写 – 迁冲突;3)Key Missing

image.png

image.png

image.png

image.png

image.png

四、Redisson

Redisson是什么?以及Redisson专业版有哪些特性和优点?Redisson联合创始人顾睿从Redisson使用上,举例“如何利用Redisson分布式化传统web项目”的分享,算是对之前内容的一个很好的补充和论证。(Redisson项目地址:https://github.com/redisson/redisson) 传统Web项目的基本架构


image.png

传统Web项目的典型特征:

  • - 非分布式

  • - 非高可用

  • - 非高并发

什么是分布式系统?

  • - 网络 – 高度互联

  • - 集群 – 多节点

  • - 单一 – 透明化

分布式系统的特点:

  • - 开放性

  • - 透明性

  • - 扩展性

  • - 并发性

分布式化的实现方式有哪些呢?

  • - 架构细分

  • - 服务化、模块化

  • - 数据中心化

  • - 事件驱动

分布式系统会遇到哪些挑战?

image.png

image.png

image.png

接着他分享了Redis以及Redisson的概念和特点的介绍,这里为了节省篇幅,省略N多文字,但为了后面的理解,多啰嗦一句:Redisson是操作最简单,功能最丰富的Redis智能客户端,为JVM提供基于Redis的高性能驻内存数据网格。那Redisson的智能化又是体现在哪些方面呢?

image.png

image.png

Redisson是如此智能的客户端,那相比其它的普通客户端又有怎样的差异和优势呢?

image.png

image.png

回到主题上,Redisson可以解决传统Web项目分布式化?那它是怎么做到的?当时由于时间的关系,Jack Gu只是从两个方面进行了讲解,相信能在更多的方面进行解决,这两个方面分别是从数据缓存的角度和分布式锁的角度进行分享。

Redisson映射

  • Redis基本结构:Redis Hash

  • Java 接口:java.util.Map、java.util.concurrent.ConcurrentMap

  • 缓存设计模式:Read Through、Write Through、Write Behind

  • 数据预热:Data Preload

防缓存穿透,在Redisson上做了一些改进:

image.png

Redisson映射数据缓存的两种方案:

image.png

image.png

image.png

image.png

在锁上Redisson又做了哪些改进来满足分布式的需求呢?

image.png

image.png

image.png

image.png

看着上面的简单描述,各种名词似曾相识吧?真正要用起来,还是需要花些时间慢慢消化的。Redisson在一定程度上减少了使用的复杂性,提高了业务性能,提升了开发效率,可以尝试一下。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
376 0
|
20天前
|
缓存 NoSQL Redis
Python缓存技术(Memcached、Redis)面试题解析
【4月更文挑战第18天】本文探讨了Python面试中关于Memcached和Redis的常见问题,包括两者的基础概念、特性对比、客户端使用、缓存策略及应用场景。同时,文章指出了易错点,如数据不一致和缓存淘汰策略,并提供了实战代码示例,帮助读者掌握这两款内存键值存储系统的使用和优化技巧。通过理解其核心特性和避免常见错误,可以提升在面试中的表现。
26 2
|
5天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
10天前
|
缓存 NoSQL Java
springboot业务开发--springboot集成redis解决缓存雪崩穿透问题
该文介绍了缓存使用中可能出现的三个问题及解决方案:缓存穿透、缓存击穿和缓存雪崩。为防止缓存穿透,可校验请求数据并缓存空值;缓存击穿可采用限流、热点数据预加载或加锁策略;缓存雪崩则需避免同一时间大量缓存失效,可设置随机过期时间。文章还提及了Spring Boot中Redis缓存的配置,包括缓存null值、使用前缀和自定义过期时间,并提供了改造代码以实现缓存到期时间的个性化设置。
|
11天前
|
监控 JavaScript 前端开发
【TypeScript技术专栏】TypeScript的单元测试与集成测试
【4月更文挑战第30天】本文讨论了在TypeScript项目中实施单元测试和集成测试的重要性。单元测试专注于验证单个函数、类或模块的行为,而集成测试关注不同组件的协作。选用合适的测试框架(如Jest、Mocha),配置测试环境,编写测试用例,并利用模拟和存根进行隔离是关键。集成测试则涉及组件间的交互,需定义测试范围,设置测试数据并解决可能出现的集成问题。将这些测试整合到CI/CD流程中,能确保代码质量和快速响应变化。
|
11天前
|
前端开发 定位技术 API
【Flutter前端技术开发专栏】Flutter中的第三方服务集成(如支付、地图等)
【4月更文挑战第30天】本文介绍了在Flutter中集成第三方服务,如支付和地图,以增强应用功能和用户体验。开发者可通过官方或社区插件集成服务,关注服务选择、API调用、错误处理和用户体验。支付集成涉及选择服务、获取API密钥、引入插件、调用API及处理结果。地图集成则需选择地图服务、获取API密钥、初始化地图并添加交互功能。集成时注意选择稳定插件、阅读文档、处理异常、优化性能和遵循安全规范。随着Flutter生态发展,更多第三方服务将可供选择。
【Flutter前端技术开发专栏】Flutter中的第三方服务集成(如支付、地图等)
|
11天前
|
Dart 前端开发 Android开发
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
【4月更文挑战第30天】本文探讨了如何在Flutter中集成和交互原生代码,以利用特定平台的API和库。当需要访问如蓝牙、特定支付SDK或复杂动画时,集成原生代码能提升效率和性能。集成方法包括:使用Platform Channel进行通信,借助现有Flutter插件,以及Android和iOS的Embedding。文中通过一个电池信息获取的例子展示了如何使用`MethodChannel`在Dart和原生代码间传递调用。这些技术使开发者能充分利用原生功能,加速开发进程。
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
|
11天前
|
传感器 前端开发 Android开发
【Flutter 前端技术开发专栏】Flutter 中的插件开发与集成
【4月更文挑战第30天】本文探讨了Flutter插件开发的关键技术和实践,包括插件作为连接Flutter与原生功能桥梁的角色,开发流程(定义接口、实现原生代码、打包发布),以及集成方法(添加依赖、初始化)。文中提到了多媒体、传感器和文件系统等常见插件类型,并以相机插件为例说明开发步骤。此外,还强调了版本兼容性、性能优化和错误处理的注意事项,推荐了开发工具和资源。随着Flutter的发展,插件开发将更加重要,未来有望形成更丰富的生态系统。
【Flutter 前端技术开发专栏】Flutter 中的插件开发与集成
|
17天前
|
缓存 NoSQL Redis
软件体系结构 - 缓存技术(7)Redis持久化方法
【4月更文挑战第20天】软件体系结构 - 缓存技术(7)Redis持久化方法
87 14
|
17天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
140 10

热门文章

最新文章