+ -
当前位置:首页 → 问答吧 → 扩展yii的数据库访问层cDbConnection组件,请提供建议

扩展yii的数据库访问层cDbConnection组件,请提供建议

时间:2013-05-20

来源:互联网

因项目中使用yii框架,但其自带的数据库访问层不支持主从复制,我准备扩展一个新组件(继承自CDbConnection, 并可以完全兼容其接口,仅通过修改配置文件即可直接使用)



我目前想到的功能:
从CDbConnection派生新类,实现以下新功能

1. 支持一主多从模式
2. 自动读写分离(读请求自动转发到从库 写请求自动分发到主库)
3. 从库负载均衡
4.  强制主库读(对数据一致性要求较高场合使用较多 Mysql_proxy无此功能)
5. 强制指定读取从库节点(默认情况下随机选择从库)
6.  查询缓存(仅对select,show查询有效, 无论查询发生在主库还是从库上  yii已实现)
7.  从库故障转移 当从库产生故障时 自动选取其它从库 所有从库不可用时使用主库
8.  如果没有配置从库,所有的读写请求发送到主库
9.  从库可指定不同相对的权重,较高权重的从库处理的查询较多
10.  同一次PHP程序执行过程中,默认只会使用一台从库(这是出于性能考虑,避免随机连接过多从库影响性能),PHP多次执行时,就会使用不同的从库,从而达到负载均衡的目的。
11.  支持SQL hash 这意味着相同的查询会被固定发送到某个从库节点上,这将使用mysql server的query_cache更有效。

我一直是比较排斥使用mysql_proxy来实现这些功能的,一方面增加了运维的维护工作量,另一方面增加了可能的故障点,再次其并不灵活,如上述提到的强制主库读:

比如主从复制因意外原因中断,用户现在进行余额消费,主库上减去了余额,但未同步到从库,这时仍然可以继续消费(取余额的查询发生在从库上),这时就会导致对账错误。这时强制主库读,是比较好的解决方法。

这是我目前想到,并已经初步实现的功能,各位若有其它好的功能建议,欢迎提出,等完成之后,我会发布出来供大家参考。

作者: xuer   发布时间: 2013-05-20

折腾, Drupal的数据层封装基本上就满足你的需求了.

作者: idesigner   发布时间: 2013-05-20