`
luoshi0801
  • 浏览: 147404 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

tlog数据存储

 
阅读更多
Tlog采用了hbase+云梯的存储方案,分别对应实时和离线的数据服务,它们在tlog中的场景描述为:

实时服务如查看近2分钟某应用的服务调用情况;检索一笔彩票订单目前的流程状态。它们的特点是数据粒度细、实时性要求高、不能重复计算或重复计算结果不一致、稳定性差

离线服务如统计昨天提供调用次数最多的前10个服务;分析前一个月里售出彩种ID=1的总额最高的代理商和最低代理商,金额分别是多少。与实时服务相反,它们的特点是数据粒度粗、时间跨度大、能重复计算、结果一致稳定

       可以看出,实时和离线可以互补长短,为接入方提供多层次个性化的数据服务。当然服务的前提是有数据,也就是如何存下来,且在大数据量下必须是高效的、稳定的。

1)写HBase

需要考虑两种类型的存储数据:一种是需要快速检索的业务数据,另一种是实时展现的统计数据。对于前者具体又可分为带唯一业务标识和不带唯一业务标识的情况,带唯一标识的如彩票检索,订单号就是唯一的标识号,只需将订单号设计为rowkey,再将该订单不同状态的日志放入同一column family(cf)的不同qualifier中就可以通过订单号快速检索该笔彩票的状态信息了;而没有唯一标识的业务类型在存储时可能导致rowkey冲突老数据被覆盖,如操作日志即使以日志类型+时间戳也不能作为唯一的rowkey设计,这时对整条日志采用碰撞率低的定长编码算法是一个很好方法,如CRC32,通过将编码放在rowkey的最后即可解决冲突的问题。如果存储的是基于时序的统计数据,对于hbase存储模型的设计就需要更加注意了,因为这类数据不仅量大(如秒级统计)而且往往附带按某种维度的聚合操作,设计不好就会给存储和查询带来性能问题。关于这类数据的存储,业界基于hbase的开源产品Opentsdb给出了解决方案,这里介绍下其schemal设计和异步hbase模型

Ø  OpenTsdbSchemal设计:

 

 

Figure 1.1 opentsdbSchemal

众所周知,与通常RDMS相比,hbase是一个schema-less、面向列存储的nosql数据库,定位一个列元数据至多会经过rowkey->cf->qualifier->version四层索引,其中cf必须在表定义时就指定无法通过后期动态扩展,而version的定位是通过timestamp解决cell数据冲突的,所以大多数实际情况下只有rowkeyqualifier两级索引可以利用。对于time-serial性质的数据,如果每个时间细粒度(假设为秒)的数据都放入rowkey,则会导致region数暴增第一级索引成为瓶颈,opentsdb采用将秒粒度的时间戳变为小时粒度后保留在rowkey中,而将具体的秒信息转化为对小时粒度时间戳的偏移量放入quliafier中,这样一来region数量大大减少,quliafier的数量也不会成为瓶颈(60*60=3600个)。更重要的是每个row中的数据更加聚合,为高效检索提供了保证,因为

a)              hbase的底层存储是HFile文件(基于Hdfsblock数据块),row中的cf可以拥有多个HFile文件,但同一HFile文件中的数据必定属于同一cf,这有利于在读取同一cf数据时尽量少跨HFile或不跨HFile,使需求密集型的数据聚合在同一row中的cf下迎合了hbase这种天然的物理存储特性,大大提高了数据的访问效能。

b)              以时间粗粒度rowkey+细粒度qualifer的方式也很容易满足用户不同粒度的检索需求,假设要查询某小时前10分钟的数据,可以通过hbase自带的qualifierFilter在服务端过滤数据,而无需将小时的数据由服务端全部返回客户端后再自行过滤

另外,opentsdb为了让rowkey包含更多的检索信息,将维度信息以kv对的形式放入rowkey中,当然kv对的数量必须是有限的,opentsdb以正则过滤的方式满足用户对源数据不同维度的检索要求。同时,opentsdb还对metrictag进行了编码、以及入库数据的压缩,这些都大大降低了数据存储量。

Ø  异步hbase模型

相比hbase自带的同步HTable APIOpenTsdb自己实现了的AsynHbase具有高效、非阻塞、线程安全等特点,在顺序读和写的响应性能上提高了一倍[4]



 

Figure 1.2 opentsdbAsynHbase

       如图1.2,异步化过程描述为:请求者(Data Sink)发送数据请求,获得异步化结果Deferred,注册回调器callbacksDeferred,完成客户端逻辑所在线程返回;服务端异步执行数据请求服务,将结果写入Deferred,之后触发并执行回调器callbacks,继续数据请求后暂停的逻辑。其中关键的两个地方在于DeferredCallbacks(异常处理时对应errbacks

a)      Deferred

JDK中的Future类似,Deferred也是一种在有限状态机中表示结果暂不可达(not yet available)的状态。不同的是,Deferred绑定了callbacks,而Future只能在后续某个时刻手动地通过get方式拿到异步调用结果,Future的问题就在于调用者并不清楚什么时候结果准备好了。

b)      Callbacks

准确地说,应该是回调链(callbakc chain),链上的前一个callback将返回结果作为参数传递给下一个callback,以此类推直到链末。下面以一个由浅入深的例子来理解下回调链。

假设我们要以RPC的方式从远程主机上获得一些感兴趣的数据,如图1.2,首先通过一个socket发送请求,获得Deferred,并将后续逻辑以callback方式注册到Deferred上。此时回调链上只有我们定义的一个callback

1st callback

Deferred:  user callback

进一步我们需要在客户端增加一层cache以提高性能。考虑缓存未命中的情况,RPC返回的结果首先需要在cache中缓存起来,然后才执行RPC后的逻辑。这时,回调链上是两个callback

     1st callback       2nd callback
                          Deferred:  add to cache  -->  user callback

更进一步,考虑到网络上回来的都是原始字节流,而cache和使用时都是数据对象,所以抽象出更底层的逻辑:验证字节流并反序列化为对象。这时,回调链上是三个callback

               1st callback          2nd callback       3rd callback
Deferred: validate & de-serialize  -->  add to cache  -->  user callback
              result: de-serialized object

最后,考虑复杂的情况,RPC的数据服务方是一个分布式集群,有master/slave之分,这意味着需要两阶段的RPC来请求数据。第一阶段,与master通信获得数据所在的slave;第二阶段,从slave上获取需要的数据,分别对应下面的AB

(A)     1nd callback    2nd callback    |    (B)      1st callback
Deferred: index lookup    user callback   |   Deferred:  resume (A)
result: lookup response   Deferred (B)    |   result: byte array

A中,1nd callback通过与master通信返回了slave地址,传递slave地址给user callback并执行第二阶段RPC。由于Auser callback返回的是一个Deferred,调用链在user callback时被中止了(not yet available),所以需要在B中的callback返回结果后恢复A中的调用链。这里体现了DeferredFuture不同的另一大特点:嵌套。通过Deferred的嵌套和调用链组合,可以灵活动态地构建异步处理管道(processing pipeline)。

在使用AsynHbase模型的时候需要明确和注意以下几点:

l  任何时候回调链上最多只能有一个线程在执行

l  回调链上的回调执行有严格的先后顺序,如果一个变量不是共享的,则无需同步

l  将初始结果放入Deferred的线程即执行回调链的线程,中间没有线程切换

l  只要callback开始执行了,Deferred就失去了对其引用

l  Deferred增加一个callback的代价是O(1)

l  相互循环的Deferred依赖可能导致无限递归,应避免

l  CallbackErrback不能接受Deferred本身为参数

 

2)写云梯

       写云梯最重要的就是IO吞吐量。经测试,采用Lzo压缩方式时单机单线程的写速率在10m/s+,单机多线程能提高写效率,当并发度为机器核数时(tlog5核虚拟机)能达到峰值,近30m/s刚好满足高峰期的数据流量(tlog目前14台服务器,每天10T+的流量,平均每台约10m/s,高峰期30m/s)。所以,tlog中不同server的不同storm任务都会成为一条向云梯传送数据的通道,对应云梯的文件句柄用“ip+taskId+timestamp”区分,timestamp是每小时滚动一次的时间戳标记。Tlog中曾经为写云梯设计了缓冲机制,本质就是一个简单的生产消费者模型,生产者从一头不断获得源日志往缓冲队列中放,当队列满就阻塞;而消费者从另一头读取日志往云梯写,发现队列空就等待。后来发现其实这样没有必要,因为写hdfs具有天然的缓存机制,那就是buffer数据首先被刷入buffer,待到满足预设的大小(事实证明buffer越大写速率越高,如128M的写效率高于64M)后整块数据再往云梯搬,自己加缓存效果不佳反而会增大线程切换和内存开销。另外,为了减小使用storm带来的数据流转开销,tlog原则上是能先入库的数据绝不流转,入云梯理应在收集器采集到数据立刻进行,后续才是Hbasetlog目前也确实这么做的。但这里需要说明一点的是tlog没有将入云梯和入hbase两块进行解耦,也就是说,如果写云梯失败了,会间接阻塞写hbase。是否值得这样做,答案是肯定的。云梯上存的是全量的原始数据,是追述问题的依据,即使入hbase失败或客户端数据滚动丢失,只要云梯上保留得有就有办法恢复,所以从数据的准确性和完整性上tlog将云梯的优先级放大了。但目前遇到一个很囧的问题就是云梯升级较频繁,每次升级花费两个小时导致tlog系统僵死两个小时,日志就在客户端积压两个小时,像eagleeeye这种大日志输出的系统两个小时早已超过文件滚动的上限200m,结果就是数据丢了。解决的方案就是落盘,但落盘需要考虑服务器磁盘空间的大小、磁盘IO对系统负载的影响、落盘的速度是否满足网络流量以及落盘后的恢复工作等等,这些因素会大大增加系统的复杂度并对稳定性带来冲击,在权衡利弊后,tlog目前还没有这么做。

 

 

【参考文献】

[1]. Nick Dimiduk, Amandeep Khurana. HBase in Action [M]. USA: Manning, 2011
[2]. http://opentsdb.net/
[3]. http://tsunanet.net/~tsuna/async/api/com/stumbleupon/async/Deferred.html
[4]. http://www.tsunanet.net/~tsuna/asynchbase/benchmark/viz.html
  • 大小: 18.7 KB
  • 大小: 19.7 KB
分享到:
评论

相关推荐

    tlog:终端IO记录器

    以JSON格式登录的主要目的是最终将记录的数据传递到存储服务,例如 ,在其中可以搜索和查询数据,并可以在其中回放数据。 Tlog包含三个工具: tlog-rec用于记录程序或shell的终端I / O, tlog-rec-session用于记录...

    TLog分布式日志标记追踪器 v1.5.0.zip

    TLog通过建立一个中心化的日志收集和存储体系,将各个节点的日志数据汇聚一处,使得运维人员可以一站式地查看和分析整个系统的运行状况。 其次,TLog具备强大的日志标记和追踪功能。在系统出现问题时,能够快速定位...

    discuz_x2数据结构_仅表名

    4. **pre_common_advertisement**:广告数据表,存储网站上的广告信息,包括广告图片、链接、展示位置等。 5. **pre_common_advertisement_custom**:自定义广告数据表,提供更灵活的广告定制选项。 #### 二、用户...

    Dubbo+Solr+RabbitMQ实现Solr数据同步 DataSyncParent.zip

    在本项目中,Solr作为数据的存储和检索平台,用于快速查询大量数据。 1. **索引构建**:Solr允许开发者定义自己的索引模型,支持多种类型的字段,如文本、数字、日期等,并能对字段进行分词、分析。 2. **分布式...

    C语言代码实现推箱子小游戏

    1. **基本数据结构**:使用二维数组存储游戏地图,每个元素代表游戏中的一个单元格。 2. **输入/输出**:处理用户输入,如键盘事件,以及控制台输出游戏状态。 3. **算法**:实现游戏逻辑,包括移动验证、游戏状态...

    TalendOpenStudio_ESB_UG_5.6.1_EN.pdf

    通过各个组件的组合把你的存储媒介中的数据抽取、进行变换,最后将变整合出的数据结果保存在你的目标媒介中。 2.Schema: 若数据库例如仓库,Schema相当于房间 表相当于 床 ;可以添加数值。 3.tMap组件: 数据...

    数据库管理与应用-1期 单元实践项目6的实训任务单.pdf

    此外,还授予了创建表和存储过程的权限。 3. **角色管理**:创建了一个名为Admin的数据库角色,该角色具有修改StuCou表的权限,然后将tlog用户添加到这个角色中。角色管理是权限管理的一个高级形式,方便于批量分配...

    2012年考研专业课自测试题及答案计算机.pdf

    24. 数据传输速率公式:S= Tlog2N中的T代表单位脉冲宽度。 25. OSI服务类型:OSI模型中,下层向上层提供的服务包括面向连接的服务和无连接的服务。 26. TCP与UDP错误描述:TCP协议的可靠性高,而UDP不保证数据传输...

    计算机网络专业考研模拟题

    24. **数据传输速率公式**:公式S=Tlog2N中,T表示单位脉冲宽度。 25. **向前纠错差错控制**:这种方法能够实时检测并纠正错误,但设备较为复杂。 26. **传输1K字节数据**:这个问题提到传输一定量数据时,可能...

    solr千亿检索设计说明.zip

    Solr通过SolrCloud模式实现了分布式搜索和数据存储。它基于ZooKeeper进行集群管理,确保数据的一致性和可用性。数据被分割成多个小块(Shards),每个Shard可以在不同的服务器上运行,从而实现水平扩展。 2. **...

    oracle DG最佳实践之一

    此外,启用ADG的透明应用日志(TLOG)可以加速故障切换和腐败检测。 3. **在Exadata数据库机器上部署**: Oracle Exadata提供了硬件集成的数据库优化,包括快速的redo应用和存储层的校验和,可以进一步增强腐败检测...

    Jstorm开源技术架构最佳实践.pptx

    JStorm的应用场景广泛,涵盖了阿里巴巴集团内部的各个业务领域,如阿里妈妈广告审计、Eagleeye的数据统计分析、监控系统(如Tlog、Rds-monitor、Oceanbase-monitor等)、数据同步服务、实时推荐系统等。在阿里巴巴...

    Solr调研总结共48页.pdf.zip

    1. **Solr架构**:Solr采用分布式架构,支持多节点集群,可以实现数据的分布式存储和处理,提高系统的可用性和性能。通过Sharding(分片)和Replication(复制)技术,实现数据的水平扩展。 2. **索引与查询**:...

    SQL Server数据库在企业的应用.pdf

    通过在实践中掌握SQL Server 7.0数据库的设计和管理,技术人员能够为企业构建稳定、高效和安全的数据存储和处理平台,实现数据的标准化和自动化管理,进而为企业的运营和发展提供强有力的信息支持。

    discuz2x论坛表结构

    以下是对该软件数据库中部分核心表格的详细解析,旨在帮助理解其数据存储与管理方式。 #### 二、核心表格解析 1. **pre_common_admincp_cmenu**:后台菜单收藏表。存储管理员收藏的菜单项,便于快速访问常用功能。...

    DNC家庭理财系统源码

    8. `obj\x86\Debug\GenerateResource-ResGen.write.1.tlog`:这是编译过程中产生的临时文件,记录了资源生成过程的信息,对于开发过程有所帮助,但不是最终用户需要关心的部分。 9. `FamilyFinance.suo`:这是...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 14-插入数据的优化.avi │ 15-服务器优化.avi │ 16-tomcat的3种运行模式和执行器(线程池).avi │ 17-tomcat中连接器.avi │ 18-禁用AJP连接器.avi │ 19-tomcat中JVM参数优化.avi │ ├─补充2:Redis3.0新...

    很好用的LOG封装,可同时输出类名,方法名,行数,可控制输出不输出

    5. **日志记录策略**:除了控制台输出,日志还可能被写入文件、数据库或者其他持久化存储。LOG封装应提供配置选项来指定日志的目标位置,同时考虑日志文件的大小限制、滚动策略等。 6. **性能优化**:考虑到日志...

Global site tag (gtag.js) - Google Analytics