所以我想在主從資料庫設計上,應該將所有會話相關表進行特殊對待。即:所有的會話資料表都可以更新和查詢,當一個使用者訪問網站的時候,即將此使用者綁定到指定資料庫,所有會話訪問和查詢操作都對此資料庫進行。會話表不做同步,其他非會話類更新也從主要資料庫更新。這樣做其實也逃脫不了會話更新時候的資料庫切換,所以如果不想麻煩,還是將會話存放在文本中進行的好。
分資料庫設計,將可能從壓力效能上會提升幾個檔次,當然單次執行效率不會比單資料庫來的高的,畢竟存在著資料庫切換的效率問題。分庫以及主從資料庫搭配是可以比較好改善資料庫並發瓶頸的方案。原則:大資料量,分庫;大訪問量,主從。很多時候,都是這兩者並行(本文不討論cache)。
我想,如果要實現分庫以及主從關係,那麼資料庫伺服器數量將是非常可觀,在應用程式中隨時切換到某一台伺服器,將是非常頭痛的問題,配置更換,變數名稱,是不是會有一大堆呢?如何尋找更好的解決方案將是本文談論的話題。
首先是分庫使得資料庫頗多的問題。什麼情況下分庫?或許有些人還搞不明白為什麼要分庫,我就簡要說一下自己的經驗猜測。比如一個部落格程式,一般設計是將日誌存放在一張日誌表中。假設是一個多使用者部落格,那麼將會關聯一個uid,如果資料量不大,這樣設計是沒有問題的,但是當日誌量巨大,一天有幾十萬條日誌記錄錄入的時候,而且訪問量也比較可觀的時候,我想不可能每個使用者來訪問日誌列表,都去從這包含幾千萬條日誌記錄的資料表中去找那麼幾條,效率可見一斑。這個時候就該考慮到分庫的問題。如何分?有一個很簡單的分表方法,即,根據uid段,將日誌記錄在各個資料庫中,當然,這個分布還是需要根據以往統計結果做出調整的,因為使用者日誌分布肯定不是均勻的。設定好uid段,然後根據uid索引到指定資料庫配置,建立一個資料庫物件即可。配置資訊可能如下:
複製代碼 代碼如下:$configs['db_info']['blog'][0] = array(
'db_host' => '192.168.0.1',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['blog'][1] = array(
'db_host' => '192.168.0.2',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['blog'][2] = array(
'db_host' => '192.168.0.2',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
//...還有很多
至於選擇哪一台伺服器,只需要根據uid做一個簡單的匹配就可以了。
再談到的就是主從資料庫了。什麼情況下使用主從資料庫?比如某個名人部落格,訪問量相當的大,已經沒有辦法把他的資料再進行拆分了,這個時候就得考慮主從資料庫伺服器了,使用多台資料庫來分流。這樣要適用主從和分庫,可能上面配置資訊得稍微改動一下。 複製代碼 代碼如下:$configs['db_info']['blog'][0]['master'] = array(
'db_host' => '192.168.0.1',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['blog'][0]['slave'][0] = array(
'db_host' => '192.168.0.2',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['blog'][0]['slave'][1] = array(
'db_host' => '192.168.0.3',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['blog'][1]['master'] = array(
'db_host' => '192.168.0.4',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['blog'][1]['slave'][0] = array(
'db_host' => '192.168.0.5',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['blog'][1]['slave'][1] = array(
'db_host' => '192.168.0.6',
'db_name' => 'blog',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['session'][0]['master'] = array(
'db_host' => '192.168.0.7',
'db_name' => 'session',
'db_user' => 'root',
'db_pass' => '',
);
$configs['db_info']['session'][1]['master'] = array(
'db_host' => '192.168.0.8',
'db_name' => 'session',
'db_user' => 'root',
'db_pass' => '',
);
寫到這裡,我想都應該知道如何分表和分配你的資料庫了吧,接下去我就來說一下如何輕鬆的讀取這樣的配置資訊,如何將這些配置融入你的資料庫驅動中。