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