AlwaysOn的实施笔记

来源:互联网 发布:淘宝最新开店流程 编辑:程序博客网 时间:2024/05/20 10:21

最近有案子要将Always On搞到正式环境。Sql Server cluster + Alwayson  1 primary(cluster) + 1 secondary(单机)的架构。无论是之前做测试研究还是现阶段部署上线都遇到了很多问题,也咨询了微软的一些建议,特地拿出来分享。


1 Replication 同步复制

当我们需要AlwaysOn搭配replication使用时,希望能够将数据库里的订阅(subscription)和发布(publication)都能做好高可用性。需要做一些手工的操作。

另外值得一提的是,分发(distribution)是不可以利用Always On来做高可用的。


1.1 AlwaysOn内的发布

你的分发已经配置完毕,发布服务器也已经配置好相关内容,现在希望当发布出现AlwaysOn的Failover时,能够将发布服务器指向到failover后的实例上。那需要做如下操作:

步骤一:在辅助副本secondary上配置分发。

步骤二:如果有sql server cluster 环境可能需要给监听设置spn,单机不需要(具体如何配置spn可以自行百度)

setspn -l domain\user (查看所有节点的长名和短名都已经在里面)

一般情况AlwaysOn配置安装正常这边都无需处理,除非有sql server cluster环境,需要执行下方的命令,给监听也进行注册

setspn -s MSSQLSvc/ListenerName domain\user  setspn -s MSSQLSvc/ListenerName.xxx.corp domain\user

步骤三:在分发上执行发布重定向
USE distribution; GO EXEC sys.sp_redirect_publisher          @original_publisher= 'MyPublisher',    --发布服务器名称   @publisher_db = 'MyPublishedDB',  --发布的数据库   @redirected_publisher = 'MyAGListenerName';   --监听名称

步骤四:验证发布
USE distribution;GODECLARE @redirected_publisher sysname;EXEC sys.sp_validate_replica_hosts_as_publishers@original_publisher = 'MyPublisher',    @publisher_db = ''MyPublishedDB'',    @redirected_publisher = @redirected_publisher output;

步骤五:在所有副本的replication监视器上面添加原本的发布服务器


1.2 AlwaysOn内的订阅
1.2.1 如果你的订阅是在配置AlwaysOn之前已经配置好的,又不想影响到原先的环境,请进行如下操作:
步骤一:在secondary上配置分发
步骤二:在发布服务器上允许备份初始化
EXEC sp_changepublication @publication = 'publicationname', @property = 'allow_initialize_from_backup', @value = 'true';

步骤三:在发布服务器上面停止job(打开复制监视器,选择订阅右击view detail, action选择stop agent即可)
步骤四:在primary上查询lsn的值
Select Transaction_TimeStampFrom subDB..MSreplication_subscriptions;

步骤五:清除订阅信息
EXEC sp_subscription_cleanup @publisher = 'publisherName', @publisher_db = 'pubDB'

步骤六:创建新的订阅(将订阅者指向subscriber即可)
Use PBDB;Exec sp_AddSubscription@Publication = 'PBName',@Subscriber = 'AGListener',@Destination_DB = 'DBName',@Subscription_Type = 'Push',@Sync_Type = 'Initialize from LSN',@Subscriptionlsn = 0x00000045000001700003000000000000, --上面查询到的lsn@Article = 'All',@Update_Mode = 'Read Only',@Subscriber_Type =0; 

备注:当发生failover时,可能需要重新restart job


1.2.2 如果你的订阅是AlwaysOn已经架构好后建立的,可以直接用脚本的方式创建订阅,订阅者直接指向监听
use [<publisher database name>]  EXEC sp_addsubscription @publication = N'<publication name>',          @subscriber = N'<availability group listener name>',    --监听       @destination_db = N'<subscriber database name>',          @subscription_type = N'Push',          @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0;  GO    EXEC sp_addpushsubscription_agent @publication = N'<publication name>',          @subscriber = N'<availability group listener name>',   --监听       @subscriber_db = N'<subscriber database name>',          @job_login = null, @job_password = null, @subscriber_security_mode = 1;  GO  

2 不同网段下的配置

由于primary和secondary很可能在不同的网段下。当你建立高可用性组的时候,配置监听下拉框可能会看到有多个网段。因为在AlwaysOn切换到其他节点上时,必须保证监听和实例在同一个网段上。所以监听需要配置多个ip,当然windows cluster也需要根据每个节点来配置一到多个网段相对应。

例如primary在172.xx.xx.xx,secondary在12.xx.xx.xx  那么我们可能就需要配置一个172段,一个12段的ip,具体ip怎样计算在一个网段里这里就不赘述了。

而windows cluster在172.xx.xx.xx ,当然也还需要配置12.xx.xx.xx的。(可在failover cluster manager内对windows cluster增加listener ip,不会影响正常使用)

根据当前主副本所在的位置,一次只会online一组ip,另一个网段的ip则会处于offline的状态。

另外建议在连接string里面加上 “MultiSubnetFailover=True“字段(.net 3.5版本以上),若不支持该参数可能需要调整DNS记录Get-ClusterParameter RegisterAllProvidersIP,并设置TTL时间,具体方法自行查看。

3 没啥别的
暂时做到这边还没有遇到其他问题,后续有再继续补充。