数据库新兵:分布式实时分析内存数据库eSight

近几年,中国数据库的发展迎来了一波小高潮,不仅传统数据库厂商在投入力量,以技术为驱动的互联网企业也在积极投入。在第七届TOP100全球软件案例研究峰会上,笔者发现了一个新面孔——来自饿了么的分布式实时分析内存数据库eSight。

陈永庭 ,饿了么高级架构师。10+年软件研发经验,曾先后就职于WebEx、Cisco、腾讯公司,现就职于饿了么,先后负责饿了么多活架构方案设计、DRC中间件研发、eSight分布式数据库研发、IDC容量评估和服务容量弹性伸缩工作。在高吞吐、高可靠性服务架构、海量数据存储等方面具备丰富的经验。

项目背景

一般来说,一个新产品的诞生必定伴随着业务或技术的瓶颈,eSight的诞生也不例外。以一个很小的场景为例,假设一个外卖平台在通常情况下日订单是超过一千万,但是某一天突然订单数量下降了。那么,老板就一定会去问产品人员、运营人员或者是数据分析师,“为什么会订单下降了?”但是在这样的数据级别下,员工很难快速实时的对数据做出诊断,并定位到出现问题的原因。

面对这样的场景,饿了么也很困惑。之前,饿了么内部有一个专门的大数据部门负责这一场景,但是实时性远远达不到要求,很多数据需要T+1的时间或者几个小时的延迟时间才能看到结果,往往会失去最佳的处理时间。

为了弥补当前大数据平台不能满足实时数据分析的场景,陈永庭及其团队在2017年8月份开始调研新技术,调研过程中发现Facebook有三大典型的大数据存储分析场景,分别为ODS、Scuba和Hive,其中Scuba paper很具有参考意义,eSight也正是站在Scuba paper的肩膀上诞生的。

据陈永庭介绍,eSight的研发团队大概是三到四个人,从调研到Beta版本上线只花了5个月时间。

架构设计与功能特点

eSight的架构设计如上图所示, 支持MySQL command和HTTP query,其中所有计算节点都聚合成aggregator tree并行计算,存储节点可在单个服务器或并行计算中同时启动N个节点,且存储节点也可以支持少量的计算,单机支持超过百万的TPS。

eSight的关键设计和亮点功能主要集中在以下几个方面:面向列的设计、极致的查询响应、并行计算、矢量化查询处理、数据编码与数据压缩、cross IDC、数据持久化、数据恢复与数据副本以及SQL查询。除此之外,eSight还弱化了以下功能,limited update、limited data availability和limited data replicas,完全摒弃了transaction、able join、delete和advanced standard SQL query功能。

性能测试

立项之初,饿了么在国内并没有找到非常匹配自己使用场景的、已公开的技术产品,但是产品上线之后,饿了么发现了俄罗斯最大的搜索公司发布过一款类似产品——ClickHouse。

ClickHouse和eSight虽然功能类似,但是在架构设计和部署方式等方面有所不同,所以为了更详细的对比两款产品,饿了么做了性能测试。其中,ClickHouse的性能数据来自官方公开的数据,所以测试结果只做参考。

与其它PB级产品不同,eSight和ClickHouse适用的场景不需要存储这么多的数据,但是性能要求很高,可能要是类似于Hive这样产品的好几个数量级。从上图来看,我们可以发现eSight和ClickHouse的性能总体是在一个数量级上的,但是各自都有擅长的领域。

在首次查询,eSight的性能明显要更好,因为eSight是纯内存的,而ClickHouse首次查询会涉及到磁盘数据的读写;在某些特殊场景下,尤其是数据量级别特别小(百万级别)的时候,ClickHouse因为做了极致的内存优化,性能表现极其突出,而eSight因为是分布式的设计,测试环境又是多机房,所以百万级数据量和亿级数据量,性能差距不大。

何时eSight的性能表现最为突出呢?陈永庭表示当数据容量在100G到500G的范围内,数据量不低于10亿条记录时,整个eSight集群的查询性能和低延时都表现得很好,99%的查询请求会在10秒之内返回结果。

未来计划

任何产品都不是一蹴而就的,而是不断经过演进的,陈永庭也透露了一些eSight未来的计划。

目前,eSight服务于饿了么整个机房,所以计算节点未来要适配于容器化部署,存储节点也要考虑使用用分布式的存储文件系统来做整个存储的载体。在性能方面也会做相应的优化,例如有些集群比较小,可能只有10台机器,如果用户查询的数据量非常大,那么就极有可能导致节点负载很高,出现内存被打满或者导致整个进程退出等情况。造成这种情况的原因有很多,一方面是查询的数据量确实很大导致整个节点无法满足查询要求,针对此饿了么会做了一些保护。另一方面,eSight的技术设计方面可能还不够细腻,类似于对象在内存中的分配、对象的大小等等都还需要做一个非常极致的精简化设计。

对于未来的发展推广规划,陈永庭也有自己的看法,首先eSight是一个分布式数据库产品,数据库产品最有价值的地方就是里面存放的数据,其次就是作为工具产品的稳定性,各个技术指标要达到可靠性的预期。所以,接下来eSight团队的重点会落在接入更多核心业务数据,并且在数据积累的基础上,建立各种数据应用场景的玩法。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31545814/viewspace-2285405/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31545814/viewspace-2285405/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MemDB 是全球首个支持分布式事务的 MongoDB。高性能和可伸缩快速的内存数据访问,高达 25,000 ops (single doc read/write) /碎片 (each shard take one CPU core).系统可水平伸缩没有单点瓶颈真正的分布式 ACID 事务在分布式环境真正支持 ACID (Stands for Atomicity, Consistency, Isolation, Durability) 事务MemDB 让 MongoDB 支持 ACID 事务兼容 MongoDB 和 Mongoose直接使用 MongoDB 的查询 API内置 Mongoose 支持高可用性每个碎片都有一个或者多个 slaves,不会发生单点故障 MemDB shell:架构:Mdbgoose:var memdb = require('memdb-client'); var P = memdb.Promise; var mdbgoose = memdb.goose; // Define player schema var playerSchema = new mdbgoose.Schema({     _id : String,     name : String,     areaId : Number,     deviceType : Number,     deviceId : String,     items : [mdbgoose.SchemaTypes.Mixed], }, {collection : 'player'}); // Define player model var Player = mdbgoose.model('player', playerSchema); var main = P.coroutine(function*(){     // Connect to memdb     yield mdbgoose.connectAsync({         shards : { // specify all shards here             s1 : {host : '127.0.0.1', port: 31017},             s2 : {host : '127.0.0.1', port: 31018},         }     });     // Make a transaction in s1     yield mdbgoose.transactionAsync(P.coroutine(function*(){         var player = new Player({             _id : 'p1',             name: 'rain',             areaId : 1,             deviceType : 1,             deviceId : 'id1',             items : [],         });         // insert a player         yield player.saveAsync();         // find player by id         var doc = yield Player.findByIdAsync('p1');         console.log('%j', doc);         // find player by areaId, return array of players         var docs = yield Player.findAsync({areaId : 1});         console.log('%j', docs);         // find player by deviceType and deviceId         player = yield Player.findOneAsync({deviceType : 1, deviceId : 'id1'});         // update player         player.areaId = 2;         yield player.saveAsync();         // remove the player         yield player.removeAsync();     }), 's1'); }); if (require.main === module) {     main().finally(process.exit); } 标签:MemDB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值