2T应该很多同学没有见过这样的Redis集群吧「我是第一次遇到」,很庆幸用的是阿里云的「舒服很多啊」,但是依然有很多蛋碎的地方需要跟进解决。
阿里云的Redis架构如下,其实是一个类Codis解决方案,控制台最大规格2T,Proxy 1:1 默认「如果是大客户你可以找他们后台搞」。以2T集群版为例,标配为128个Proxy、128个16G的Redis,理论上普通公司应该不可能用到这么大的单集群规格「官方QPS建议只能作为参考,毕竟都是有业务场景的而且大于1k的key和小于1k的key能一样吗」,但是我们遇到了这个问题升啊升最后都变成256个Proxy、256个8G的Redis了「计算了下还能混半年、一年最多了」
问题
看着架构图很美哦,用云了啥都不用管了,但是慢慢发现Proxy变成瓶颈了「大家自行脑补虽然Redis是单线程的但是内存啊还能慢多少呢,为什么大家自己Google去吧」,容量完全不是问题还是QPS上不去了,Proxy到达了瓶颈两条路要么拆「哎怎么又是拆」,要么自己搞Codis「那基本上不用睡觉了」。
这边就引入一个好东西了Aerospike「这个东西开始玩的时候也不待见,被迫接受维护在之前的公司」,突然发现这个东西其实是可以替换部分2TRedis使用场景的,比如只要把key控制在1k以内那速度接近Redis了,并且可以堆机器了。
AeroSpike是啥
Aerospike是一个高性能、可扩展、可靠性强的NoSQL解决方案,支持RAM和SSD作为存储介质,并专门针对SSD特殊优化,广泛应用于实时竞价「我是互联网广告公司出来的所以晓得这个东西」等实时计算领域。官方保证99%的操作在1ms内完成,并提供集群数据自动Rebalance、集群感知客户端等功能,且支持超大规模数据集(100T级别)的存储。作为KV存储,Aerospike提供多种数据类型,其操作方式和Redis比较类似。除基础功能之外,Aerospike还支持AMC控制台、API等多种监控方式,有集群QPS、健康度、负载等多项监控指标,对运维比较友好。支持集群内数据的自动Rebalance,和Redis集群方案相比,维护成本下降不少,东西是好东西这边就不展开了。「官方文档」
Aerospike采用无模式存储,数据模型类似RDBMS,因而在理解与使用上相对亲切:每个namespace包含多个set,每个set包含多条record,每个record包含多个bin(数据库列),可通过索引key来查询record。不同的业务可以使用同一个集群的不同namespace来作做资源隔离,从而实现资源池化、最大化利用资源的目的。
优点
混合架构:索引存储在 RAM 中,而数据存储在闪存/固态硬盘 (SSD) 上
群集感知客户端软件:客户端知晓数据的存放位置,因此通常能够通过一次单跳检索到数据
无热点:使用哈希函数确保数据均等分布到所有可用节点
数据完整性:保持了高度的一致性,或者允许对跨越多个群集和数据中心的一致性进行调节
线性扩展:添加节点,无需分片,无需人工干预
跨数据中心支持:不同数据中心内的群集能够自动协调,从而实现绝对的可靠性「官方多数据中心同步XDR」
不足之处
Aerospike Rolling Start时间过长(scan整个SSD重建索引)
无法支持复杂的数据类型,例如hyperlog
每个record不能超过1MB
在做rebalance过程中,响应会有所抖动
商业版 Vs 社区版
数据一致性:最终一致性
节点限制:Version 4.x 8Node 「这个就有点坑了、3.x版本可以31个node 但是下不到咯」
跨机房同步:无
快速启动:无
相关文档:企业版与社区版区别、社区版限制「这个就是As无法大规模推广的问题吧、至少在中国」
适合场景
用户画像、用户关系、防作弊
如何迁移呢
直接从Redis迁移到As是不可能的,我们不要一个过渡阶段,万能的Git又发挥了它牛*的作用了。引入一个组件aerodis,想法就是依然保持Redis操作不变后端开始替换数据存储节点,给到研发时间来熟悉As的过渡方案。
Aerodis
Use Aerospike through a Redis interface.Redis is a great product, but can be difficult to scale. Redis cluster solves some issues, but still uses one thread for each server. Aerospike is natively distributed, multi-threaded and has excellent performance.Aerodis implements most of Redis primitives above an Aerospike Cluster.Architecture: Application (which use Redis driver) => Aerodis => Aerospike cluster.I'm using Aerodis from a big PHP application which have used Redis from a long time.I have deployed one instance of Aerodis on each PHP server, and have achieved 50k queries per second on each server, and have reached 500k queries per second on five Aerospike nodes.
Aerodis这个东西其实就是一个指令转换中间件,我们调整了部分指令的实现「毕竟这个东西有点年纪了」,调整了Aerodis连接As失败重试机制而不是原有直接宕了的问题。
注意点
充分利用Cloud的扩展性在SLB、aerodis使用AutoScaling「吐槽Aws的ELB是可以水平扩展的、阿里云的SLB就不行只能垂直升」
在使用的时候需要区分SLB集群配合多套来区分业务,同样Aerodis同样需要,我们也不希望一套组件走天下「SLB+Aerodis」
成本预估
依然按照2TRedis计算接近 200w 一年的花费,ecs.i2.8xlarge * 18 86w 一年的花费,显而易见了是吧「阿里云应该各家公司都有自己的折扣,剩下的钱可以去买企业版、经验告诉我价格肯定是可以谈的,As最多可以到128个node、不够了我们加盘、升配」
测试分享
写在最后
Redis本身是没有问题的,还是使用的上的不妥导致这套方案的出生,希望能给打大家借鉴,这边要感谢两位研发同学给到的充分帮助,感谢「自己动手的研发架构师才是真的架构师」。