SlideShare une entreprise Scribd logo
1  sur  39
数据访问层开发实践 许超前 @ 手机之家 2010 年 04 月 03 日
1) 前言 a)  关于数据访问层 (Data Access Layer) b)  关于 Dal 2) Dal 的产生 3) Dal 的发展 a) Dal2.1.x b) Dal2.2.x 4) Dal 的未来 5) 关于我们 6) Q&A 目录
前言
关于数据访问层 引用维基百科 : A Data Access Layer (DAL) is a layer of a computer program which provides simplified access to data stored in persistent storage of some kind, such as an entity-relational database. This data access layer is used in turn by other program modules to access and manipulate the data within the data store without having to deal with the complexities inherent in this access.
关于数据访问层 ( 续 ) 应用程序 Data Access Layer DB API 文件 DAL 在系统中的位置
关于 Dal -  概览 Dal 是手机之家开发的数据访问层软件的产品名。 Dal1.0 、 Dal2.1.x 、 Dal2.2.x 及 Dal2.x 则是该软件的不同版本系列的一个引用。 Dal 是手机之家研发团队近几年在开发和运营上的经验的总结以及智慧的结晶。 开发 Dal 的目的是为了解决在构建大中型网站时遇到的和数据访问有关的诸多问题,如怎样使得分表透明化,怎样使得缓存存取清除自动化,怎样才能更好地防止服务单点故障等等。 Dal1.0 是一个具有里程碑意义的版本,但在很多方面仍然欠考虑。 Dal2.1.x 是一个经过精心设计、认真编写,具有较高可用性的分布式数据访问层,是综合数据代理 ( 如 MySQL Proxy) 、名值对缓存 ( 如 Memcached) 、集群等等思想而构建的一个软件系统。 Dal2.2.x 是目前的最新系列,引入了很多新特性:如分布式事务,支持数据库主从等等。
关于 Dal -  软件定位 1)  不但具备了 memcached 和 mysql proxy 的优点,还避免了两者的缺点。 2) Dal 作为一个中间件,应保持语言中立、数据库中立。 3)  让系统在数据访问层上具备分布式计算能力。 4)  不造 ORM 轮子,只是发明访问数据的接口。
关于 Dal -  核心概念 1)  透明 分片透明,缓存透明,主从透明。 2)  虚库 ( 逻辑库 ) 和实库 ( 物理库 ) 虚库:不是一个真正存在的库。也叫逻辑库。 实库:是真实存在的库。也叫物理库。 3)  虚表 ( 逻辑表 ) 和实表 ( 物理表 ) 虚表:不是一个真正存在的表。也叫逻辑表。 实表:是真实存在的表。也叫物理表。 4)  分片 ( 分表 ) 分片可以分布在同一个库中,也可以在多个库中。也叫分表。
关于 Dal -  核心概念 ( 续 ) 5)  映射 虚库 -> 实库 ; 虚表 -> 实表 ; 应用列名 -> 数据库列名 ; 6)  条目缓存和查询缓存 7)  辅助索引 8)  分片情况:不分片、分片无辅助索引、分片有辅助索引 9)  面向库的开发方式 这是指, Dal 自动从数据库获得需要的信息,而不是由应用开发人员在配 置文件里显示配置。开发人员要配的只是分表的规则、连接池的使用、缓 存的使用等。只在应用层需要和数据库不一样的信息时 ( 如字段名 ) ,才 在配置文件里显式写出。
关于 Dal -  核心概念 ( 续 ) 逻辑表 A 逻辑表 B 逻辑库 物理表 B_0 物理表 B_1 物理表 B_2 物理库 物理库 物理表 A 物理库 辅助索引 ID PID ... 列名 id pid ... 列名
关于 Dal -  设计指导思想 Dal 总体上设计成 (Core + Plugins) 的形式。 Core 负责一些不可插件化 ( 或难以插件化 ) 的组件, Plugins 则是那些 可插化的组件。 我们定的是机制,提供的是策略;机制是软件目标和宗旨的体现,一般是不能轻易改变的,而策略则应当是能比较简单地进行切换的。 那么, Core 即机制, Plugins 即策略。
Dal 的产生
Dal 的产生  -  多数现有系统的经典问题 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Dal 的产生  -  多数现有系统的经典问题 ( 续 ) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Dal 的产生  - Dal1.0 应需而生 HTTP MySQL Memcached 存条目 表现层 逻辑层 Dal1.0 MyCached 存 id list 及 聚合运算结果
Dal 的产生  - Dal1.0 的典型用法 接口采用 API Invocation+Call Chain 的方式,所有的方法名取自 SQL 关键字,方便记忆。 1) 增: DataAccessor::insert()‏ ->table('imobile.post.db_post')‏ ->data(array('post_id'=>1, ...))‏ ->dup()‏ ->execute(); 2) 删: DataAccessor::delete()‏ ->table('imobile.post.db_post')‏ ->where('post_id', 'IN', array(1, 2, 3))‏ ->limit(3)‏ ->execute();
Dal 的产生  - Dal1.0 的典型用法 ( 续 ) 3) 改: DataAccessor::update()‏ ->table('imobile.post.db_post')‏ ->data(array('level'=>0))‏ ->where('user_id', '<', 1000)‏ ->limit(100)‏ ->execute(); 4) 查: DataAccessor::select()‏ ->table('imobile.post.db_post')‏ ->columns('post_id')‏ ->where(array('thread_id'=>1, 'forum_id'=>2))‏ ->getAll();
Dal 的产生  - Dal1.0 的成效 Dal1.0 使得数据库的 QPS 从几千降到几百,缓存命中率稳定在 60%~80% 之间。 Dal1.0 还标准化了调用接口,简化了编程,使程序员在业务逻辑层面不再 关心缓存与分表问题,极大地提高了生产力。
Dal 的产生  - Dal1.0 的问题 但是, Dal1.0 仍然有很多不足: 1)Dal1.0 直接和数据库打交道。 2) 如果操作的数据分布在不同的分表中,为了提高性能,需要并行处理。但 是 PHP 不好做到。 3) 为了保证索引和分表数据的一致性,需要引入事务。但是 Dal1.0 没有。 4)Dal1.0 直接针对 MySQL 编码,万一将来需要采用其它的数据库,怎么办? 5)MyCached 和 Memcached 在不同的进程,很多情况下需要两次请求才能组合出完整的数据。 6) 如果需要支持其它的语言,怎么办? 要弥补这些不足,必须从根本上进行重新设计。如果说 Dal1.0 是为易用性 而设计,那么 Dal2.x 就是为性能、可用性等等而设计。
Dal 的发展
Dal 的发展  - Dal2.1.x 大图‏ MySQL Dal Server JDBC Oracle ??? JDBC JDBC Java Dal Client PHP Dal Client Python Dal Client ? Dal Client DALP DALP DALP DALP 缓存组件
Dal 的发展 –  Dal Server2.1.x 大图‏ Monkey NIO Framework query executor routing strategy query parser cache provider Event listener MySQL conn provider config manager big queue dal handler Oracle DALP
Dal 的发展 –  Dal2.1.x 在手机之家系统中的位置 应用 消息 队列 服务 M3 搜索 索引服务 搜索 更新 客户端 MySQL 计划任务 内置 消息 队列 事件 监听器 Dal2.1.x 调度器 回调应用程序 读取消息 发送更新任务 读写数据 写消息 读写数据 每分钟调一次
Dal 的发展 –  Dal2.1.x/Dal1.0 简单性能对比 测试方法:每次涉及 1 个记录,循环 10000 次,每次涉及的记录都不相同。 Dal2.1.x insert: 8.2153069972992s, 8.2881560325623s, 8.2909779548645s delete: 8.928288936615s, 8.4321990013123s, 8.039489030838s  update: 8.9594140052795s, 7.6687839031219s, 7.580326795578s select: 7.9645628929138s, 3.0665209293365s, 3.0304710865021s Dal1.0 insert: 42.473783969879s, 43.072340011597s, 42.900885105133s delete: 25.484493017197s, 25.382812976837s, 25.41899895668s update: 74.74593091011s, 74.557103872299s, 74.246424913406s select: 14.060505151749s, 9.7374119758606s, 6.5931770801544s
Dal 的发展 –  Dal2.1.x/Dal1.0 对比结果分析 在增、删、改、查四类查询当中, Dal2.1.x 都比 Dal1.0 有了很大的提升。 原因在于:减少了一次 socket 请求、采用了异步消息处理机制、引入连接池及优化了算法等等。
Dal 的发展 –  Dal2.1.x/Memcached 简单性能对比 测试方法 Dal2.1.x Memcached1.4.2 每次获取 1 个,循环 10000 次,每次获取的记录都不相同 10.839928150177s( 全部不命中的情况 ) 3.0760769844055s 3.1021270751953s 3.0667681694031s 1.9119760990143s 1.8506801128387s 1.8564429283142s 1.8201019763947s 每次获取 10000 个,执行 1 次,所有的记录都不相同。 0.64966702461243s 0.55020594596863s 0.52798008918762s 0.57868385314941s 0.28920984268188s 0.28875994682312s 0.28748893737793s 0.27671718597412s
Dal 的发展 –  Dal2.1.x/Memcached 对比结果分析 从时间消耗的数量级来看, Dal2.1.x 和 Memcached1.4.2 属于同一个级别; 从时间消耗的绝对值来看, Dal2.1.x 还是有一定的差距。 那么这 1/3~1/2 的时间消耗都花在哪了?主要是在协议解析及查询分析上。
Dal 的发展 –  Dal2.1.x 的成效 以下是手机之家某个时刻 4 组 Dal 服务的缓存命中率统计快照: 1) [entryCacheHits] => 1999443615(96.53%) [entryCacheMisses] => 71820652(3.47%) 2) [entryCacheHits] => 728834651(82.44%) [entryCacheMisses] => 155230407(17.56%) 3) [entryCacheHits] => 717269426(93.35%) [entryCacheMisses] => 51101159(6.65%) 4) [entryCacheHits] => 217927450(74.06%) [entryCacheMisses] => 76326220(25.94%) 其中, 2) 组服务命中率低的原因是:上面跑的是论坛,全动态的,更新频繁; 4) 组服务命中率低的原因是:应用层又做了缓存了,到 Dal 的冷请求变多了。
Dal 的发展 –  Dal2.1.x 的问题 1)  Dal2.1.x 采用的是内置缓存,而且存放的数据结构也不好 ( 大量的 Map 及字符串 ) ,在缓存数据量大的情况下, JVM 不堪重负,将进行频繁的 GC 。在高峰情况下,甚至会出现全 GC ,这时客户端 connection timeout 就频繁出现了。 2)  不支持分布式事务。这使得在分片分布在多个库的情况下,数据的完整性得不到保证。而跨查询事务问题更是得不到解决。 3)  不能简单的支持数据库主从。 4)  缓存不能简单地进行外置。 5)  不好在高峰时段进行配置 Reload 。 6)  不管分不分片,都得写一大堆配置。 7)  内置消息队列占用太多内存。 8)  不能把 dal 作为嵌入式包来使用。
Dal 的发展 –  Dal2.2.x 大图 Dal 专用 客户端 Dal Server #a Cache #c Cache #a Dal Server #b Dal Server #c Dal Server #d Cache #b Cache #d Dal2.2.x 缓存集群 数据库集群 DB#a DB#d DB#d DB#b
Dal 的发展 –  Dal2.2.x 重要变更 1)  自动生成条目 ( 实体 ) 类,用于缓存数据库记录。数据已经有了类型,同时有望缓解 JVM GC 问题。 2)  支持分布式事务。遵循 XA 规范。 3)  支持数据库主从。 4)  缓存内置、外置,任君选择。 5)  更好的元信息抽象,更聪明的发现及重载机制。 6)  更优的内置消息队列。内存中存储的是引用。 7)  已从 Dal Server 分离出 Dal Core ,可以简单地作为嵌入式包来引用。 8)  已支持 Php, Java, Python, Ruby 四个客户端。
Dal 的未来
Dal 的未来  - Dal2.3.x 数据库 特定 客户端 Dal 专用 客户端 Dal Server Dal  Admin 浏览器 Dal Server Gtalk
Dal 的未来  -  更多 1)  继续完善功能、提升性能 ; 2)  支持 Spring 、 Guice 集成 ; 3)  支持更多的数据库,如 PostgreSQL, DB2 等 ; 4)  集成全文搜索功能 ; ...
Dal 的未来  - “ 终结者” ” 分布式数据库前端或中控系统”应该是 Dal 这个项目的最终定型。 分片、缓存、主从、事务、异质数据库、多语言、全文检索、监控等等是这个项目的基本词汇。
关于我们
手机之家 :  http://www.imobile.com.cn/ DAL TEAM:  高春辉 ( 首席顾问 ), 刘增禄 , 张庆城、许超前 , ... 我的博客 :  http://www.longker.org/ 我的 Gtalk :  [email_address] 我的 MSN :  [email_address] 关于我们
  Q&A
The End     Thanks:)‏

Contenu connexe

Tendances

数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器Leyi (Kamus) Zhang
 
Taobao数据库这5年
Taobao数据库这5年Taobao数据库这5年
Taobao数据库这5年yp_fangdong
 
手机之家新系统介绍及架构分享
手机之家新系统介绍及架构分享手机之家新系统介绍及架构分享
手机之家新系统介绍及架构分享Dahui Feng
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统reinhardx
 
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性liu sheng
 
imobile-beta技术沙龙
imobile-beta技术沙龙imobile-beta技术沙龙
imobile-beta技术沙龙posestudio
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展Sky Jian
 
VMware zimbra email and collaboration for the post pc era
VMware zimbra email and collaboration for the post pc eraVMware zimbra email and collaboration for the post pc era
VMware zimbra email and collaboration for the post pc era零壹科技股份有限公司
 
淘宝Java中间件之路
淘宝Java中间件之路淘宝Java中间件之路
淘宝Java中间件之路mysqlops
 
Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务Wensong Zhang
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture introted-xu
 
百度分布式数据实践与进展
百度分布式数据实践与进展百度分布式数据实践与进展
百度分布式数据实践与进展yp_fangdong
 
腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程areyouok
 
盛大游戏运维体系
盛大游戏运维体系盛大游戏运维体系
盛大游戏运维体系Ken Liu
 
开源+自主开发 - 淘宝软件基础设施构建实践
开源+自主开发  - 淘宝软件基础设施构建实践开源+自主开发  - 淘宝软件基础设施构建实践
开源+自主开发 - 淘宝软件基础设施构建实践Wensong Zhang
 

Tendances (20)

数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器
 
Taobao数据库这5年
Taobao数据库这5年Taobao数据库这5年
Taobao数据库这5年
 
Symantec Backup Exec 2012 產品介紹_0320
Symantec Backup Exec 2012 產品介紹_0320Symantec Backup Exec 2012 產品介紹_0320
Symantec Backup Exec 2012 產品介紹_0320
 
手机之家新系统介绍及架构分享
手机之家新系统介绍及架构分享手机之家新系统介绍及架构分享
手机之家新系统介绍及架构分享
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统
 
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
 
imobile-beta技术沙龙
imobile-beta技术沙龙imobile-beta技术沙龙
imobile-beta技术沙龙
 
Symantec Backup Exec 2012 產品技術訓練
Symantec Backup Exec 2012 產品技術訓練Symantec Backup Exec 2012 產品技術訓練
Symantec Backup Exec 2012 產品技術訓練
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展
 
Symantec System Recovery 2011_0320
Symantec System Recovery 2011_0320Symantec System Recovery 2011_0320
Symantec System Recovery 2011_0320
 
Symantec system recovery 2011產品技術訓練
Symantec system recovery 2011產品技術訓練Symantec system recovery 2011產品技術訓練
Symantec system recovery 2011產品技術訓練
 
VMware zimbra email and collaboration for the post pc era
VMware zimbra email and collaboration for the post pc eraVMware zimbra email and collaboration for the post pc era
VMware zimbra email and collaboration for the post pc era
 
淘宝Java中间件之路
淘宝Java中间件之路淘宝Java中间件之路
淘宝Java中间件之路
 
Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务
 
Double take 6.0 實機體驗營
Double take 6.0 實機體驗營Double take 6.0 實機體驗營
Double take 6.0 實機體驗營
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 
百度分布式数据实践与进展
百度分布式数据实践与进展百度分布式数据实践与进展
百度分布式数据实践与进展
 
腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程
 
盛大游戏运维体系
盛大游戏运维体系盛大游戏运维体系
盛大游戏运维体系
 
开源+自主开发 - 淘宝软件基础设施构建实践
开源+自主开发  - 淘宝软件基础设施构建实践开源+自主开发  - 淘宝软件基础设施构建实践
开源+自主开发 - 淘宝软件基础设施构建实践
 

Similaire à 数据访问层开发实践

手机之家的数据访问层实践
手机之家的数据访问层实践手机之家的数据访问层实践
手机之家的数据访问层实践xcq
 
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
浅谈电商网站数据访问层(DAL)与 ORM 之适用性浅谈电商网站数据访问层(DAL)与 ORM 之适用性
浅谈电商网站数据访问层(DAL)与 ORM 之适用性Xuefeng Zhang
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统klandor
 
Java 与 云计算
Java 与 云计算Java 与 云计算
Java 与 云计算kevin huang
 
Delta Lake Architecture: Delta Lake + Apache Spark Structured Streaming
Delta Lake Architecture: Delta Lake + Apache Spark Structured StreamingDelta Lake Architecture: Delta Lake + Apache Spark Structured Streaming
Delta Lake Architecture: Delta Lake + Apache Spark Structured StreamingXiao Li
 
Essential oracle security internal for dba
Essential oracle security internal for dbaEssential oracle security internal for dba
Essential oracle security internal for dbamaclean liu
 
Android -汇博
Android -汇博Android -汇博
Android -汇博dlqingxi
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计YANGL *
 
Jkcn MySQLDB 架构
Jkcn MySQLDB 架构Jkcn MySQLDB 架构
Jkcn MySQLDB 架构Louis liu
 
Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Wei-Yu Chen
 
淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务drewz lin
 
大规模数据处理
大规模数据处理大规模数据处理
大规模数据处理Kay Yan
 
大规模数据处理
大规模数据处理大规模数据处理
大规模数据处理airsex
 
Oracle 高可用概述
Oracle 高可用概述Oracle 高可用概述
Oracle 高可用概述xlight
 
Oracle ha
Oracle haOracle ha
Oracle haxlight
 
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索liu sheng
 
腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程George Ang
 

Similaire à 数据访问层开发实践 (20)

手机之家的数据访问层实践
手机之家的数据访问层实践手机之家的数据访问层实践
手机之家的数据访问层实践
 
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
浅谈电商网站数据访问层(DAL)与 ORM 之适用性浅谈电商网站数据访问层(DAL)与 ORM 之适用性
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统
 
Java 与 云计算
Java 与 云计算Java 与 云计算
Java 与 云计算
 
Hic2011
Hic2011Hic2011
Hic2011
 
Delta Lake Architecture: Delta Lake + Apache Spark Structured Streaming
Delta Lake Architecture: Delta Lake + Apache Spark Structured StreamingDelta Lake Architecture: Delta Lake + Apache Spark Structured Streaming
Delta Lake Architecture: Delta Lake + Apache Spark Structured Streaming
 
Essential oracle security internal for dba
Essential oracle security internal for dbaEssential oracle security internal for dba
Essential oracle security internal for dba
 
Android -汇博
Android -汇博Android -汇博
Android -汇博
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计
 
Jkcn MySQLDB 架构
Jkcn MySQLDB 架构Jkcn MySQLDB 架构
Jkcn MySQLDB 架构
 
Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計
 
淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务淘宝对象存储与Cdn系统到服务
淘宝对象存储与Cdn系统到服务
 
大规模数据处理
大规模数据处理大规模数据处理
大规模数据处理
 
大规模数据处理
大规模数据处理大规模数据处理
大规模数据处理
 
Cdc@ganji.com
Cdc@ganji.comCdc@ganji.com
Cdc@ganji.com
 
Oracle 高可用概述
Oracle 高可用概述Oracle 高可用概述
Oracle 高可用概述
 
Oracle ha
Oracle haOracle ha
Oracle ha
 
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
 
腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程腾讯大讲堂24 qq show2.0重构历程
腾讯大讲堂24 qq show2.0重构历程
 
Dell
DellDell
Dell
 

数据访问层开发实践

  • 1. 数据访问层开发实践 许超前 @ 手机之家 2010 年 04 月 03 日
  • 2. 1) 前言 a) 关于数据访问层 (Data Access Layer) b) 关于 Dal 2) Dal 的产生 3) Dal 的发展 a) Dal2.1.x b) Dal2.2.x 4) Dal 的未来 5) 关于我们 6) Q&A 目录
  • 4. 关于数据访问层 引用维基百科 : A Data Access Layer (DAL) is a layer of a computer program which provides simplified access to data stored in persistent storage of some kind, such as an entity-relational database. This data access layer is used in turn by other program modules to access and manipulate the data within the data store without having to deal with the complexities inherent in this access.
  • 5. 关于数据访问层 ( 续 ) 应用程序 Data Access Layer DB API 文件 DAL 在系统中的位置
  • 6. 关于 Dal - 概览 Dal 是手机之家开发的数据访问层软件的产品名。 Dal1.0 、 Dal2.1.x 、 Dal2.2.x 及 Dal2.x 则是该软件的不同版本系列的一个引用。 Dal 是手机之家研发团队近几年在开发和运营上的经验的总结以及智慧的结晶。 开发 Dal 的目的是为了解决在构建大中型网站时遇到的和数据访问有关的诸多问题,如怎样使得分表透明化,怎样使得缓存存取清除自动化,怎样才能更好地防止服务单点故障等等。 Dal1.0 是一个具有里程碑意义的版本,但在很多方面仍然欠考虑。 Dal2.1.x 是一个经过精心设计、认真编写,具有较高可用性的分布式数据访问层,是综合数据代理 ( 如 MySQL Proxy) 、名值对缓存 ( 如 Memcached) 、集群等等思想而构建的一个软件系统。 Dal2.2.x 是目前的最新系列,引入了很多新特性:如分布式事务,支持数据库主从等等。
  • 7. 关于 Dal - 软件定位 1) 不但具备了 memcached 和 mysql proxy 的优点,还避免了两者的缺点。 2) Dal 作为一个中间件,应保持语言中立、数据库中立。 3) 让系统在数据访问层上具备分布式计算能力。 4) 不造 ORM 轮子,只是发明访问数据的接口。
  • 8. 关于 Dal - 核心概念 1) 透明 分片透明,缓存透明,主从透明。 2) 虚库 ( 逻辑库 ) 和实库 ( 物理库 ) 虚库:不是一个真正存在的库。也叫逻辑库。 实库:是真实存在的库。也叫物理库。 3) 虚表 ( 逻辑表 ) 和实表 ( 物理表 ) 虚表:不是一个真正存在的表。也叫逻辑表。 实表:是真实存在的表。也叫物理表。 4) 分片 ( 分表 ) 分片可以分布在同一个库中,也可以在多个库中。也叫分表。
  • 9. 关于 Dal - 核心概念 ( 续 ) 5) 映射 虚库 -> 实库 ; 虚表 -> 实表 ; 应用列名 -> 数据库列名 ; 6) 条目缓存和查询缓存 7) 辅助索引 8) 分片情况:不分片、分片无辅助索引、分片有辅助索引 9) 面向库的开发方式 这是指, Dal 自动从数据库获得需要的信息,而不是由应用开发人员在配 置文件里显示配置。开发人员要配的只是分表的规则、连接池的使用、缓 存的使用等。只在应用层需要和数据库不一样的信息时 ( 如字段名 ) ,才 在配置文件里显式写出。
  • 10. 关于 Dal - 核心概念 ( 续 ) 逻辑表 A 逻辑表 B 逻辑库 物理表 B_0 物理表 B_1 物理表 B_2 物理库 物理库 物理表 A 物理库 辅助索引 ID PID ... 列名 id pid ... 列名
  • 11. 关于 Dal - 设计指导思想 Dal 总体上设计成 (Core + Plugins) 的形式。 Core 负责一些不可插件化 ( 或难以插件化 ) 的组件, Plugins 则是那些 可插化的组件。 我们定的是机制,提供的是策略;机制是软件目标和宗旨的体现,一般是不能轻易改变的,而策略则应当是能比较简单地进行切换的。 那么, Core 即机制, Plugins 即策略。
  • 13.
  • 14.
  • 15. Dal 的产生 - Dal1.0 应需而生 HTTP MySQL Memcached 存条目 表现层 逻辑层 Dal1.0 MyCached 存 id list 及 聚合运算结果
  • 16. Dal 的产生 - Dal1.0 的典型用法 接口采用 API Invocation+Call Chain 的方式,所有的方法名取自 SQL 关键字,方便记忆。 1) 增: DataAccessor::insert()‏ ->table('imobile.post.db_post')‏ ->data(array('post_id'=>1, ...))‏ ->dup()‏ ->execute(); 2) 删: DataAccessor::delete()‏ ->table('imobile.post.db_post')‏ ->where('post_id', 'IN', array(1, 2, 3))‏ ->limit(3)‏ ->execute();
  • 17. Dal 的产生 - Dal1.0 的典型用法 ( 续 ) 3) 改: DataAccessor::update()‏ ->table('imobile.post.db_post')‏ ->data(array('level'=>0))‏ ->where('user_id', '<', 1000)‏ ->limit(100)‏ ->execute(); 4) 查: DataAccessor::select()‏ ->table('imobile.post.db_post')‏ ->columns('post_id')‏ ->where(array('thread_id'=>1, 'forum_id'=>2))‏ ->getAll();
  • 18. Dal 的产生 - Dal1.0 的成效 Dal1.0 使得数据库的 QPS 从几千降到几百,缓存命中率稳定在 60%~80% 之间。 Dal1.0 还标准化了调用接口,简化了编程,使程序员在业务逻辑层面不再 关心缓存与分表问题,极大地提高了生产力。
  • 19. Dal 的产生 - Dal1.0 的问题 但是, Dal1.0 仍然有很多不足: 1)Dal1.0 直接和数据库打交道。 2) 如果操作的数据分布在不同的分表中,为了提高性能,需要并行处理。但 是 PHP 不好做到。 3) 为了保证索引和分表数据的一致性,需要引入事务。但是 Dal1.0 没有。 4)Dal1.0 直接针对 MySQL 编码,万一将来需要采用其它的数据库,怎么办? 5)MyCached 和 Memcached 在不同的进程,很多情况下需要两次请求才能组合出完整的数据。 6) 如果需要支持其它的语言,怎么办? 要弥补这些不足,必须从根本上进行重新设计。如果说 Dal1.0 是为易用性 而设计,那么 Dal2.x 就是为性能、可用性等等而设计。
  • 21. Dal 的发展 - Dal2.1.x 大图‏ MySQL Dal Server JDBC Oracle ??? JDBC JDBC Java Dal Client PHP Dal Client Python Dal Client ? Dal Client DALP DALP DALP DALP 缓存组件
  • 22. Dal 的发展 – Dal Server2.1.x 大图‏ Monkey NIO Framework query executor routing strategy query parser cache provider Event listener MySQL conn provider config manager big queue dal handler Oracle DALP
  • 23. Dal 的发展 – Dal2.1.x 在手机之家系统中的位置 应用 消息 队列 服务 M3 搜索 索引服务 搜索 更新 客户端 MySQL 计划任务 内置 消息 队列 事件 监听器 Dal2.1.x 调度器 回调应用程序 读取消息 发送更新任务 读写数据 写消息 读写数据 每分钟调一次
  • 24. Dal 的发展 – Dal2.1.x/Dal1.0 简单性能对比 测试方法:每次涉及 1 个记录,循环 10000 次,每次涉及的记录都不相同。 Dal2.1.x insert: 8.2153069972992s, 8.2881560325623s, 8.2909779548645s delete: 8.928288936615s, 8.4321990013123s, 8.039489030838s update: 8.9594140052795s, 7.6687839031219s, 7.580326795578s select: 7.9645628929138s, 3.0665209293365s, 3.0304710865021s Dal1.0 insert: 42.473783969879s, 43.072340011597s, 42.900885105133s delete: 25.484493017197s, 25.382812976837s, 25.41899895668s update: 74.74593091011s, 74.557103872299s, 74.246424913406s select: 14.060505151749s, 9.7374119758606s, 6.5931770801544s
  • 25. Dal 的发展 – Dal2.1.x/Dal1.0 对比结果分析 在增、删、改、查四类查询当中, Dal2.1.x 都比 Dal1.0 有了很大的提升。 原因在于:减少了一次 socket 请求、采用了异步消息处理机制、引入连接池及优化了算法等等。
  • 26. Dal 的发展 – Dal2.1.x/Memcached 简单性能对比 测试方法 Dal2.1.x Memcached1.4.2 每次获取 1 个,循环 10000 次,每次获取的记录都不相同 10.839928150177s( 全部不命中的情况 ) 3.0760769844055s 3.1021270751953s 3.0667681694031s 1.9119760990143s 1.8506801128387s 1.8564429283142s 1.8201019763947s 每次获取 10000 个,执行 1 次,所有的记录都不相同。 0.64966702461243s 0.55020594596863s 0.52798008918762s 0.57868385314941s 0.28920984268188s 0.28875994682312s 0.28748893737793s 0.27671718597412s
  • 27. Dal 的发展 – Dal2.1.x/Memcached 对比结果分析 从时间消耗的数量级来看, Dal2.1.x 和 Memcached1.4.2 属于同一个级别; 从时间消耗的绝对值来看, Dal2.1.x 还是有一定的差距。 那么这 1/3~1/2 的时间消耗都花在哪了?主要是在协议解析及查询分析上。
  • 28. Dal 的发展 – Dal2.1.x 的成效 以下是手机之家某个时刻 4 组 Dal 服务的缓存命中率统计快照: 1) [entryCacheHits] => 1999443615(96.53%) [entryCacheMisses] => 71820652(3.47%) 2) [entryCacheHits] => 728834651(82.44%) [entryCacheMisses] => 155230407(17.56%) 3) [entryCacheHits] => 717269426(93.35%) [entryCacheMisses] => 51101159(6.65%) 4) [entryCacheHits] => 217927450(74.06%) [entryCacheMisses] => 76326220(25.94%) 其中, 2) 组服务命中率低的原因是:上面跑的是论坛,全动态的,更新频繁; 4) 组服务命中率低的原因是:应用层又做了缓存了,到 Dal 的冷请求变多了。
  • 29. Dal 的发展 – Dal2.1.x 的问题 1) Dal2.1.x 采用的是内置缓存,而且存放的数据结构也不好 ( 大量的 Map 及字符串 ) ,在缓存数据量大的情况下, JVM 不堪重负,将进行频繁的 GC 。在高峰情况下,甚至会出现全 GC ,这时客户端 connection timeout 就频繁出现了。 2) 不支持分布式事务。这使得在分片分布在多个库的情况下,数据的完整性得不到保证。而跨查询事务问题更是得不到解决。 3) 不能简单的支持数据库主从。 4) 缓存不能简单地进行外置。 5) 不好在高峰时段进行配置 Reload 。 6) 不管分不分片,都得写一大堆配置。 7) 内置消息队列占用太多内存。 8) 不能把 dal 作为嵌入式包来使用。
  • 30. Dal 的发展 – Dal2.2.x 大图 Dal 专用 客户端 Dal Server #a Cache #c Cache #a Dal Server #b Dal Server #c Dal Server #d Cache #b Cache #d Dal2.2.x 缓存集群 数据库集群 DB#a DB#d DB#d DB#b
  • 31. Dal 的发展 – Dal2.2.x 重要变更 1) 自动生成条目 ( 实体 ) 类,用于缓存数据库记录。数据已经有了类型,同时有望缓解 JVM GC 问题。 2) 支持分布式事务。遵循 XA 规范。 3) 支持数据库主从。 4) 缓存内置、外置,任君选择。 5) 更好的元信息抽象,更聪明的发现及重载机制。 6) 更优的内置消息队列。内存中存储的是引用。 7) 已从 Dal Server 分离出 Dal Core ,可以简单地作为嵌入式包来引用。 8) 已支持 Php, Java, Python, Ruby 四个客户端。
  • 33. Dal 的未来 - Dal2.3.x 数据库 特定 客户端 Dal 专用 客户端 Dal Server Dal Admin 浏览器 Dal Server Gtalk
  • 34. Dal 的未来 - 更多 1) 继续完善功能、提升性能 ; 2) 支持 Spring 、 Guice 集成 ; 3) 支持更多的数据库,如 PostgreSQL, DB2 等 ; 4) 集成全文搜索功能 ; ...
  • 35. Dal 的未来 - “ 终结者” ” 分布式数据库前端或中控系统”应该是 Dal 这个项目的最终定型。 分片、缓存、主从、事务、异质数据库、多语言、全文检索、监控等等是这个项目的基本词汇。
  • 37. 手机之家 : http://www.imobile.com.cn/ DAL TEAM: 高春辉 ( 首席顾问 ), 刘增禄 , 张庆城、许超前 , ... 我的博客 : http://www.longker.org/ 我的 Gtalk : [email_address] 我的 MSN : [email_address] 关于我们
  • 39. The End Thanks:)‏