分佈式系統設計之DB類(來自深空老大)

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

相關文章
相關標籤/搜索