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