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 没啥别的
暂时做到这边还没有遇到其他问题,后续有再继续补充。
- AlwaysOn的实施笔记
- SQLServer2016 AlwaysOn基于证书的搭建笔记
- SQLServer2016 AlwaysOn基于证书的搭建笔记
- SQLServer2016 AlwaysOn基于证书的搭建笔记
- SQLServer2016 AlwaysOn基于证书的搭建笔记
- SQLServer2016 AlwaysOn基于证书的搭建笔记
- SQLServer2016 AlwaysOn基于证书的搭建笔记
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
- Alwayson 同步模式的坑
- 纯实施FA的小笔记
- SQLServer的数据库镜像实施笔记
- 镜像&AlwaysOn复制的工作原理
- AlwaysON同步的原理及可用模式
- 从0开始部署基础的AlwaysOn
- Excel Server2010实施笔记
- 优秀课件笔记之管理信息系统的系统实施
- ERP项目实施的15个规律摘抄笔记
- steam host修改
- echarts图例显示不全以及颜色的一些问题
- 第七章 创建计算字段
- jni中java类型的简写
- [Leetcode 128] Longest Consecutive Sequence
- AlwaysOn的实施笔记
- 函数的极限
- Android-----------OkHttp
- 博客上线
- http://blog.csdn.net/kj_zx19854/article/details/1865337
- ORACLE-024:列行转换、多行合并
- CMarkUp使用简介
- Linux 内核模块
- selector到底是什么