You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Zebra
是一款基于JDBC API协议上开发出的的数据库访问层 (Data Access Layer) 解决方案,具备
轻量灵活、高可用、高性能等特性
。专注于解决传统关系型数据库的扩展性问题,在分布式场景下充分利用关系型数据库的能力,提供诸如
动态数据源、读写分离、分库分表、数据库请求监控、等
功能。Zebra由美团点评基础架构团队自主研发, 目前应用于公司内部外卖、配送、酒旅等各大业务线,经过丰富场景验证,品质值得信赖。
简化了读写分离、分库分表的开发工作,使得业务方在分库分库、读写分离的情况下,依然可以像操作单个库那样去操作,屏蔽底层实现的复杂性,对业务透明。提供了从读写分离到分库分表全生命周期的技术支持。
zebra主要是以客户端的形式提供服务,客户端又细分为3个组件:zebra-client、zebra-dao、zebra-cat-client。
zebra-client(核心) : 除了监控外,几乎zebra所有核心功能,如读写分离、分库分表、就近路由、流量控制
zebra-cat-client(可选): 提供端到端的监控,将监控信息上报到
CAT监控平台
zebra-dao(可选):对mybatis的轻量级封装,兼容mybatis原有的功能,并额外提供了异步化接口、分页插件、多数据源等功能
关于读写分离的基础知识,请参考:
zebra读写分离介绍
作为一个访问层组件,读写分离是一个基本要求。
zebra目前支持的如下能力:
支持水平扩展从库,灵活的调整各个从库的任意流量比例
支持优先就近选择从库进行读取数据,避免跨机房访问
灵活的强制走主库策略,支持单条SQL或者整个请求内所有SQL等维度
......
关于分库分表的基础知识,请参考:
zebra分库分表介绍
目前分库分表支持能力如下:
同时支持分库和分表,路由策略可以通过groovy脚本进行灵活定制
支持hash分表和range分表
完善的SQL解析,支持聚合,分组,排序,Limit等语句
支持多维度的分表策略
配置均集中式配置和存储,简化业务代码的配置文件
......
在整体架构图中可以看到,目前整个数据库的高可用使用到了两个组件,其中一个开源组件是MHA,它来负责主库的检测和切换。另外一个是自研服务,它用来负责从库的可用性检测和故障时从库的摘除。
参考:
Zebra路由设计
为了满足高可用的需求,mysql集群和业务服务器集群一般需要进行多机房/多中心部署,为此会产生跨机房/中心访问的问题。为了平衡跨机房/中心访问带来的延迟问题,需要应用机器能够优先访问部署在同一机房/中心的DB。
参考:
Zebra流量控制
在系统访问量较大时,某些库的负载可能非常高,或者因为临时故障或系统bug导致大量异常SQL打到某个库上。为了防止数据库被这些异常流量打垮,需要在数据库访问层上对MySQL进行保护,因此zebra需要提供对某些特定SQL或某个库进行限流的功能。(SQL限流只是用于临时解决问题,事后还需业务方进行优化或扩容)
端到端的监控,一端指的是应用服务器,另一端指的是数据库服务器,一次端到端过程,就是一次完整的请求响应过程,中间经历两次来回网络的开销。端到端监控之所以重要,因为它最能够客观的反映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的位置
参考:
zebra-dao接入指南
对mybatis的轻量级封装,所有mybatis原有的功能都具备,额外提供了异步化接口、分页插件、多数据源等功能。用法本质上就是mybatis的用法。
一个服务可能包括RPC调用请求、MemCached请求、KV存储请求以及MySQL数据库调用,目前其它三种请求的组件都有异步化的接口,但是数据库调用并没有。所以,在这个情况下,开发了这个异步化的DAO。目前,美团点评公司内部已有多个业务接入使用,已经接受了线上环境的验证和考验。
支持逻辑分页和物理分页
支持配置多个数据源,通过注解的方式指应该使用哪个数据源。