应用实战:从Redis到Aerospike,我们踩了这些坑
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《应用实战:从Redis到Aerospike,我们踩了这些坑》,聊聊MySQL、Redis、NoSQL,我们一起来看看吧!
个推专注为开发者们提供消息推送服务多年。通过个推SDK,手机终端与服务器建立长连接,维持在线状态。然而在网络异常等情况下,消息无法实时送达到终端用户,因而推送服务器建立了一份离线消息列表,以待用户重新登录时,进行消息的下发。这部分数据存储在个推Redis集群,整个集群包括主从共百余个实例,key的数量在10亿级别,存储空间在T级别,带来了一定的维护成本和运维挑战。作为个推的后端开发工程师,我们也一直在寻找高性价比的方案。
个推整个集群的QPS在百万级别,若选择使用Aerospike,对比实测下来,我们发现单台搭载单块Inter SSD 4600的物理机,可以达到接近10w的QPS,即几十台机器就可以满足现有的需求,并能够支撑未来较长一段时间的业务需求。
Aerospike的优势
Aerospike是一个高性能、可扩展、可靠性强的NoSQL解决方案,支持RAM和SSD作为存储介质,并专门针对SSD特殊优化,广泛应用于实时竞价等实时计算领域。官方保证99%的操作在1ms内完成,并提供集群数据自动Rebalance、集群感知客户端等功能,且支持超大规模数据集(100T级别)的存储。
作为KV存储,Aerospike提供多种数据类型,其操作方式和Redis比较类似。除基础功能之外,Aerospike还支持AMC控制台、API等多种监控方式,有集群QPS、健康度、负载等多项监控指标,对运维比较友好。支持集群内数据的自动Rebalance,和Redis集群方案相比,维护成本下降不少。
本文主要做一些Aerospike灰度部署、使用方面的经验分享,希望对正在调研或者已经准备使用Aerospike的读者提供一些参考。此外,灰度的理念并不限于Aerospike本身,对其他基础组件的迁移和规划,也能够带来一定的借鉴意义。
数据模型说明

Aerospike采用无模式存储,数据模型类似RDBMS,因而在理解与使用上相对亲切:
每个namespace包含多个set,每个set包含多条record,每个record包含多个bin(数据库列),可通过索引key来查询record。不同的业务可以使用同一个集群的不同namespace来作做资源隔离,从而实现资源池化、最大化利用资源的目的。

灰度上线流程
个推在离线消息列表存储这项业务中使用了较大规模的Redis集群。我们先后调研了ssdb、pika等支持Redis协议的磁盘存储,整体计算下来,Aerospike的性价比最高。
前期我们结合线上场景模拟实际读写比例(分析线上业务,我们发现写和读大致比例在1:1 ~ 1:2之间)进行压测,对可行性进行评估和验证,然后进行投产规划。
线上业务比较庞杂,直接全量切到Aerospike不太现实,风险也比较大。测试网模拟验证难以暴露出生产环境下可能出现的问题,因此我们将整个上线流程划分为观察阶段和灰度阶段。观察阶段顾名思义,原Redis集群仍然承担线上读写业务,只是将同样的流量复制一份导入Aerospike,来进行真实压力验证; 灰度阶段将线上业务逐步切到Aerospike集群,扩大灰度保证集群稳定运行至业务完全切到Aerospike。两个阶段具体操作如下:
观察阶段: Redis操作成功后,对Redis的读写操作以异步方式同步到Aerospike,Aerospike不承担具体业务。下一步是数据双写Redis和Aerospike。该阶段主要观察两边数据是否一致,Aerospike压力等。同时观察阶段可以进行节点重启、集群扩容等运维操作,评估运维成本,优化配置等。这里可使用AMC页面控制台、监控API来监控集群状态,客户端调用部分记录必要日志和监控信息。

灰度阶段: Aerospike开始承担部分应用和任务的离线消息列表存储。灰度阶段Redis和Aerospike数据双写双清,保持热备状态,直至Redis数据完全切换到Aerospike并稳定运行一段时间。

观察阶段非常重要,基本上是对整个方案可行性进行线上评估。这个阶段观察点分为客户端(AS-Client)和服务端(AS-Server)两部分。客户端主要观察:
1.使用metrics监控客户端请求响应耗时,利用一段时间内的请求耗时百分比分布(50%, 90%, 99%, 99.9%),评估系统SLA。
2.监控读写成功、失败等情况的计数。
3.将慢日志阈值设定为50ms,统计高峰期和平常时段的慢日志情况。
4.异步写Aerospike队列监控,合理调整队列大小。
服务端主要观察:
1.集群的健康度。
2.磁盘和内存占用情况,内存空间/磁盘空间比例。

3.机器IO负载、CPU负载、磁盘碎片化程度等信息。
4.集群吞吐量,读写TPS是否能与线上Redis集群相当。

5.数据一致性检查。如何检查观察阶段和灰度阶段两份数据的一致情况?逐key比对差异在性能上难以满足要求。考虑数据完全一致情况下Redis查出的数据应该和Aerospike查出来的数据完全相同,所以抽样记录Redis和Aerospike的数据查询结果记录到日志,对比分析1分钟、5分钟、30分钟、1小时内不一致数据占比。如果线上Key的数量在10亿级别,即便只检查出万分之一的差异,那么不一致的情况也很显著了。这种情况下,就需要排查引发不一致情况的原因并解决。
维护性方面主要考虑到集群数据自动Rebalance会带来一定的性能下降,可能对用户体验有较大影响,结合我们的经验,模拟了一些典型的运维场景:
1.模拟单节点故障导致的集群Rebalance对系统性能的影响。
2.模拟集群扩容导致的集群Rebalance对系统性能的影响。
3.根据对线上业务的影响,计算白天和晚上集群的Rebalance速度,同时支持cron job更新。
4.节点重启。
5.增加SSD挂载。
6.相关配置的优化等。
总结一下,完整的上线流程分为以下几步:

0.模拟线上环境压测,进行可行性验证。
1.将Aerospike客户端封装成类Redis的接口,添加必要日志、监控项,对Bin的有效性检查等。
2.消息服务集成Aerospike客户端,需要的功能包括: Aerospike异步读写,业务数据源切换,流量过滤等。
3.QA功能验证。
4.申请资源,线上部署Aerospike集群。
5.集成Aerospike功能的消息服务上线。
6.观察阶段验证通过后,进入灰度阶段,直至最终上线或中途撤回。
经验总结
在Aerospike使用过程中,我们遇到了一些问题和挑战,总结为下面几点:
1.Aerospike开启single-bin的模式会节省占用空间。
2.Aerospike不会存储原始key,实际索引的是原始key的一个20字节hash值,如果业务需要使用原始key则必须另外设置bin存储。即便key和value值的字节数较少,但key本身占据20个字节,因而实际占用的空间会比较大。
3.Aerospike在节点宕机或是增减节点时会Rebalance数据,这个过程会影响对外服务质量。但Rebalance速度可以控制,因而需要在保证服务质量和集群快速恢复二者间做权衡。
4.社区版本集群每次重启都要重建索引,然后加载到内存,这会导致速度比较慢。namespace需要在配置文件中指定,因而最好能按业务划分,预先分配好将来可能用到的namespace,减少不必要的重启。
5.因为SSD本身存在碎片和写入放大的问题,实际使用中,我们发现若磁盘空间使用量在50%左右,性能下降会比较严重。故可以结合实际业务优化碎片整理相关参数。
6.Aerospike对HotKey有限制,因而频繁对一个key读写时,会返回HotKey错误(errorcode 14) 。服务端可以通过增大 transaction-pending-limit配置来提高对同一个key操作的并发量,它的默认为20,值为0时表示不限。增大该配置可能会降低一定性能。客户端可能需要对该异常增加重试处理,但重试可能会进一步增大HotKey的风险。
7.这种基础组件的更迭一定要尽可能使用线上流量做压力检验,从而尽早暴露潜在问题。
8.观察阶段也要评估运维成本,避免从一个坑跳进另一个坑。
9.使用过程中还需要注意Aerospike的一些固有限制,如一个namespace最多有1023个set 、bin名字长度最多14个单字节字符 、一个namespace最多支持64块SSD 等等,具体可参考:aerospike_known_limitations。
结语
Aerospike作为一个大容量的NoSql解决方案,并未在国内厂中广泛商使用。它适合对容量要求比较大,QPS相对低一些的场景,一定程度上可以节省TCO。支持命令上,Aerospike和Redis比较相像,业务迁移过来也比较容易。它天然地支持集群部署,对监控和运维支持比较友好。尽管拥有这么多优良特性,但技术选型时还是要持审慎态度,预先评估是否符合自己的业务场景,性能和成本是否能够满足要求等。在官方的某些测试场景下,它的性能比Redis还要高,实际上因为SSD本身的限制,大部分情况下,它在QPS方面与Redis差距较大。最后,上线前务必经过线上流量验证,用灰度方式处理实际线上业务,最小化影响用户体验。
理论要掌握,实操不能落!以上关于《应用实战:从Redis到Aerospike,我们踩了这些坑》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

- 上一篇
- MySQL-浅谈存储引擎

- 下一篇
- 阿里云RDS与ECS自建库搭建主从复制
-
- 朴素的小懒猪
- 这篇博文太及时了,很详细,赞 👍👍,码住,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-02-15 00:07:21
-
- 愤怒的樱桃
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享文章!
- 2023-02-01 16:42:00
-
- 数据库 · MySQL | 2天前 |
- MySQL设置中文界面,超简单教程来了!
- 332浏览 收藏
-
- 数据库 · MySQL | 2天前 | mysql 索引提示
- MySQL进阶必看!FORCE/USE/IGNOREINDEX用法大揭秘
- 182浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 手把手教你写MySQL存储过程,小白也能轻松上手
- 163浏览 收藏
-
- 数据库 · MySQL | 2天前 | mysql group by
- MySQL分组查询优化:GROUPBY原理+索引优化超全解析
- 324浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL设置中文语言,轻松拥有中文界面
- 211浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL建库语句从入门到精通:创建数据库+设置字符集&排序规则(附实例)
- 176浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 从零开始学MySQL数据库操作,小白轻松变大神!
- 496浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL插入日期到时间字段,轻松搞定日期格式
- 484浏览 收藏
-
- 数据库 · MySQL | 2天前 | mysql 数据压缩
- MySQL怎么实现高效压缩存储?表压缩+列式存储详细解读
- 272浏览 收藏
-
- 数据库 · MySQL | 2天前 | mysql JOIN优化
- MySQL优化JOIN操作:七大技巧教你提升关联查询速度
- 106浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL出现中文乱码?超详细解决方案一次性搞定
- 211浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL主从复制这样配!搞懂这些参数,replication稳了~
- 131浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 23次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 50次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 58次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 53次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 60次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- Go与Redis实现分布式互斥锁和红锁
- 2022-12-22 117浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- Go+Redis实现延迟队列实操
- 2023-02-23 426浏览
-
- 详解如何利用GORM实现MySQL事务
- 2023-01-07 184浏览