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

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

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类会更为简练,当然最大的特性是支持分布- -!!

你可能感兴趣的:(分布式系统设计之DB类(来自深空老大))