本文将介绍如何实现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' 连接到发布服务器,将新的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, ----这个值就是我们在2
a)步骤得到的transaction_timestamp
@article = 'all',
@update_mode = 'read only',
@subscriber_type = 0;
执行完这步之后,事务复制就可以正常工作了。