Skip to content

Zebra介绍

tong.xin edited this page Dec 6, 2018 · 10 revisions

1 介绍

Zebra是一款基于JDBC API协议上开发出的的数据库访问层 (Data Access Layer) 解决方案,具备轻量灵活、高可用、高性能等特性。专注于解决传统关系型数据库的扩展性问题,在分布式场景下充分利用关系型数据库的能力,提供诸如动态数据源、读写分离、分库分表、数据库请求监控、等功能。Zebra由美团点评基础架构团队自主研发, 目前应用于公司内部外卖、配送、酒旅等各大业务线,经过丰富场景验证,品质值得信赖。

2 核心价值

简化了读写分离、分库分表的开发工作,使得业务方在分库分库、读写分离的情况下,依然可以像操作单个库那样去操作,屏蔽底层实现的复杂性,对业务透明。提供了从读写分离到分库分表全生命周期的技术支持。

3 Zebra有哪些产品组件,各有什么功能?

zebra主要是以客户端的形式提供服务,客户端又细分为3个组件:zebra-client、zebra-dao、zebra-cat-client。

  • zebra-client(核心) : 除了监控外,几乎zebra所有核心功能,如读写分离、分库分表、就近路由、流量控制
  • zebra-cat-client(可选): 提供端到端的监控,将监控信息上报到CAT监控平台
  • zebra-dao(可选):对mybatis的轻量级封装,兼容mybatis原有的功能,并额外提供了异步化接口、分页插件、多数据源等功能

3.1 zebra-client(核心依赖)

3.1.1 读写分离

关于读写分离的基础知识,请参考:zebra读写分离介绍

作为一个访问层组件,读写分离是一个基本要求。 zebra目前支持的如下能力:

  • 支持水平扩展从库,灵活的调整各个从库的任意流量比例
  • 支持优先就近选择从库进行读取数据,避免跨机房访问
  • 灵活的强制走主库策略,支持单条SQL或者整个请求内所有SQL等维度
  • ......

3.1.2 分库分表

关于分库分表的基础知识,请参考:zebra分库分表介绍

目前分库分表支持能力如下:

  • 同时支持分库和分表,路由策略可以通过groovy脚本进行灵活定制
  • 支持hash分表和range分表
  • 完善的SQL解析,支持聚合,分组,排序,Limit等语句
  • 支持多维度的分表策略
  • 配置均集中式配置和存储,简化业务代码的配置文件
  • ......

3.1.3 高可用

在整体架构图中可以看到,目前整个数据库的高可用使用到了两个组件,其中一个开源组件是MHA,它来负责主库的检测和切换。另外一个是自研服务,它用来负责从库的可用性检测和故障时从库的摘除。

3.1.4 就近路由

参考:Zebra路由设计

为了满足高可用的需求,mysql集群和业务服务器集群一般需要进行多机房/多中心部署,为此会产生跨机房/中心访问的问题。为了平衡跨机房/中心访问带来的延迟问题,需要应用机器能够优先访问部署在同一机房/中心的DB。

3.1.5 流量控制

参考:Zebra流量控制

在系统访问量较大时,某些库的负载可能非常高,或者因为临时故障或系统bug导致大量异常SQL打到某个库上。为了防止数据库被这些异常流量打垮,需要在数据库访问层上对MySQL进行保护,因此zebra需要提供对某些特定SQL或某个库进行限流的功能。(SQL限流只是用于临时解决问题,事后还需业务方进行优化或扩容)

3.2 zebra-cat-client

3.2.1 端到端监控

端到端的监控,一端指的是应用服务器,另一端指的是数据库服务器,一次端到端过程,就是一次完整的请求响应过程,中间经历两次来回网络的开销。端到端监控之所以重要,因为它最能够客观的反映SQL的性能。比起MySQL服务端的监控指标,端到端监控还把来回的两次网络开销算了进去。过往的历史经验来看,会经常出现在端到端监控上看到慢查询,但这条慢查询却不能够在MySQL服务器上查出,这是因为有可能这条SQL在网络上多花了开销,或者在MySQL的队列中多等待了一段时间。 因此,端到端的监控是如此的重要! zebra使用的是cat来进行端到端的监控。在这些监控平台上,可以明确的看到具体的某条SQL的性能指标,包括平均响应时间、99线、999线等。在CAT上还能够抓取出慢查询报表告诉开发,然后开发对这些慢查询进行优化。 举例来说,上图是CAT上SQL打点的一个截图,从中可以看到以下信息:

  • 从连接池拿到连接花了0.01ms(SQL.Conn)
  • 整个SQL(UserProfile.loadUserProfile)的执行开始时间(15:13:23.010)和 结束时间(15:13:23.011)
  • 这条SQL查询的结果为 0 (SQL.Rows)
  • 在dpuser-n1-read数据库上进行了查询Select
  • 这条SQL具体的SQL是:SELECT UserID,......,和这条PreparedStatement需要的参数是:115522257
  • 这条SQL总共执行了1.48ms
  • 整个调用链路上SQL的位置

3.3 zebra-dao

参考:zebra-dao接入指南

对mybatis的轻量级封装,所有mybatis原有的功能都具备,额外提供了异步化接口、分页插件、多数据源等功能。用法本质上就是mybatis的用法。

3.3.1 异步化接口

一个服务可能包括RPC调用请求、MemCached请求、KV存储请求以及MySQL数据库调用,目前其它三种请求的组件都有异步化的接口,但是数据库调用并没有。所以,在这个情况下,开发了这个异步化的DAO。目前,美团点评公司内部已有多个业务接入使用,已经接受了线上环境的验证和考验。

3.3.2 分页插件

支持逻辑分页和物理分页

3.3.3 多数据源

支持配置多个数据源,通过注解的方式指应该使用哪个数据源。

Clone this wiki locally