本文將介紹如何實現Alwayson + Replication ,通過AlwaysOn實現Publicationdatabase的高可用性,使Publicationdatabase在failover 之后事務復制可以正常運行。
拓撲如下:
Publisher primary |
Denali1 |
Publication database |
tranPubDB |
Publication name |
tranPublicationTest |
Publisher secondary |
Denali3 |
Distributor |
Denali2 |
|
|
AlwaysOn Availability Group name |
Liwei |
Listener |
liweion |
首先配置AlwaysOn Availability Group
- 登陸Denali1對tranPubDB進行完全備份: backup database tranPubDB to disk='tranpubdb.bak' with init
- 右鍵點擊AlwaysOn High Availability。
- 選擇TranPubDb,如果之前不進行備份,Status會顯示'Full backup is required'的提示。
- 指定Replicas:添加priamry 和secondary。
- 添加Listener。Listener將會用於后續的操作。
- 選擇初始化數據的方式。
- 驗證。
AlwaysOn的配置就結束了。
接下來配置事務復制
(1,2,3步的配置和普通的事務復制完全一致,詳細步驟請您參考http://www.sql-server-performance.com/2010/transactional-replication-2008-r2/)
-
連接Denali2:
- 將Denali2配置為distributor .
- 在Denali2里指定Denali1和Denali3為發布服務器
- 連接Denali3:指定Denali2為分發服務器
-
連接Denali1:
- 指定Denali2為分發服務器.
- 創建發布
-
連接Denali2, 在分發數據庫下執行下面的語句. 執行下面的語句之后,logreader就可以通過Listener連接到正在工作的primaryserver了。請注意,這一步是實現Publication database高可用性的關鍵步驟。
EXEC sys.sp_redirect_publisher
@original_publisher = 'Denali1',
@publisher_db = 'tranPubDB',
@redirected_publisher = 'liweion';----將之前創建的listener帶入到這個參數
配置步驟就全部完成了,之后您可以任意添加訂閱,當failover發生之后,事務復制也可以正常工作。
如何配制Subscription database +AlwaysON
(需要說明的是:當subscription database 的availability group發生failover后,replication是無法自動工作的,我們需要一些手工操作)
當前拓撲如下
Publisher |
Denali1 |
Publication database |
tranPubDB |
Publication name |
tranPublicationTest |
Distributor |
Denali2 |
Subscriber primary |
Denali4 |
Subscriber secondary |
Denali5 |
Subscription database |
subDB |
- 假設subscriber的Availabilitygroup發生了failover,此時distrubitonagent是無法工作的。
- 切換之后,Denali5成為新的primary。
- 連接到發布服務器Denali1,進入發布數據庫tranPubDB,將發布設置為運行從備份初始化: EXEC sp_changepublication @publication = 'tranPublicationTest', @property = 'allow_initialize_from_backup', @value = 'true';
-
連接到新的Denali5. 進入訂閱數據庫:
- 得到當前訂閱的LSN: SELECT transaction_timestamp, * FROM MSreplication_subscriptions;
- 清除訂閱數據庫的原數據:EXEC sp_subscription_cleanup @publisher = 'Denali1', @publisher_db = 'tranPubDB'
-
連接到發布服務器,將新的primaryserver的數據庫指定為訂閱:
EXEC sp_addsubscription -- past the LSN before executing
@publication = 'tranPublicationTest',
@subscriber = 'Denali5',
@destination_db = 'subDB',
@subscription_Type = 'Push',
@sync_Type = 'initialize from LSN',
@subscriptionlsn = 0x00000023000000E60003000000000000, ----這個值就是我們在4 a)步驟得到的transaction_timestamp
@article = 'all',
@update_mode = 'read only',
@subscriber_type = 0;
執行完這步之后,事務復制就可以正常工作了。
Update 20190104
====
Since SQL Server 2017, it's able to add distribution database to AG group
https://docs.microsoft.com/en-us/sql/relational-databases/replication/configure-distribution-availability-group?view=sql-server-2017
It also support automatic failover on subscriber
https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/replication-subscribers-and-always-on-availability-groups-sql-server?view=sql-server-2017