滴滴分布式NoSQL数据库Fusion的演进之路

  作者 | 余汶龙

  编辑 | 薛梁

  Fusion 是滴滴自研的分布式 NoSQL 数据库,完全兼容 Redis 协议,支持超大规模数据持久化和高性能读写。在滴滴内部支撑了数百个业务,具有 PB 级别的数据存储量,是使用最广泛的主存储服务之一。在支持滴滴业务高速发展过程中,积累了很多分布式存储领域的经验,孵化了离线到在线的高速数据导入方案、NewSQL 方案、跨机房同步等,一路解决了 Redis 容量限制、 离线数据在线打通、数据库扩展性差、异地多活容灾等问题。

  本文来自滴滴的技术专家、Fusion 的负责人余汶龙在 2018 年北京 ArchSummit 全球架构师峰会上的演讲内容,重点介绍了 Fusion 的核心设计以及架构演进过程。

  为了讲清楚滴滴自研存储 Fusion 的演进过程,本文将分成 3 个部分:

  诞生背景:滴滴业务发展简介

  演进过程:如何满足业务需求

  海量存储

  FastLoad

  NewSQL

  跨机房多活

  总结 & 展望

  诞生背景

  业务 & 架构演进过程

  滴滴公司成立于 2012 年,刚开始创业阶段技术主要靠外包解决,没太多技术沉淀;发展到了 2014 年,乘客司机和单量都有不错的增长,我们开始构建自己的系统架构,这个时候业务对于存储的需求很单纯,简单用用 MySQL 基本能解决我们的问题;到了 2015 年前后,我们的业务线多了起来,专车快车等开始上线,这个时候我们一方面做了中台系统的重构,另一方面感受到了不小的存储压力,即业务数据量和请求量剧增;到了 2016 年,合并优步前后,日订单量逼近 2000 万,进一步挑战我们的存储系统,于是我们按照不同的业务,对存储进行拆分,因为不同的业务对于存储的需求是不一样的,不同的业务对于吞吐、延迟、容量、数据请求大小等都有不同的需求,分库分表也只是缓兵之计。

  如何有效应对这些个性化需求呢?于是在这个时候,我们就开始孵化滴滴自己的 NoSQL 数据库 Fusion 了,用它来丰富我们滴滴的存储生态,为业务提供更多的存储选择。

  Fusion 是什么?

  前面我们不断提到 Fusion 的关键字,那么是时候正式介绍下 Fusion。Fusion 是一个兼容 Redis 协议的分布式 NoSQL 数据库。定位介于 Redis 与 MySQL 之间的主存储数据库。怎么理解这个定位呢?也就是性能方面我们向 Redis 看齐,即低延迟;持久化能力方面我们向 MySQL 看齐,即 MySQL 具备的多副本、高可用、ACID 事务,我们都是支持的,同时定位为服务打车订单这样的主流程在线业务。

  它如何实现的呢?大家都知道 Redis 的数据是存放于内存中,虽然性能很好,但是容量极小,且每 GB 存储成本很高(大概是我们 Fusion 的 10 倍以上)。于是我们就基于 SSD 磁盘实现了一套分布式的存储系统,在 SSD 磁盘上实现了 Redis 的数据结构,对外通过 proxy 屏蔽内部细节,让用户像访问 Redis 一样访问 Fusion。当前我们已经支持 String\Hash\Bitmap\Set\Sorted Set\List 这些主流的 Redis 数据结构。

  演进过程

  我们 Fusion 的发展总共经历了 4 个阶段,分别解决了 4 类业务问题,我们接下来重点看下具体过程。

  海量存储

  首先来看如何解决海量存储的问题。

  Redis 是一款非常优秀的内存数据库,但它也有这样一些已知问题存在:容量受限于内存、扩容迁移和大 key 过期、删除过程是阻塞的、宕机恢复慢等问题。我们 Fusion 设计之初,就避免了这些问题。具体是如何实现的呢?我们从需求分析出发。

  需求分析

  Fusion 诞生初期,主要解决 2 个业务需求:

  一是滴滴的历史订单,按照前面提到的每日千万级别订单量,很快就能达到几百亿的订单,这么庞大的数据量,存 MySQL 显然是不够灵活的,修改字段、修改索引都比较困难,存 Redis 就更加不可能,因此他们有新型存储的需求;

  二是地图团队的司机行程轨迹,每产生一条打车订单就会产生一条司机行程轨迹,每一条行程轨迹由多个点组成,行程越长轨迹数据越大,这是一个比历史订单的数据量还要大的业务,存储的困难可想而知。

  因此,我们对上述两个业务的需求做了提炼和优先级排定:

  刚需是海量存储。

  具备基本的在线故障处理能力。

  稳定性很重要!

  性能要足够好,以司机行程轨迹为例,每天 300 亿级别写入,他们对性能的追求当然是越高越好。

  接入要求简单,这里我们选择了 Redis 协议。

  打通其他存储系统。

  满足了这些需求后,就诞生了存储系统 Fusion 的雏形。

  架构设计

  软件结构

  下图左边是数据流部分,从下往上看,即 Fusion 是构建在 SSD 磁盘上的存储服务,我们引用优秀的存储引擎 RocksDB 来做磁盘 IO 操作,然后在磁盘之上,我们增加一层 cache 来提升性能,然后封装一层网络框架并支持 Redis RPC,就实现了单机版本的 Fusion 存储节点,然后在单机的基础上加上我们的集群路由管理,Fusion 的集群就搭建好了,当然对外提供服务的时候,还有一层负载均衡。

  下图右边是控制流部分,即我们在 SaltStack 平台基础上,构建了用户系统、运维系统、统计、监控、计费等系统,方便用户以及运维人员使用。

  集群架构

  集群架构上,我们采用 hash 分片的方式来做数据 sharding。从上往下看,用户通过 Redis 协议的客户端(jedis、redigo、hiredis 等)就可以访问 Fusion,首先会经过 VIP 做负载均衡,然后转发到具体 proxy,再由 proxy 转发数据到后端 Fusion 的数据节点。proxy 到后端数据节点的转发,是根据请求的 key 计算 hash 值,然后对 slot 分片数取余,得到一个固定的 slotid,每个 slotid 会固定的映射到一个存储节点,以此解决数据路由问题。

  此外,我们还做了存储生态的打通。支持 Hadoop、MySQL、Redis 的数据同步到 Fusion,也支持 Fusion 数据同步到 MQ,供下游消费。

  小结

  接下来就对 Fusion 做个小结,拿 Redis 来做个简单对比。

  FastLoad

  我们演进过程中,解决的第二个问题是,离线数据到在线系统的快速打通。因此我们做了一个叫 FastLoad 的系统。

  大连哪家×××医院好 http://www.bhnkyy.net/

  大连割包皮需要多少钱 http://www.62671288.net/

  价格费用多少钱 http://www.xasgnk.cn/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章