Redis Cluster 迁移案例

背景简介

Grab 是东南亚的打车巨头,app 下载量已有 5500 万,司机有 120 万

app 与 server 通信时需要使用一个认证 token,Grab 使用 Redis 来缓存 token,使用 Mysql 来持久化备份

之前 Redis 是单节点结构,今年年初时 Grab 意识到这个结构很快就会支撑不住,因为用户增长太快

选择解决方案

备选方案

(1)使用多节点复制结构

之前的单点结构是设计上的缺陷,容错性很差,现在正是个修补的机会,可以使用 Redis 复制结构来提升容错性

但这也点问题,当 master 出现问题时,选择 slave 提升为 master 这个过程需要时间,这段时间内的写操作会受到影响

(2)自建 Redis Cluster

Redis Cluster 的确能够解决可用性问题,但会有其他麻烦:

  1. 分片依赖客户端,所以客户端的复杂度增加了
  2. 添加新的分片时比较麻烦,需要自己设计迁移逻辑,选择好一批用户信息,从现有节点上移动到新的节点

(3)使用 AWS 的弹性缓存服务

可以按需添加每个分片的复制节点,可以在服务端完成数据切分,AWS 来为我们操心分片策略,但不支持添加新的分片

选择

Grab 最想要的是水平扩展能力,在请求压力加大时可以轻松的增加处理能力

AWS 的弹性缓存服务是最适合的,每个分片可以动态添加复制节点,很好的支持了读数据能力的水平扩展,但不能够添加分片,这就限制了写数据能力的扩展

读写能力都需要很好的扩展性吗?经过统计发现,主要压力是在读上

写负载:

读负载:

写负载并不太高,提前规划好容量就可以了,Grab 统计了过去6个月的增长率,对容量进行了评估,最后决定使用3个分片,每个分片2个复制节点,一共9个节点

迁移过程

决定使用 AWS Redis Cluster 弹性缓存服务之后,就需要把现有的单点 Redis 中的数据迁移到 AWS,并把读写操作也转过去

Grab 把整个迁移过程拆分成了6步,来保证绝对的安全稳定

第1步

把数据从老的 Redis 节点迁移到 Redis Cluster,这个过程比较简单,因为 cluster 还没有开始处理线上流量

需要考虑的就是不要影响老节点的性能,Grab 使用了 scan,dump,restore这些高效的命令把影响降到最低

第2步

应用开始向 cluster 中写数据,写入老节点的时候异步写入 cluster

这个过程对原有业务流程没有任何影响,可以验证是否出错、写入过程是否符合预期

第3步

上一步没问题后,使用同步模式向 cluster 中写入,真正参与到业务流程中,如果出现问题,就会影响真实的 API 调用结果,在真实环境中检验

第4步

读操作时,异步读取 cluster 中的数据,与老节点中的结果进行对比验证

这个过程对原有流程也没有影响,就是用来验证新老数据源是否同步

第5步

把所有读操作完全转到 cluster,停止对老Redis的读取,至此,API 完全依赖于新的 redis-cluster

第6步

停止向老 Redis 写,彻底停掉与其的任何交互,迁移完成

每个步骤都是使用配置进行控制,如果出现了不可预知的情况,便可以快速的回退到初始状态

小结

Grab 这次 Redis 迁移的过程并不复杂,但他们的分析思路和严谨的态度很值得借鉴

本文翻译正自理 Grab 的技术文章

http://engineering.grab.com/migrating-existing-datastores

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2017-08-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏即时通讯技术

移动端IM中大规模群消息的推送如何保证效率、实时性?

众所周之,群聊是移动端IM的服务端技术难点所在,难在哪?大量的群聊消息,是一条条推给群内成员还是可以使用什么样的优化策略?试想一个2000人大群,一条消息的发出...

1121
来自专栏程序员的知识天地

还在付费爱奇艺VIP?神级程序员教你用Python任意下!

我相信如果看电影的都知道,不管是爱奇艺还是腾讯视频还是优酷很多的电影电视都是需要VIP的,但是为了看这么一个电视或者电影开个vip又不是很划算。

1881
来自专栏开发与安全

建议程序员都读一读的31篇论文系列笔记(1~2)

序:前几日网上偶然看到”程序员必读论文系列“,顺便搜了一下,发现有多个版本共31篇,不过看起来都不错,故准备花时间都读一下,可以拓宽下视野。来源论文题目主要参考...

2400
来自专栏Eternally运维

FinalShell – SSH终端,同屏SFTP,同步目录切换一体化服务器管理

简介 FinalShell是一体化的的服务器,网络管理软件,功能强大的开发,运维工具,充分满足开发,运维需求.

1921
来自专栏java工会

BAT的大牛都经常犯的逻辑错误,看看你有没有

编程的时候经常会遇到一类错误,就是明明代码没有问题。编译也可以通过,但是运行的时候就会抛异常,这就是所谓的逻辑错误了。编译时的错误很好发现,因为编辑器会友好的提...

883
来自专栏搜云库

分布式和集群区别?什么是云计算平台?分布式的应用场景?

分布式是指将一个业务拆分不同的子业务,分布在不同的机器上执行,集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机,一个云计算平台,就是通过一套软件系...

93410
来自专栏即时通讯技术

腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ、微信、淘宝。那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会...

2062
来自专栏腾讯移动品质中心TMQ的专栏

后台性能测试不可不知的二三事

某月黑风高之夜,某打车平台上线了一大波(G+)优惠活动,众人纷纷下单。于是乎,该打车平台使用的智能提示服务扛不住直接趴窝了(如下图)。事后,负责智能提示服务开发...

5457
来自专栏Python小白进阶之旅

学会了爬虫,然后我一不小心就统治了整个Python吧

2238
来自专栏架构师小秘圈

那些年不加班的开发团队的秘密,原因竟是因为持续集成!

持续集成,让很多开发团队又 「 爱 」 又 「 恨 」 。爱,在于整个流程对项目的交付价值大有裨益,尽最大可能地减少不必要的加班;恨,在于成本过大,部署的困难、...

4495

扫码关注云+社区

领取腾讯云代金券