1. 程式人生 > >Sql Server 主從資料庫配置

Sql Server 主從資料庫配置

        網站規模到了一定程度之後,該分的也分了,該優化的也做了優化,但是還是不能滿足業務上對效能的要求;這時候我們可以考慮使用主從庫。主從庫是兩臺伺服器上的兩個資料庫,主庫以最快的速度做增刪改操作+最新資料的查詢操作;從庫負責查詢較舊資料,做一些對實效性要求較小的分析,報表生成的工作。這樣做將資料庫的壓力分擔到兩臺伺服器上從而保證整個系統響應的及時性。如果還無法滿足業務需求,我們就要考慮建立伺服器群,這裡我們不做考慮!

1. 開啟sql server企業管理器,在物件資源管理器裡面選擇複製à本地釋出,右鍵選擇新建釋出

  2. 開啟新建釋出嚮導,點下一步,選擇釋出資料的資料庫

3. 我們選擇Test資料庫,並點選下一步,選擇釋出型別

4. 點選下一步,選擇要釋出的物件,這裡我們只對表進行釋出

5. 點選下一步進入篩選資料設定,這裡我們要複製表的所有資料所以不做設定

6. 點選下一步,指定何時執行快照,我們選擇初始話資料,並選擇預設的執行快照頻率

7. 繼續下一步,設定快照代理的執行賬戶,我們選擇sql server agent賬戶

 

8. 點選下一步選擇建立釋出,再次點選下一步設定釋出的名稱

 

9. 點選完成,完成釋出的設定,並建立釋出,現在在本地釋出出新添加了我們建立的釋出

 

現在成功建立了釋出,我們還需要建立訂閱:在本地訂閱資料夾上右擊新建訂閱,通過嚮導可以很容易的建立訂閱,建立訂閱時可以選擇以釋出者推送或者訂閱者主動的方式建立。具體步驟如下:

1. 通過右鍵選單開啟新建訂閱,點選下一步,選擇我們剛剛建立的釋出作為訂閱源

 

2. 選擇是以推送還是以主動請求的方式同步資料,我們選擇主動訂閱

 

3. 設定執行分發代理的賬戶

 

4. 設定代理請求同步的頻率

 

5. 設定是否立即做資料的初始化操作

 

6. 完成建立訂閱

建立完成之後,我們可以通過在主庫表中插入n條資料,然後在從庫中查詢的方式驗證複製是否成功。

在Sql server2005中的複製建立起來很簡單,我們需要根據業務需要設定複製的型別和同步的頻率。

下面我們具體看下主從庫的幾個使用場景和一個簡單的小例子。

主從庫之間是一種釋出訂閱的關係,釋出者和訂閱者之間並非實時同步的,通常會有幾分鐘的延時,更有甚者會有幾個小時的延時。所以我們需要通過合理的使用來避開有延時這個問題。我們希望主庫儘可能的少參與查詢,來提高寫的及時性;同時要讓從庫在不影響讀出資料的準確及時的前提下儘可能的分擔主庫的壓力。主從兩個庫需要在配置檔案中配置兩個連線字串,CONN_Master和CONN_Slave。我們需要設定一些規則決定當前的查詢應該從主庫查還是需要從從庫查。這個規則沒有定式,只能根據業務需要來確定。下面我舉幾個例子來說明:

1. 以豆瓣讀書書的詳細頁為假定場景,你可以點選這裡看下頁面的結構(我不是豆瓣的技術,在這裡只是拿這個頁面舉例)

我們來分析呈現這個頁面需要的資料和這些資料的實效性要求

1) 書的詳細資訊 時效性要求:要求及時

2) 豆瓣成員的常用標籤 實效性:不需要很及時

3) 喜歡讀這本書的人也喜歡讀的書 屬於分析資料,不需要很及時

4) 最新書評 要求及時

5) 讀這本書的幾個使用者 及時性不高

6) 喜歡這本書的人常去的小組 屬於分析資料不需要很及時

從上面的分析可以看出只有1),4)兩項資料需要從主庫讀,而2),3),5),6)為非及時資料從從庫讀取即可。當然我們可以對這些實效性不高的資料做快取處理。

2. 以論壇帖子列表頁面為假定場景,玩論壇的人都喜歡頂貼,把自己的帖子頂到第一頁讓更多的人關注,而對於50頁之後的帖子則反讀的人很少;我們可以根據這個業務邏輯特徵來決定在使用者訪問前50頁帖子列表資料時從主庫讀,而當用戶訪問超過50頁之後的資料時則從從庫進行查詢。

3. 以訂單為例,通常超過三個月的訂單就不會再有變化了,假定我們把訂單號設計為日期格式時,根據訂單號去查詢訂單時就可以根據訂單號來決定該訪問主庫還是從庫。

舉了幾個適用的場景,我們以第三個場景為例,寫一段簡單的示意程式碼看下

//orderNo 的格式為 20100528120105000001 即yyyyMMddHHmmss + 序號

public OrderInfo GetOrder(string orderNo) {

string connString = ConnStringGetter.GetForOrder(orderNo);

using (SqlConnection conn = new SqlConnection(connString))

{

...

}

}

public class ConnStringGetter

{

public static string GetForOrder(string orderNo) {

int year = int.Parse(orderNo.Substring(0,4));

int money = int.Parse(orderNo.Substring(4,2));

int date = int.Parse(orderNo.Substring(6,2));

DateTime orderTime = new DateTime(year, money, date);

TimeSpan ts = DateTime.Now - orderTime;

//根據訂單的時間決定使用主庫還是從庫

if (ts.TotalDays > 30) return ConfigurationManager.ConnectionStrings["CONN_Slave"].ConnectionString;

return ConfigurationManager.ConnectionStrings["CONN_Master"].ConnectionString;

}

}

正確的使用主從庫,可以很好的提升系統的效能。使用主庫還是從庫的選擇權決定在業務邏輯的手裡。