2. 一、关于 DAL 二、 DAL1.0 的产生 三、走近 DAL2 四、 DAL 带来了什么 五、未来计划 六、 Q&A 目 录
3. 1) 数据访问层 引用维基百科 : 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.
4. 1) 数据访问层 ( 续 ) 应用程序 Data Access Layer DB API 文件 DAL 在系统中的位置
5. 2) 手机之家数据访问层 DAL1.0 和 DAL2.x 是手机之家开发的数据访问层的产品名的代号。下文如无特殊说明 DAL 代表此产品的通称。 DAL 是手机之家研发团队近几年在开发和运营上的经验的总结以及智慧的结晶。 开发 DAL 的目的是为了解决在构建大中型网站时遇到的和数据访问有关的诸多问题,如怎样使得分表透明化,怎样使得缓存存取清除自动化,怎样才能更好地防止服务单点故障等等。 DAL1.0 是一个具有里程碑意义的版本,但在很多方面仍然欠考虑。 DAL2.x 是一个经过精心设计、认真编写,具有较高可用性的分布式数据访问层,是一个吸收了 MySQL Proxy 、 Memcached 、集群等等思想而构建的软件系统。
6. 一、关于 DAL 二、 DAL1.0 的产生 三、走近 DAL2 四、 DAL 带来了什么 五、未来计划 六、 Q&A 目 录
7. 1) 老系统的问题 手机之家( www.imobile.com.cn )是一个有接近八年历史的网站,我们从 2008 年初开始重新设计和开发整个网站,我们在最初总结了一些之前遇到的经验和教训,其中包括: a) 由于 web server 可以直接访问 db server ,在高峰阶段,并发量比较大,导致 db server 经常 down 掉。 b) 添加缓存代码以降低数据库访问压力。但缓存访问逻辑却混杂在系统的各 个角落,造成代码维护成本上升。 c) 数据表结构设计不当,导致无法很简单地 ( 甚至不可能 ) 进行竖直和水平 方向的伸缩。
8. 2) 纯 PHP 分层方案 1 HTTP MySQL Memcached 数据访问层 表现层 逻辑层 FastCGI MySQL Read Write
9. 3) 方案 1 问题 方案 1 解决了之前所说的部分问题。但是: a) 开发一个功能,要写很多代码,而且有大部份代码是相当乏味的,重复性 极高,千篇一律,特别是数据访问层代码。 b) 程序员自己控制缓存。这使得: <1> 程序员根据自己的喜好来控制缓存的 KEY 和 VALUE ,造成缓存混乱。 <2> 程序员既要负责业务逻辑的编写,还要负责缓存管理,造成编程复 杂度提高、开发效率低下。 c) 在分表的情况下,程序员需要考虑和编写大量繁杂的和分表有关的代码。 这些问题,迫使我们寻找其它的解决方案。。。
19. 9)DAL1.0 问题 DA 标准化了调用接口,使程序员在业务逻辑层面尽量不再关心缓存与分表问 题,简化了编程,极大地提高了生产力 ( 代码量继续减少,易用性提高 ) 。 但是它仍然有很多不足: a. 表打散情况下,打散字段必须位于第一个查询条件中。 b. 另外, DA 直接和数据库打交道,在这一点上,可以说是又回到了起点。 c. 而且, DAL1.0 的 Java 内存缓存服务和 Memcached 在不同的进程,很多 情况下需要两次请求,才能组合出最终的数据。如果这两个在一个进程中, 显然能减少一次请求。
20. 9)DAL1.0 问题 ( 续 ) d. 如果操作的数据分布在不同的分表中,为了提高性能,需要并行处理。但 是 PHP 不好做到。 e. 为了保证索引和分表数据的一致性,需要引入事务。但是 DAL1.0 没有。 f. DAL1.0 直接针对 MySQL 编码,万一手机之家将来需要采用其它的数据 库,怎么办? g. 在应用层对特殊字符进行转义以防止 SQL 注入,这为什么不在 DAL 里 面做呢? 以上种种问题,让我们有了开发 DAL2.x 的想法。
21. 一、关于 DAL 二、 DAL1.0 的产生 三、走近 DAL2 四、 DAL 带来了什么 五、未来计划 六、 Q&A 目 录
22. 1) 想象中的 DAL2.x MySQL DAL Server 其它 缓存服务 JDBC Oracle ??? JDBC JDBC Java DAL Client Memcached PHP DAL Client Python DAL Client ? DAL Client DALP DALP DALP DALP
24. 2) 思考和总结 - 关于水平切分 a. 最好分到同一个数据库。 b. 一种已经证明是切实可行的方案:主表+辅表。 c. 有 3 种类型:主表不打散、主表打散无辅表、主表打散有辅表。 d. 不管怎么打散,程序员看到的只是一张表,不妨称之为虚表 ( 逻辑表 ) ,这张虚表实际上可能是由 N 张实表 ( 物理表 ) 组成的。
25. 2) 思考和总结 - 关于缓存 a. 慎用本地缓存。 一般情况下,像 Memcached 这种远程缓存已经够用了。 b. 选择或开发可根据字节数配置容量的缓存。 默认的缓存空间。 指定的缓存空间。 c. 缓存行记录。 缓存 Id List( 由 Id List 找行记录缓存 ) 和其它结果集。 两种缓存放在不同的缓存空间,便于自动清除。
26. 2) 思考和总结 - 关于 JOIN 要慎用 JOIN 。避免 JOIN 的解决方案: a. 在应用层拼装成最终结果。 b. 采用汇总表。汇总表里放所有需要联合的数据表的所有数据。可以用最新表和历史表降低压力。 c. 采用 Lucene 。预先建立索引,然后在索引上进行检索。效率也还不错。
27. 2) 思考和总结 - 关于 ORM a. 放弃主流 Java ORM 框架采用的 Java 实体类+ XML 配置的方式。 b. 采用直接面向数据库的开发方式。 DAL 自动从数据库获得需要的 信息。 XML 配置的只是分表的规则、连接池的使用、缓存的使用等。 只在应用层需要和数据库不一样的信息时 ( 如字段名 ) ,才在配置文 件里显式写出。 c. 接口采用 API Invocation+Call Chain 的方式,所有的方法名取自 SQL 关键字,方便记忆。 d. 客户端把返回的结构化数据转换成符合自己语言特点的的表达方式, 方便使用。
29. Oracle MySQL MySQL 分库 分库 索 引 库 MySQL DAL Server DAL Server DAL Server Cluster1 MySQL 分库 分库 DAL Client App Service Pool Data Access Layer DAL Server DAL Server DAL Server Cluster0 3)Big Picture - DAL2.x JDBC DALP JDBC JDBC JDBC DALP JDBC JDBC
30. 3)Big Picture - DAL2.x Server Monkey NIO Framework query executor routing strategy query parser cache provider result merger cache MySQL conn provider config manager event listener dal handler Oracle client
48. 9) 案例分析 a. DAL2.x 的缓存命中率相比 DAL1.0 有了很大的提高。原因在于 DAL2.x 在并发处理方面略胜一筹。 b. JVM 的 GC 问题,往往为人所诟病。但从我们在生产环境下的实际运行结果来看, GC 对 DAL 来说并不是问题。我们有理由相信, JDK7 发布后, GC 对应用程序的影响将会变得更小。
49. 一、关于 DAL 二、 DAL1.0 的产生 三、走近 DAL2 四、 DAL 带来了什么 五、未来计划 六、 Q&A 目 录
50. DAL 带来了什么 a. DAL 极大地提高了开发效率。 b. DAL 极大地提高了程序的可维护性。 c. DAL 极大地提高了系统的响应速度。 d. DAL 极大地提高了系统的承载能力。 e. DAL 极大地提高了架构的应变能力。
51. 一、关于 DAL 二、 DAL1.0 的产生 三、走近 DAL2 四、 DAL 带来了什么 五、未来计划 六、 Q&A 目 录
52. DAL2.x 未来计划 a. 继续完善功能、提升性能 ; b. 支持更多的数据库,如 PostgreSQL, DB2 等 ; c. 提供更多的客户端,如 Python, Ruby 等 ; d. 和 Spring 、 Guice 集成 ; e. 数据库厂商中立的数据复制 ; f. 更多的协议开发,这样才能作为透明代理使用 ; g. 嵌入式 API; ...
53. 一、关于 DAL 二、 DAL1.0 的产生 三、走近 DAL2 四、 DAL 带来了什么 五、未来计划 六、 Q&A 目 录