这可能是个庞大的话题,没有亲自作过相关系统。
可能有几层分布: 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类会更为简练,当然最大的特性是支持分布- -!!