本文将介绍如何实现Alwayson + Replication ,通过AlwaysOn实现Publication
database的高可用性,使Publication
database在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连接到正在工作的primary
server了。请注意,这一步是实现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的Availability
group发生了failover,此时distrubiton
agent是无法工作的。 - 切换之后,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'
- 得到当前订阅的LSN: SELECT transaction_timestamp,
-
连接到发布服务器,将新的primary
server的数据库指定为订阅: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;
执行完这步之后,事务复制就可以正常工作了。