點對點 - 交易式複寫

適用於:SQL Server

點對點複寫藉由維護多個伺服器執行個體之間的資料複本 (也稱為 「節點」 ) 來提供向外延展和高可用性解決方案。 點對點複寫建構於交易式複寫的基礎上,能以近乎即時的方式傳播具交易一致性的變更。 如此可讓需要向外延展讀取作業的應用程式將來自用戶端的讀取散發到多個節點之間。 由於會以接近即時的方式在節點之間維護資料,所以點對點複寫會提供資料備援性,這樣可提高資料的可用性。

請考慮 Web 應用程式。 這可透過點對點複寫在以下方面受益:

  • 目錄查詢和其他讀取作業會分散到多個節點。 如此可在讀取數目增加時,讓效能維持一致。

  • 如果系統中的其中一個節點失敗,應用程式層就可以將該節點的寫入重新導向另一個節點, 這樣會維護可用性。

  • 如果節點需要維護或是整個系統需要升級,可以讓每一個節點離線工作,然後再加回系統中,而不會影響應用程式的可用性。

雖然點對點複寫可向外擴展讀取作業,但此拓撲的寫入效能與單一節點相當。 這是因為在最後,所有的插入、更新和刪除都會傳播到所有節點。 當有變更套用到給定節點時,複寫可加以辨識,並防止變更在各節點間循環多次。 基於以下原因,我們強烈建議您最好只在一個節點上執行每一個資料列的寫入作業:

  • 如果資料列在多個節點上遭到修改,當該資料列傳播到其他節點時,則可能導致衝突,甚至造成更新遺失。

  • 在複寫變更時,一定會牽涉到某些延遲。 如果是需要立即看到最近變更的應用程式,在多個節點之間對應用程式動態進行負載平衡可能會發生問題。

點對點複寫包含了可在點對點拓撲之間啟用衝突偵測的選項, 這個選項可避免因為未偵測到的衝突所導致的問題,包括不一致的應用程式行為和遺失更新。 啟用這個選項時,預設會將衝突的變更視為造成散發代理程式失敗的嚴重錯誤。 在發生衝突時,此拓撲會維持不一致的狀態,直到以手動方式解決衝突並讓拓撲之間的資料變成一致為止。 如需相關資訊,請參閱 Conflict Detection in Peer-to-Peer Replication。

注意

若要避免潛在的資料不一致,請務必避免點對點拓撲中的衝突,即使已啟用衝突偵測亦然。 若要確定只在一個節點上執行特定資料列的寫入作業,存取和變更資料的應用程式必須分割插入、更新和刪除作業。 這樣的分割可確保,從一個節點對給定資料列的修改會在其他節點修改該資料列之前,與拓撲中的所有其他節點同步處理。 如果應用程式需要複雜的衝突偵測與解決功能,請使用合併式複寫。 如需詳細資訊,請參閱合併式複寫和偵測及解決合併式複寫衝突。

點對點拓撲

以下案例說明點對點複寫的一般用法。

具有兩個參與資料庫的拓撲

點對點複寫,兩個節點

前述兩個圖例都顯示兩個參與其中的資料庫,且使用者流量會透過應用程式伺服器導向這些資料庫。 這種組態可用於從網站到工作群組應用程式的許多應用程式,且具有下列優點:

  • 提升讀取效能,因為讀取會在兩台伺服器間展開。

  • 在需要維護或某個節點故障時,仍可提供較高的可用性。

在兩個圖例中,讀取活動在參與的資料庫間均負載平衡,但對更新的處理方式有所不同:

  • 在左側,更新會分配到兩個伺服器之間。 舉例來說,如果資料庫包含產品目錄,您可以讓一個自訂應用程式將名稱以 A 到 M 開頭之產品的更新導向節點 A ,將名稱以 N 到 Z 開頭之產品的更新導向節點 B 。隨後,更新會再複寫到其他節點。

  • 在右側,所有的更新都會導向節點 B。更新會從這裡複寫到節點 A。如果 B 離線 (例如,為了進行維護),應用程式伺服器就可以將所有活動導向 A。當 B 再次連線時,更新可以流向它,而且應用程式伺服器可將所有更新移回 B,或是繼續將更新導向 A。

點對點複寫對以上兩種方法均支援,但是右側的中央更新範例也經常與標準異動複寫一起使用。

有三個或更多參與資料庫的拓撲

點對點複寫至分散的位置

上圖顯示為一家全球軟體支援公司提供資料的三個參與資料庫,其分公司分別設在洛杉磯、倫敦和台北。 每個辦事處的支援工程師都會接聽客戶來電,同時輸入並更新每一個客戶來電的資訊。 這三個分公司的時差為八小時,這樣工作日就不會有重疊。 當台北分公司下班時,倫敦分公司就開始一天的工作。 如果某個辦事處即將下班時通話仍在進行中,該通話會被轉接給下一個開始辦公的辦事處代表。

每一處都有資料庫和應用程式伺服器,供支援工程師輸入並更新有關客戶來電的資訊。 此拓撲是依時間分割, 因此更新就只會發生在目前正在營業的節點,隨後更新會流向其他參與資料庫。 此拓撲具有下列優點:

  • 獨立而不隔離:每一個分公司都可以獨立插入、更新或刪除資料,而且還可以共用資料,因為資料會複寫到所有其他的參與資料庫。

  • 在發生失敗或要允許對一或多個參與資料庫進行維護時,具有更高的可用性。

    點對點複寫,三和四個節點

    前面的圖示顯示將一個節點新增至三節點拓撲。 基於以下原因,可以在此案例中加入節點:

  • 因為另一個辦公室已經啟用。

  • 在發生磁碟錯誤或其他重大失敗時,提供更高的可用性來支援維護或增加容錯功能。

請注意在具有三個或四個節點的拓撲中,所有的資料庫都會發行及訂閱所有其他資料庫。 這樣會在有維護需求或是其中一或多個節點失敗時,提供最大的可用性。 新增節點後,您必須針對效能以及部署與管理的複雜度來平衡可用性和延展性。

設定點對點複寫

設定點對點複寫拓撲,類似於設定一系列標準交易式發行和訂閱。 以下文章中的步驟顯示三節點系統的組態,與顯示點對點拓撲的上圖左側組態類似。

設定 TLS 1.3 加密

SQL Server 2025(17.x)引入了 TDS 8.0 點對點複寫支援,內容包括:

  • 如何設定複製代理在 SQL Server 2025(17.x)實例之間,以及 SQL Server 2025(17.x)與 Azure SQL 受管實例之間使用 TLS 1.3 加密 。
  • SQL Server 2025(17.x)實例間副本間連結伺服器通訊的預設加密,採用複寫拓撲架構。 SQL Server 2025(17.x)中的連結伺服器使用 OLE DB v19 驅動程式,該驅動程式預設為 Encrypt=Mandatory 加密。

使用點對點複寫時的考量事項

本章節提供在您使用點對點複寫時,所要考量的資訊與指導方針。

一般考量

  • 點對點複寫只適用於 SQL Server 的 Enterprise 版本。

  • 參與點對點複寫的所有資料庫都應該包含相同的結構描述和資料:

    • 物件名稱、物件結構描述和發行集名稱都應相同。

    • 發行必須允許結構描述變更進行複寫。 (這是發行集屬性 replicate_ddl 的 1 設定值,這是預設值)。如需詳細資訊,請參閱對發行集資料庫進行結構描述變更。

    • 不支援資料列與資料行篩選。

  • 每個節點都應使用各自的發佈資料庫。 這可消除出現單點故障的可能性。

  • 資料表和其他物件不能包含在單一發行資料庫中的多個點對點發行內。

  • 在建立任何訂閱之前,必須先將發行集啟用為點對點複寫。

  • 訂閱必須使用備份或藉由 [replication support only] 選項進行初始化。 如需詳細資訊,請參閱不使用快照初始化交易式訂閱。

  • 請勿使用識別欄位。 使用識別時,您必須手動管理指派給每個參與資料庫中資料表的範圍。 如需詳細資訊,請參閱為手動識別範圍管理指派範圍。

功能限制

點對點複寫支援異動複寫的核心功能,但是不支援以下選項:

  • 使用快照進行初始化和重新初始化。

  • 列和欄篩選。

  • 時間戳記資料行。

  • 非 SQL Server 發行者和訂閱者。

  • 立即更新和佇列更新訂閱。

  • 匿名訂閱。

  • 部分訂閱。

  • 可附加訂閱與可轉換訂閱 (這兩個選項在 SQL Server 2005 (9.x) 中已淘汰)。

  • 共用的發佈代理程式。

  • 散發代理程式參數 -SubscriptionStreams 和記錄讀取器代理程式參數 -MaxCmdsInTran。

  • 文章屬性 @destination_owner 和 @destination_table。

  • 點對點異動複寫不支援建立點對點發行集的單向交易式訂閱

  • 點對點異動複寫不支援以計算資料行作為其主索引鍵一部分的發行資料表。

下列屬性有特殊考量:

  • @allow_initialize_from_backup publication 屬性的值必須為 true。

  • 文章屬性 @replicate_ddl 需要值為 true;@identityrangemanagementoption 需要值為 manual;而 @status 則要求選項 24 已設定。

  • 發行項屬性 @ins_cmd、@del_cmd 及 @upd_cmd 的值不能設定為 SQL。

  • 訂閱屬性 @sync_type 需要 none 或 automatic 值。

  • SQL Server 2019 (15.x) CU 13 引進了發行集屬性 @p2p_confictdetection_policy。 預設參數值為 originatorid,其會根據建立者識別碼來解決衝突。 lastwriter 參數值會根據最後一個寫入者來解決衝突。

維護考量

某些操作需要系統處於靜止狀態。 這表示停止所有節點上已發行之資料表的活動,並確定每個節點都已收到來自其他所有節點的所有變更。

動作 僅限 SQL Server 2005 對等節點,或混合 SQL Server 2005 對等節點與 SQL Server 2008 及以上版本的對等節點 僅限 SQL Server 2005 對等節點,或混合 SQL Server 2005 對等節點與 SQL Server 2008 及以上版本的對等節點 SQL2008 對等及更新版本 SQL2008 對等及更新版本
將節點加入拓撲中 完整拓撲中有 2 個節點︰不需要靜止。 使用 sync_type = 'initialize with backup'。 超過 2 個節點:需要靜止。 sync_type = 'replication support only':需要靜止。 sync_type = 'initialize with backup' 和 'initialize from lsn':不需要靜止。

拓撲結構描述變更(新增或卸除發行項)需要先進入靜止狀態。 如需詳細資訊,請參閱管理點對點拓撲 (複寫 Transact-SQL 程式設計)。

從拓撲中移除節點永遠不需要停止。

使用 sp_changearticle 變更發行項屬性時,永遠不需要進入靜止狀態。 允許的變更 (適用於 P2P) 包括 description、 ins_cmd、 upd_cmd和 del_cmd 屬性。

發行項結構描述變更 (新增/卸除資料行) 永遠不需要停止。

  • 新增文章:若要將文章加入現有配置,我們需要暫停系統,執行 CREATE TABLE 語句,並在拓撲的每個節點載入初始資料,並在拓撲的每個節點新增文章。

  • 刪除項目:如果我們希望所有節點都維持一致的狀態,就需要讓拓撲進入靜止狀態

如需詳細資訊,請參閱停止複寫拓撲 (複寫 Transact-SQL 程式設計) 和管理點對點拓撲 (複寫 Transact-SQL 程式設計)。

  • 如果您將新的節點加入至點對點拓撲,則應該只從新節點加入之後所建立的備份進行還原。

  • 您無法重新初始化點對點拓撲中的訂閱。 如果您必須確定節點有資料的新副本,請在節點還原備份。