前言:
SQLServer的複製技術最少從SQLServer2000時代已經出現,當初是為了分散式運算,不是為了高可用。但是到了今天,複製也成為了一種高可用技術,並且被廣泛使用。很多問題都通過複製得以解決。
複製組件:
複製說白了就是一種發布/訂閱模式,但是這種模式並不容易理解。下面介紹一下複製技術的一些概念。提醒一下,這裡的複製在英文中不是COPY,而是Replication。它包含三個組件:發行者、分發者和訂閱者。三者缺一不可,並且均以在發布和訂閱中定義的項目為操作單元。
- 項目(Article):是用於複製中的可配置的最小操作單元,它可以是一個單獨的SQL Server對象,也可以是一個對象中的一個自己。這些對象通常是表、視圖、預存程序等。還可以是表中的部分行或者列的集合。在非嚴格環境下,可以把多個對象定義為一個項目來發布和訂閱。
- 發布(Publication):注意這裡是名詞,是一組項目的邏輯集合,每個發布可以包含一個或多重專案。發布中的配置項會影響它包含的所有項目,通過這種方式,可以減少管理對象所帶來的影響。其中最重要的配置項就是複製類型。
- 發行者(Publisher):運行發布的執行個體,發行者監控所有項目的變更,並且告知這些資訊給分發者。
- 分發者(Distributor):是一個跟蹤所有訂閱和發行活動變更的執行個體,在複製過程中充當中間人,絕大部分的變更會儲存在一個散發資料庫(存在於系統資料庫目錄下,庫名為distribution),可以是單獨的執行個體,也可以運行在訂閱伺服器或者發行伺服器上,但是通常會運行在發行者所在的機器上。
- 訂閱者(Subscriber):同樣是一個執行個體,用於通過分發者,接收所有發行者傳過來的資訊。
- 訂閱(Subscription):與發布配對,用於決定哪個伺服器(訂閱者)接收從發布中傳輸過來的資訊。每個訂閱都會建立一個發行者和訂閱者之間的串連。複製技術存在兩種訂閱者式,推送(push )和提取(pull)。對於發送訂閱,分發者直接在訂閱資料庫更新資料,對於提取訂閱,訂閱者會周期性詢問分發者是否有新變更可用,如果有,就會自行更新自己的資料。
圖中上半部分是分發者和發行者均在一個執行個體上的情況,下半部分是三者都分開執行個體。
複製類型:
粗略來說,SQLServer有三種主要的複製類型:快照式複寫、合併式複寫和事務複製。這裡先簡單介紹,後續會詳細並示範每一種類型。
快照式複寫:
每次運行時,會建立被發布對象的完整副本及其資料,並使用SQLServer的BCP工具把每個表的內容寫入到快照檔案夾中。這類快照檔案夾是由分發者建立的共用資料夾。複製過程中的所有參與者都必須能夠訪問快照檔案夾。
每次快照式複寫開始運行後,分發者會從發布中抓取已配置的發布項的當前快照,並傳送給訂閱者,然後應用到訂閱資料庫中,當應用新快照時,訂閱資料庫上的項目會被刪除並按新快照的內容重建,這個過程只會在每次快照式複寫啟動時執行一次,發布和訂閱端之間沒有持續的資料流,並且這個過程是高頻寬和儲存開銷的操作。
預設情況下,其他類型的複製會在初始化時通過分發者,通過快照來同步所有的訂閱項。這種類型的複製最適合用於相對靜態資料環境。
事務複製:
基於事務的一種複製類型,每個在發布項中的已提交的事務都會被掃描,並通過分發者傳輸到訂閱端。這個掃描操作是由記錄讀取器代理程式(log reader agent)通過讀取發行集資料庫中的交易記錄完成。如果發行項中有修改,會把修改記錄在分發者的散發資料庫中。然後從散發資料庫上,按照當前的訂閱類型,應用到訂閱者中。
事務複製可以接近即時同步,並只佔用少量的發行者空間。同時,這種類型的複製可以配置成資料雙向移動,但是事務複製的最初設計是僅僅用於單向的。
合併式複寫:
最初的設計是用於允許修改發生在發行者和訂閱者上。同時,合併式複寫在訂閱者不能持續連到發行者,可能隔天連一次這種情景下也很有用。這種情景下,可以每天晚上同步,但是當一個資料被同時來自於不同發行者的資料所修改時,就會產生衝突。可以通過一些配置來解決。