分布式系统设计之DB类(来自深空老大)

这多是个庞大的话题,没有亲自做过相关系统。
可能有几层分布:
一、WEB分布,这个只需LVS支持便可,状态保持不保持无所谓,能够经过PHPSESSID来保持这个会话。于是接入服务器仅做为接入之用,存储转到后端,这里要保持接入机无用户文件仍是比较难的,有时候保存一些可能会使系统更简单一些。
二、CACHE分布,接入机统一处理会话,根据规则命中某台特定CACHE机,固然,这里的CACHE机器不只限于如MEMCACHED、XCACHE等,简单的方法能够直接使用DB代替,如MEMORY表,这样后端数据和CACHE的同步规则就须要本身定制,效率也可能没有自动完成CACHE<->DB双向更新的效率高。
三、DB分布,这里认为CACHE和DB也可用应用程序来控制访问,而不必定须要CACHE自己来完成,至于效率下降多少不清楚,我的以为能够在后台设置一些定时调度脚原本更新CACHE,和将CACHE中的数据转存到后端DB。固然DB和CACHE的数量不必定是一一对应,若是CACHE多,那么DB存储可能会相应减小,这里须要测试一个平衡。
我在DB里设计了一个简单的路由器,以下:php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static function &init(& $dsn , $dbKey , $fetchMode = self::DB_FETCH_ASSOC) {
     if (isset(self:: $db [ $dbKey ])) {
         return self:: $db ;
     }
     $route = Route::init();
     $dbInfo = $route ->getDbRoute( $dsn , $dbKey );
     //这里要检测DB相同DBINFO的实例是否存在,若是存在则直接返回引用
     if ( is_array (self:: $db )) {
         foreach (self:: $db as $key => $value ) {
             if (self:: $db [ $key ]->dsn == $dbInfo ) {
                 self:: $db [ $dbKey ] = self:: $db [ $key ];
                 return self:: $db ;
             }
         }
     }
     $className = 'DB_' . self:: $dbType [ strtolower ( $dbInfo [ 'dbType' ])];
     self:: $db [ $dbKey ] = new $className ( $dbInfo , $dbKey , $fetchMode );
     return self:: $db ;
}

根据规则获取须要的DSN,而后返回一个DB,貌似这个路由很简单,很雷人:后端

1
2
3
4
5
6
7
8
9
10
public function getDbRoute(& $dsn , $dbKey ) {
     global $_configs ;
     if ( $_configs [ 'route' ][ 'db' ][ $dbKey ]) {
         if ( $_configs [ 'route' ][ 'db' ][ $dbKey ][ 'routeRule' ] == 'rand' ) {
             return $dsn [ $dbKey ][ array_rand ( $dsn [ $dbKey ])];
         }
     } else {
         return $dsn [ $dbKey ];
     }
}

固然路由规则是能够写进配置文件的,这里我默认写了个随机进行测试,发现可行,HOHO。一个规则可行,那么取模等规则固然也可行。
改进后的DB类会更为简练,固然最大的特性是支持分布- -!!服务器

相关文章
相关标签/搜索