MS Sql Server 中主從庫的配置和使用介紹
https://technet.microsoft.com/zh-cn/ff806143.aspx
網站規模到了一定程度之後,該分的也分了,該優化的也做了優化,但是還是不能滿足業務上對性能的要求;這時候我們可以考慮使用主從庫。
主從庫是兩臺服務器上的兩個數據庫,主庫以最快的速度做增刪改操作+最新數據的查詢操作;從庫負責查詢較舊數據,做一些對實效性要求較小的分析,報表生成的工作。這樣做將數據庫的壓力分擔到兩臺服務器上從而保證整個系統響應的及時性。
SQL Server提供了復制機制來幫我們實現主從庫的機制。我們看下如何在sql server 2005中實踐:
實踐前需要新創建一個Test的數據庫,這個庫中建一個測試表。
1. 打開sql server企業管理器,在對象資源管理器裏面選擇復制à本地發布,右鍵選擇新建發布
2. 打開新建發布向導,點下一步,選擇發布數據的數據庫
3. 我們選擇Test數據庫,並點擊下一步,選擇發布類型
這裏我們選擇的是事務性發布,事務性發布保證數據在做更新之後盡可能快的分發到訂閱服務器上。有關其他幾種發布類型的使用場景請參考msdn
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;
}
}
正確的使用主從庫,可以很好的提升系統的性能。使用主庫還是從庫的選擇權決定在業務邏輯的手裏。
MS Sql Server 中主從庫的配置和使用介紹