SQL Server 2012实施与管理实战指南(笔记)——Ch3Alwayson可用组

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 3.AlwaysOn可用组 Alwayson支持的,是一个可用性组,每个可用性组是包含了多个用户数据库的容器,可用性组内的数据库可以作为一个整体进行故障转移。 AlwaysOn关键特性: 一、类似集群的特性 1.多个数据库可以一起迁移 2.提供一个虚拟服务器名,这个虚拟服务器名始终是当前的primary。

3.AlwaysOn可用组

Alwayson支持的,是一个可用性组,每个可用性组是包含了多个用户数据库的容器,可用性组内的数据库可以作为一个整体进行故障转移。

AlwaysOn关键特性:

一、类似集群的特性

1.多个数据库可以一起迁移

2.提供一个虚拟服务器名,这个虚拟服务器名始终是当前的primary

3.可以有自动切换,手动切换和强制切换

4.一个primary,最多4secondarysql server 2014增加到了8个)

5.Dashborad可以监视alwayson运行状况

6.依赖于windows 2008集群,实现多站点部署。

二、类似镜像的特性:

1.每个secondary上有一份数据复制,可以支持只读请求

2.可以在secondary执行备份和dbcc命令

3.在配置情况下,只读请求可以被重定向到secondary

4.自动修复某些类型数据页的损坏

5.primarysecondary之间的数据被加密和压缩,提高安全性和减少流量。

目录

3.AlwaysOn可用组... 1

3.1 AlwaysOn基本架构... 1

3.2 AlwaysOn数据同步原理... 2

3.3 AlwaysOn可用性模式... 2

3.3.3可用副本之间“DISCONNECTED”状态... 3

3.3.4 Secondary”NOT SYNCHRONIZING”状态... 3

3.4 AlwaysOn故障转移... 4

3.4.1自动故障转移... 4

3.4.2 手动故障转移... 4

3.4.3强制故障转移... 5

3.4.4 多子网可用性组故障转移... 5

3.4.5 Split Brain(大脑分裂)5

3.4.6 连接,可用性副本和可用性数据库状态... 5

3.5 创建一个Always可用性组... 5

3.6 可读的Secondary. 5

3.6.1 ApplicationIntent. 5

3.6.2 副本可读模式设置... 6

3.6.3只读路由... 6

3.6.4 secondary上可能出现的性能问题... 7

3.6.5 统计信息... 7

3.7 监控AlwaysOn可用性组的运行状态... 8

 

 

3.1 AlwaysOn基本架构

AlwaysOn的可用性组包含一个或者多个数据库,这些数据库被称为可用性数据库。每个secondary上都有这些数据库的副本。这些数据库彼此之间是同步的。

AlwaysOn可用性组从windows集群角度看是一个集群资源,可用性数据库在集群的节点之间进行迁移。AlwaysOn不能应用到系统数据库,不能保证系统数据库的高可用性。

AlwaysOn成员内,只有一个成员是可读写的,称为主数据库(Primary),其他的叫副本(secondary)。

限制:

1.可用性组运行在一个windows集群上,不能跨集群

2.可用性成员要在不同的windows集群节点上

3.如果集中一个可用性成员是一个sql集群,那么这个集群上的其他非活跃节点上安装的实例不能成为这个可用性组的副本

4.一个数据库只能属于一个可用性组

ListenerAlwaysOn重要的组件之一,可以让应用程序透明的连接到primary

Listener由虚拟ip地址,虚拟DNS,端口号组成。创建完Listener之后,会为当前primary添加虚拟ip和虚拟DNS。这样就可以透明的访问primarySQL Server 2012支持在启动状态下绑定ip地址,DNS,端口来完成这个功能。

Listener不会使用sql browser,listener会以默认实例方式连接。

如果Listener的端口是1433端口(可以和实例共享端口),那么可以很简单的直接使用虚拟网络名连接到副本。如果Listener使用的是非默认端口:

1.如果primary监听1433端口,那么直接用DNS就可以访问了。

2.如果primary监听的不是1433端口,那么客户端必须在连接字符串中指定端口号才能连接到primary(SQL Server 2012 SP1测试看可以是listener的端口,也可以是primary监听的端口)

建议所有节点使用相同的监听端口,不然故障转移之后可能导致listener无法访问primary

3.2 AlwaysOn数据同步原理

AlwaysOn要把primary上的变化同步给secondary,所以要完成以下几件事情:

1.primary上的修改记录下来

2.把修改传输到副本

3.把修改应用到副本

AlwaysOn完成以上事情的步骤:

1.使用Log Write线程,负责把日志信息写入到内存的log buffer上,然后log buffer 写入到磁盘(固化)。

2.primary有个工作线程log scanner,将log buffer中的日志读出来,打包成日志块传输给secondary

3.secondary2个线程,redohardenHarden负责将发送过来的日志快写入到日志文件中。Redo负责将日志记录翻译成修改操作,在辅助数据库上完成。

3.3 AlwaysOn可用性模式

AlwaysOn2个可用性模式:异步提交,同步提交

和数据库镜像类似,不多介绍。

日志同步步骤

步骤

行为

连接

通过镜像端点连接

请求数据

发起一个请求到primary,要求发送日志块,双方协商出一个LSN

运行Log Scanner

Log Scanner运行,将日志块发送到secondary

固化和重做日志

Secondary固化和重做线程来处理log scanner发送过来的日志块,固化将日志块固化到硬盘,重做线程将日志重做

反馈进度

secondary收到primary3个消息,就会反馈进度,如果超过1秒没有3条,也会反馈进度,进度信息包含了哪些LSN被应用到了secondary

事务提交步骤

步骤

行为

提交事务

primary上执行commit

写入到本地日志记录

Primarycommit会被写入成一条日志记录,log writer会把知道commit为止的日志,全部写入到LDF文件。当写入磁盘后,primary等待secondary成功固化的消息

扫描日志

当日志块被写入到磁盘,给Log Scanner信号,开始工作。把日志发送给日志块解码器,解码器会搜索要特殊处理的操作,这些特殊操作解码器会以一个消息发送给secondary。如果解码完毕,整个日志块被发送给secondary

处理日志块消息

收到日志块,被固化和重做

反馈进度

secondary收到primary3个消息,就会反馈进度,如果超过1秒没有3条,也会反馈进度,进度信息包含了哪些LSN被应用到了secondary

完成提交

Primary收到了secondary的确认,完成事务提交并发送给客户端确认

primary为复制的发布数据库,那么log reader代理程序不会去处理那些没有被secondary固化的日志,这样做的目的是当复制发送数据比较快的时候,当secondary变成primary,就可能发送订阅数据库的数据比发布数据库新的问题。

3.3.3可用副本之间“DISCONNECTED”状态

副本之间会固定间隔发送ping,如果在超时期间内收到ping,那么正常。收到之后副本会重置连接上的超时计数器。Primarysecondary通过ping来判断批次是否依旧处于活动状态。

如果ping超时,那么primarysecondary连接户进入disconnected状态。

回话超时限制可以设置,默认为10s,最小允许5s。一般建议大于10s

3.3.4 Secondary”NOT SYNCHRONIZING”状态

如果一个事务在secondary上重做失败,那么secondary的数据库会进入 not synchronizing状态。

3.4 AlwaysOn故障转移

AlwaysOn依赖Windows故障转移集群。AlwaysOn需要一个集群Resource DLL来连接到Windows集群和SQL Server实例。Windows集群需要透过AlwaysOnResource DLL来控制资源的上线和离线。

AlwaysOn的可用性组的资源是“SQL Server Availability Group”Resource DLLHadrres.DLL,并在Hadrres.exe定义了可用性组isalive的检查方法。

注意点:

1.可用性组也是集群资源,healthchecktimeout30000毫秒。

2.无论有多少个可用性组,只有一条sp_server_diagnostics来诊断可用性组。

3.sp_server_diagnostics用来检查实例的健康,而不是检查每个数据库的状态。

Alwayson发生故障之后,是否会立刻故障转移,去决议可用性模式和故障转移模式的设置.

 

异步提交

同步提交,手动故障转移

同步提交,自动故障转移

自动故障转移

不支持

不支持

支持

手动故障转移

不支持

支持

支持

强制故障转移

支持

支持

支持

 

自动故障转移和手动故障转移都要求故障转移目标是使用同步提交模式并且处于SYNCHRONIZED状态的secondary

异步提交的只能使用强制故障转移。

3.4.1自动故障转移

要求条件:

1.当前primarysecondary都设置为同步模式并且是自动故障转移模式

2.primarysecondary必须是同步的

3.primary边的不可用

步骤:

1.如果当前primary在运行,会把primarysecondary的连接断开

2.如果secondary上面有没有完成的日志,secondary会继续执行redo,完成secondary的前滚。

3.前滚完成,secondary变成primary

4.新的primary在连接到一个secondary之前,不管前滚是否结束会把自己的状态设置为NOTSYNCHRONIZED,只有当secondary连接到primaryprimary会变成SYNCHRONIZED

5.当老的primary重启之后,发现其他人变成primary,会把自己变成secondary

3.4.2 手动故障转移

primarysecondary处理SYNCHRONIZED状态,就可以执行手动故障转移,如果primary停止运行,secondary就会进入RESOLVEING角色,RESOLVEING是一个角色不是状态,和primarysecondary类似。可以执行强制故障转移,但是会丢失数据。

方法:

1.直接用windows故障转移管理器

2.使用TSQL

3.使用SSMS UI

4.使用powershell

注意:只有为自动故障转移模式的可用性副本才能使用windos故障转移管理器。

3.4.3强制故障转移

强制故障转移和镜像的类似,会有可能会照成数据丢失。

3.4.4 多子网可用性组故障转移

要在客户端链接字符串的MultiSubnetFailover参数设置为true。除支持外必须通过listener来访问可用性副本。

3.4.5 Split Brain(大脑分裂)

大脑分裂就是,在一个可用性组里面出现了2primary。这个是不被允许的。可用性组资源属性中有一个leasetimeoutwindows会定期的和windows集群认为的primary通信,如果leasetimeout都没有收到windows集群的确认消息,那么副本就认为自己被切换掉了。

3.4.6 连接,可用性副本和可用性数据库状态

3.5 创建一个Always可用性组

3.6 可读的Secondary

AlwaysOnsecondary可以做只读,来分担读负荷。

要让只读操作能够透明的被自动转向到secondary,要解决一下三个问题:

1.客户端要标记自己的操作时只读的

2.secondary要被设置为可读

3.客户端连接,要被重定向才能到secondary,需要只读路由。

3.6.1 ApplicationIntent

AplicationIntent用来标记客户端发送来的请求类型:

ApplicationIntent = ReadOnly

ApplicationIntent = ReadWrite

3.6.2 副本可读模式设置

Secondary访问方式有3中:

1.NONE:辅助数据库不接受任何类型的数据访问

2.READ_ONLY:和自由applicationintent=ReadOnly是可以访问

3.ALL:任何链接都可以连接,但是只有只读操作可以执行

Primary访问类型只有ReadWriteALL

如果PrimaryReadWrite,客户端连接字符串中指定了ApplicationInitReadOnly,并指向了Primary,那么访问会被拒绝。

3.6.3只读路由

实现只读路由需要以下条件:

1.客户端要使用TCP协议,通过Listener连接到primary

2.客户端连接字符串ApplicationIntent=ReadOnly

3.至少有一个secondary被配置为ALL或者READONLY

4.secondary配置只读路由URL和在primary中的只读路由列表

ALTERAVAILABILITYGROUP [AG1]

   MODIFYREPLICAON

  N'COMPUTER01'WITH

  (SECONDARY_ROLE (ALLOW_CONNECTIONS=READ_ONLY));

  ALTERAVAILABILITYGROUP [AG1]

   MODIFYREPLICAON

  N'COMPUTER01'WITH

  (SECONDARY_ROLE (READ_ONLY_ROUTING_URL =N'TCP://COMPUTER01.contoso.com:1433'));

 

  ALTERAVAILABILITYGROUP [AG1]

   MODIFYREPLICAON

  N'COMPUTER02'WITH

  (SECONDARY_ROLE (ALLOW_CONNECTIONS=READ_ONLY));

  ALTERAVAILABILITYGROUP [AG1]

   MODIFYREPLICAON

  N'COMPUTER02'WITH

  (SECONDARY_ROLE (READ_ONLY_ROUTING_URL =N'TCP://COMPUTER02.contoso.com:1433'));

 

  ALTERAVAILABILITYGROUP [AG1]

  MODIFYREPLICAON

  N'COMPUTER01'WITH

  (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER02','COMPUTER01')));

 

  ALTERAVAILABILITYGROUP [AG1]

  MODIFYREPLICAON

  N'COMPUTER02'WITH

  (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER01','COMPUTER02')));

  GO

 

 

1.连接请求会首先被直到primary

2.primary检查目标数据库,确认该数据库属于可用性组

3.如果属于,检查只读路由列表,如果没有只读路由列表,只读路由不会工作

4.若发现只读路由,会依次检查列表,直到发现第一个访问模式设置为READONLY或者 ALLsecondar

5.primary把只读路由URL通过TDS发送给客户端

6.客户端重新定向到secondary

3.6.4 secondary上可能出现的性能问题

3.6.4.1 受用航版本控制来消除堵塞

因为secondary上同时存在读写,所以会存在堵塞的情况,为了保证只读的性能,AlwaysON会使用行版本控制来消除堵塞问题

3.6.4.2 系统资源的争用

复杂查询的运行也会影响日志redo,尽量在业务低谷期运行这些查询

3.6.4.3 索引

Secondary上可以用索引,但是不能创建索引,所以要用的时候要在primary上创建

3.6.5 统计信息

因为secondary只读,所以只能在primary创建统计信息,然后同步到secondaryAlwayson会在tempdb上创建临时的统计信息。来替代永久的 统计信息。

临时统计信息以_readonly_database_statistic后缀。

3.7 监控AlwaysOn可用性组的运行状态

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
4月前
|
SQL 监控 数据库
MSSQL性能调优实战指南:精准索引策略、SQL查询优化与高效并发控制
在Microsoft SQL Server(MSSQL)的性能调优过程中,精准索引策略、SQL查询优化以及高效并发控制是三大核心要素
|
2月前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
51 5
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL 慢查询秘籍】慢SQL无处遁形!实战指南:一步步教你揪出数据库性能杀手!
【8月更文挑战第24天】本文以教程形式深入探讨了MySQL慢SQL查询的分析与优化方法。首先介绍了如何配置MySQL以记录执行时间过长的SQL语句。接着,利用内置工具`mysqlslowlog`及第三方工具`pt-query-digest`对慢查询日志进行了详细分析。通过一个具体示例展示了可能导致性能瓶颈的查询,并提出了相应的优化策略,包括添加索引、缩小查询范围、使用`EXPLAIN`分析执行计划等。掌握这些技巧对于提升MySQL数据库性能具有重要意义。
269 1
|
3月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
98 0
|
4月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
192 1
|
4月前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【7月更文挑战第27天】在 Web 开发中,安全漏洞如同暗礁,其中 SQL 注入、XSS 和 CSRF 尤为棘手。本文通过实战案例展示如何使用 Python 抵御这些威胁。
64 0
|
5月前
|
SQL 安全 数据库
精通SQL:数据库查询与管理的实战指南
一、引言 在当今数字化时代,[数据库](https://www.iyxwzx.com/)已成为企业、组织和个人不可或缺的数据[管理](https://www.iyxwzx.com/news/)工具
|
SQL NoSQL 关系型数据库
Postgre SQL进阶实战指南 | 开发者社区精选文章合集(四十一)
PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统,同时也是一种特性非常齐全的对象-关系型数据库管理系统自由软件。揭秘PostgreSQL,深入了解,走进实战玩转PostgreSQL 。
Postgre SQL进阶实战指南 | 开发者社区精选文章合集(四十一)