狠狠撸

狠狠撸Share a Scribd company logo
百度数据库中间层技术介绍
       尹博学
   dba@


                   DTCC2012
目录



MySQL数据库集群面临的问题


数据库中间层整体设计


数据库中间层主要功能模块和策略


数据库中间层应用


数据库中间层发展




                  DTCC2012
MySQL数据库集群面临的问题



? 随着数据库流量和服务器数量增长,数据库集群面临很多
  问题:
?   如何实现应用程序与集群的解耦,降低运维成本?
?   如何实现数据库服务的高可用?
?   如何将并发控制前移,保护数据库系统?
?   如何降低数据库开发成本?
? ……




                             DTCC2012
目录



MySQL数据库集群面临的问题


数据中间层整体设计


数据库中间层主要功能模块和策略


数据库中间层应用


数据库中间层发展




                  DTCC2012
数据库中间层的整体设计



? 数据库中间层(dbproxy)的定义:
  ?   屏蔽集群内部细节
  ?   MySQL集群读写分离
  ?   连接池
  ?   负载均衡
  ?   访问控制
  ?   可集群化部署,运维
? 关键要求:
  ?   对数据库应用透明
  ?   性能要好:高并发,低延迟



                          DTCC2012
数据库中间层的整体设计

? 百度数据库集群三层架构




                     DTCC2012
数据库中间层的整体设计


? Dbproxy逻辑框架设计:




                        DTCC2012
数据库中间层的整体设计



? Dbproxy的程序框架设计:
  ?   进程 ?   or    线程?

  ?   MySQL API?   or    按照协议与机制自己实现?




                                    DTCC2012
数据库中间层的整体设计

? Dbproxy支持并发设计:
  ?   进程并发设计:

                          EPOLL驱动




                                    ...



  ?   应用程序<->dbproxy<->MySQL阶段划分
      handshake_send, auth_read, auth_result_send, query_read,
      ……


                                                 DTCC2012
目录



MySQL数据库集群面临的问题


数据中间层整体设计


数据库中间层主要功能模块和策略


数据库中间层应用


数据库中间层发展




                  DTCC2012
主要功能模块和策略



? 读写分离策略—基本原则
      ?      读请求发往从库;写请求发往主库
      ?      读写请求如何划分?



 Select * from student where class=XXX 发往slave
                                                             划分原则
                                                      枚举确定为读的SQL请求,将其发往从库
Select * from student where class=XXX for update ?         其余均发往主库




      ? 会话一致性:一个会话写请求结束后指定时间内的读请求会发
      往主库
                                                            DTCC2012
主要功能模块和策略



? 读写分离策略—事务处理
 ?   支持事务
 ?   有关事务的读写分离策略




                      DTCC2012
主要功能模块和策略



? 读写分离策略—会话状态保持
 ?   连接发生主从切换后,其上的状态依然保持




                           DTCC2012
主要功能模块和策略



? 负载均衡策略
 ?   基本算法是基于数据库当前连接数的

 ?   新建连接—选取集群中同类角色中“当前连接数/权重”最小的

 数据库




                           DTCC2012
主要功能模块和策略

? 负载均衡策略
 ?   负载均衡策略考虑MySQL实例的状态




                             DTCC2012
主要功能模块和策略



? 连接池
  ?   构建有与MySQL连接池,提升性能
  ?   连接池有三级hash策略,保证取到的连接可以正确使用
      ? read/write
      ? 用户权限
      ? 连接(session)属性,如client_found_rows
        等(include/mysql_com.h)




                                    DTCC2012
主要功能模块和策略


? 流量控制
 ?   并发数控制
 ?   QPS控制




                DTCC2012
主要功能模块和策略


? Dbproxy集群化部署与运维
  ?   配置信息热加载

  ?   支持连接多个数据库集群

  ?   自身压力信息准确输出

  ?   流量控制




                       DTCC2012
主要功能模块和策略


? Dbproxy对应用程序透明策略
  ?   MySQL ClientServer protocol

  ?   数据库(MySQL)某些特性

  ?   各种语言的MySQL API,各种MySQL的连接框架的特殊行为




                                       DTCC2012
主要功能模块及策略



? 存储过程的支持
 ?   支持“一条SQL对应多个结果集”地接收




                           DTCC2012
主要功能模块及策略



? Dbproxy提高性能策略
  ?   减少延迟
      ? 进程+状态机的模式,无锁,nonblock,网络操作都是就绪
      后才执行
      ? 对于大结果集的接收,采用了非连续接收的模式,减少其他
       连接的等待
  ?   提高并发处理能力
      ? 支持多个dbproxy工作进程监听一个端口




                               DTCC2012
主要功能模块及策略

? Dbproxy性能数据
  ?   单进程QPS可达17000
  ?   请求经过dbproxy的延迟为百微秒级




  ?    系统资源消耗少
      ?单dbproxy进程每日1200w请求
      ?cpu消耗小于1%,内存消耗约200M


                                DTCC2012
目录



MySQL数据库集群面临的问题


数据中间层整体设计


数据库中间层主要功能模块及策略


数据库中间层应用


数据库中间层发展




                  DTCC2012
数据库中间层应用模式




    DTCC2012
目录



MySQL数据库集群面临的问题


数据中间层整体设计


数据库中间层主要功能模块及策略


数据库中间层应用


数据库中间层发展




                  DTCC2012
发展方向




DTCC2012
DTCC2012

More Related Content

百度数据库中间层