這多是個龐大的話題,沒有親自做過相關係統。
可能有幾層分佈:
一、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類會更爲簡練,固然最大的特性是支持分佈- -!!服務器