滴滴后端架构实战( 三 )

  • 可以指定时间点回放数据;
  • 数据链路监控、报警;
  • 通过管理平台自动部署节点 。
  • 分库分表解决了前台应用的性能问题,数据同步解决了多库多表归一的问题,但是随着时间推移,后台单库的问题越来越严重,迫切需要一种方案解决海量数据存储的问题,同时又要让现有的上层应用不会有太大改动 。因此我们基于HBase和数据同步设计了实时数据中心,如图5所示 。
    滴滴后端架构实战

    文章插图
     
    图5 实时数据中心架构图
    • 将前台MySQL多库多表通过同步平台,都同步到了HBase;
    • 为减少后台应用层的改动,设计了一个SQL解析模块,将SQL查询转换为HBase查询;
    • 支持二级索引 。 
      说说二级索引,HBase并不支持二级索引,对它而言只有一个索引,那就是Rowkey 。如果要按其它字段查询,那就要为这些字段建立与Rowkey的映射关系,这就是所谓的二级索引 。HBase二级索引可以通过Coprocessor在数据插入之前执行一段代码,这段代码运行在HBase服务端(Region Server),可以让这段代码负责插入二级索引 。实时数据中心的二级索引是在客户端负责插入的,并没有使用Coprocessor,主要原因是Coprocessor不容易实现索引的批量插入,而批量插入,实践证明,是提升HBase插入性能非常有效的手段 。二级索引的应用其实还有些条件,如下:
    • 排序 
      在HBase中,只有一种排序,就是按Rowkey排序,因此,在建立索引的时候,实际上就定死了将来查询结果的排序 。某个索引字段的reverse属性为true,则按这个字段倒序排序,否则正序排序 。
    • 打散 
      单调变化的Rowkey读写压力很难均匀分布到多个Region上,而打散将会使读写均匀分布到多个Region,因此提升了读写性能 。但打散也有局限性,主要的是,经过打散的字段将无法支持范围查询 。而且,hash和reverse这两个属性是互斥的,且hash优先级高,就是说一旦设置了hash=true,则会忽略reverse这个属性 。
    • 串联 
      另外需要特别强调的是,索引配置也影响到多表归一,作为“串联”的字段,必须建立唯一索引,如果串联字段上没有建立唯一索引,将无法完成多表归一 。
    • 我们还实现了一套将SQL语句转换成HBase API的引擎,可以通过SQL语句直接操作HBase 。这里需要指出的是HSQL引擎和Hive是不同的,Hive主要用于将SQL语句转换成Hadoop的Map/Reduce任务,当然也可以转换成HBase的查询 。但Hive无法利用二级索引(HBase本来就不存在二级索引这个概念),Hive主要面向的是大批量、低频度、高延迟、顺序读的访问场景,而HSQL可以有效利用二级索引,它面向的是小批量、高频度、低延迟、随机读的访问场景 。




    推荐阅读