Gav*_*vin 6 sql-server sql-server-2012 availability-groups
我正在尝试在 VM 环境中配置可用性组,以便可以运行一些测试。
我想我已经正确创建了组,我可以在两台服务器上看到 Always on 组。但是,当我查看该组的仪表板时,它出现以下错误
可用性副本已断开连接
此次要副本未连接到主要副本。连接状态为 DISCONNECTED。
我已经检查了两台服务器上的端点,它们看起来是正确的。没有防火墙在运行,两台服务器都可以看到对方。调试此类错误的最佳方法是什么?
下面是我用来设置所有这些的 TSQL
主服务器
CREATE ENDPOINT dbm_endpoint
STATE=STARTED
AS TCP (LISTENER_PORT=7022)
FOR DATABASE_MIRRORING (ROLE=ALL)
GO
Run Code Online (Sandbox Code Playgroud)
辅助服务器
CREATE ENDPOINT dbm_endpoint
STATE=STARTED
AS TCP (LISTENER_PORT=5022)
FOR DATABASE_MIRRORING (ROLE=ALL)
GO
Run Code Online (Sandbox Code Playgroud)
主服务器
CREATE AVAILABILITY GROUP AG1
FOR
DATABASE TestDb
REPLICA ON
'SQL1' WITH
(
ENDPOINT_URL = 'TCP://sql1.sql.sandbox.net:7022',
PRIMARY_ROLE ( ALLOW_CONNECTIONS = READ_WRITE),
SECONDARY_ROLE (ALLOW_CONNECTIONS=READ_ONLY),
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL
),
'SQL2' WITH
(
ENDPOINT_URL = 'TCP://sql2.sql.sandbox.net:5022',
PRIMARY_ROLE ( ALLOW_CONNECTIONS = READ_WRITE),
SECONDARY_ROLE (ALLOW_CONNECTIONS=READ_ONLY),
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL
);
Run Code Online (Sandbox Code Playgroud)
辅助服务器
ALTER AVAILABILITY GROUP AG1 JOIN;
Run Code Online (Sandbox Code Playgroud)
显然,我还将主数据库也恢复到了辅助服务器。
一个想法,我没有在任一服务器上安装 SQL 代理,我猜这对于始终可用的可用性组来说不是必需的?
这个问题已经很老了,可能无法再进行故障排除,但是对于那些遇到同样问题的人来说,以下内容可能会有所帮助。这并不是所有可能发生的问题的完整列表,但它会涉及到主要的问题。
当辅助副本被主副本标记为已断开连接时,这意味着主副本尚未听到或无法通过数据库镜像端点联系辅助副本。造成这种情况的原因有多种:
最常见的原因之一是数据库镜像角色的端点配置错误。可以使用多种选项和配置,有时,特别是在手动创建时,这些配置选项不匹配。以 OP 为例:
CREATE ENDPOINT dbm_endpoint
STATE=STARTED
AS TCP (LISTENER_PORT=5022)
FOR DATABASE_MIRRORING (ROLE=ALL)
Run Code Online (Sandbox Code Playgroud)
这将在 tcp 端口 5022 上创建一个名为 dbm_endpoint 的端点,用于数据库镜像。然而,它遗漏了相当多的配置选项,我们假设这些选项是默认的,但我们确实不知道。这意味着默认选项,例如Windows
使用Kerberos
或进行身份验证NTLM
,它也不指定使用哪个 IP 地址(v4、v6、接口),也不指定默认为必需的加密选项,具体取决于 SQL 版本服务RC4
或AES
。
这完全是一个假设,尤其是当它不起作用的时候。如果您不确定端点设置为什么,请加入sys.tcp_endpoints
withsys.database_mirroring_endpoints
将生成的单行转换为单独的配置选项。
例如,有一些高级配置使用证书,因为它们无法使用Windows
身份验证。我们不知道 OP 是否有正确的域以及这些服务器是否已加入。同样,基于端点的假设是,但我们不确定。使用证书时,最大的问题是在多个副本上使用相同的证书,但在复制证书以导入副本时不会导出私钥。由于端点使用私钥/公钥对,因此使用相同的证书将要求该端点有时使用私钥。如果您在多个副本上使用证书,请确保使用两个密钥导出和导入证书。
指定 IP 地址时,默认值ANY
可以是任何 IPv4 或 IPv6 地址。尽管大多数地方不注册或使用 IPv6 地址,但我确实时不时地认为这是一个问题。检查 DNS 中的主机注册了哪些地址可以帮助缩小问题范围。您还可以根据端口设置网络捕获和过滤器。有时会使用 IPv6 地址,但它在其他服务器上设置不当、禁用或防火墙,但通过 DNS 返回。
创建可用性组时,需要指定每个副本,因此需要一个端点 url,该端点 url 将定义通信端口(数据库镜像端点)。
以 OP 为例:
REPLICA ON
'SQL1' WITH
(
ENDPOINT_URL = 'TCP://sql1.sql.sandbox.net:7022',
PRIMARY_ROLE ( ALLOW_CONNECTIONS = READ_WRITE),
SECONDARY_ROLE (ALLOW_CONNECTIONS=READ_ONLY),
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL
),
Run Code Online (Sandbox Code Playgroud)
这个名为 SQL1 的副本在 sql1.sql.sandbox.net 端口 7022 上有一个 TCP 端点。该地址似乎是 FQDN,应检查是否存在或存在正确的 DNS 查找、(如果使用)Kerberos SPN 和防火墙规则。创建的。如果在地址查找中返回多个接口或地址,则将其范围缩小到端点 url 中的特定地址进行测试或在镜像端点规范中缩小范围可能是有意义的。
出现断开连接问题的最后一个领域之一是每个副本上的端点权限。由于每个端点帐户都需要CONNECT
权限(如果使用证书则类似)才能使用端点。这是一个相当常见的问题,非常常见,以至于会在错误日志中进行标记,并在错误消息中为您提供修复,即授予端点连接权限。
由于副本管理器会回复 Windows Server 故障转移群集正在工作(不包括 Linux、Docker 或 Read-Scale)才能启动,因此请确保群集服务正在每个副本上运行,并且每个节点在集群(Powershell、故障转移集群管理器等)。如果集群服务没有运行,那么管理器将停止,直到它重新启动 - 这将记录在错误日志中并且应该非常明显。
当没有其他东西起作用或出现时,你会做什么?
可用性组是一个分布式系统,这意味着有许多单独的部分(副本)分布在通过一组通用协议(可用性组)运行的许多区域(数据库)中。鉴于此,故障排除方法不同于典型的单实例或集群实例故障排除。
每个部分都需要对照自身以及可用的整体元数据进行检查。此外,每个部分都需要检查彼此中介的中介项(例如防火墙、网卡、负载均衡器等)。
首先检查每个副本上的错误日志,因为只有某些错误(由于错误发生的位置)仅在副本为主副本或辅助副本时适用。概述每个错误日志后,这应该指出一个方向 - 如果没有,那么问题很可能出在 SQL Server 下,这可能意味着网络、防火墙、操作系统等。系统和应用程序日志在这里可能会有所帮助,作为下一个步。
请留意系统上安装的 NDIS 驱动程序,因为它们可能会阻塞流量或无法正常工作并丢弃流量。此外,请检查网卡的接口诊断,因为如果断开连接状态是间歇性的,则丢弃/丢弃数据包等问题可能会成为问题。
当所有其他方法都失败时,请对照其他元数据检查每一项,并确保所有元数据都匹配且相同。在上面指定的 OP 元数据中,一个端口位于 7022,另一个端口位于 5022。虽然这本身并没有错误并且可以使用,但它确实会在其他地方产生问题,例如防火墙规则,有人很容易误读端口或假设但不读取端口是相同的。
根据技能水平和知识,来自初级侧和次级侧的网络跟踪将是理想的。这可以显示数据包离开主/辅助并希望到达另一侧。如果没有,则说明中介配置不正确 - 查找阻止流量的防火墙、负载平衡器、路由器等。
归档时间: |
|
查看次数: |
16470 次 |
最近记录: |