? Zdal分库分表:支付宝是如何在分布式环境下完爆数据库压力的? 赛马会高级禁尾报
圈子系统信息
      圈子系统信息
  • 圈主:我是超管
  • 粉丝:1 人
  • 人气:156 关注度
      联系方式
  • 电话:400-889-3333
  • 地址:广州大道102号
Zdal分库分表:支付宝是如何在分布式环境下完爆数据库压力的?
2018-02-02 09:11:07 566
  • 收藏

    赛马会高级禁尾报Zdal是支付宝自主研发的数据中间件产品,采用标准的JDBC规范,可以在分布式环境下看上去像传统数据库一样提供海量数据服务,是一种通用的分库分表数据库访问框架,解决单库单表数据库访问压力,Zdal主要提供分库分表,结果集合并,sql解析,数据库failover动态切换等功能,提供互联网金融行业的数据访问层统一解决方案,目前已经在支付宝的交易,支付,会员,金融等大部分关键应用上使用,并且在2013年双11大促中运行稳定。


    ▲系统目标

    1.数据访问路由,将针对数据的读写请求发送到最合适的地方。

    2.数据存储的自由扩展,不再受限于单台机器的容量瓶颈和速度瓶颈,平滑迁移。

    3.使用zdal组件进行数据库的拆分,搭建分布式环境下的海量数据访问平台。

    4.实现mysql,oracle,DB2数据库访问能力。


    【系统架构和领域模型】

    ▲系统整体架构



    zdal组件主要有5部分组成:

    1. Zdal-client:开发编程接口,实现jdbc的Datasource,Connection,Statement,PreparedStatement,ResultSet等接口,实现通用的jdbc-sql访问,内部还实现读库重试,group数据源的选择器,表名替换,sql执行器等功能。

    2. Zdal-parser:支持oracle/mysql/db2等数据库的sql语句解析,并且缓存。根据规则引擎提供的参数列表,在指定的sql中查找到需要的参数,然后返回拆分字段。

    3. Zdal-rule:根据zdal-parser解析后的拆分字段值来确定逻辑库和物理表名。

    4. Zdal-datasource:数据库连接的管理,支持mysql,oracle,db2数据库的连接管理。

    5. Zdal-common:zdal组件所使用的一些公共组件类。


    ▲总体流程



    ▲Zdal初始化流程


    ▲分库分表初始化流程


    ▲分库分表sql执行流程



    【关键技术&第三方框架】

    ▲Zdal-client

    Zdal-client 模块主要是完成以下几部分工作:

    1.加载配置文件进行初始化工作,初始化groovy规则引擎。

    2.对jdbc 标准接口的封装,包括 DataSource、Connection、Statement、PrepareStatment等,并提供一个一对多的管理容器,可以管理多个jdbc建立的资源。

    3.SQL执行:根据规则引擎生成的目标库id和表名,进行表名替换后在目标库上执行该sql,如果是跨库跨表的sql,需要进行多个结果集的merge。

    4.读库重试,即在读库发生断连接问题的时候,Zdal会自动的尝试从对等的其他读库中去查询这条数据,尽最大努力保证在数据库还有访问能力的情况下,保证数据的可访问性。

    5.将传入的sql 和 参数进行包装后,调用 zdal-parser 和zdal-rule的 相关接口,进行sql的解析以及计算相应的分库分表结果。在此模块将会实现表名替换的功能,即将sql的逻辑表名替换成带后缀的物理表名。

    6.动态指定读库功能,即可以让业务根据实际需求指定一组中的某个读库进行操作,也可以指定到写库读。

    7.聚合函数结果集合并,针对count,sum,max,min等聚合函数在多个数据源的执行结果,进行结果集的合并。



    ▲Zdal-parser

    Parser组件包括如下几个部分:

    1. Lexer 词法解析。

    2.Parser,Parser包括ExprParser,各种StatementParser。

    3. AST, Abstract Syntax TreeParse出来的结果就是AST。

    4.StatementParser:解析各种sql语句,按照词法分析和语法分析提炼sql的关键字。

    5.Visitor:根据StatementParser的解析结果对AST做各种处理,比如FormatOutput,遍历,tableName,表达式,函数,绑定参数,分页参数,获取sql解析的结果。


    Zdal-Parser的主要核心类图如下:


    ▲Zdal-rule

    Zdal-rule 主要是完成规则的计算,包括分库的计算和分表的计算,相当于是一个二次路由的过程,包括单库单表、单库多表以及多库多表等几种情况。为了适应规则的灵活配置,目前主要是采用书写groovy脚本的方式来配置规则,或者在代码里封装拆分规则静态方法,在规则里调用该静态方法即可。


    我们假设分库规则是 user_id % 9 ?/ ?3 分表规则是user_id % 9 % 3




    上一页:如何成为一个优秀的工程师?“看到问题也不要去问别人,就把它Fix。” 下一页:ECMAScript 8都发布了,你还没有用上ECMAScript 6?
    ?
    全部评论(1)
    在线咨询
    400-8000-400