首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当缺少默认端口,AG侦听器指定端口1433时,SQL浏览器如何工作?

当缺少默认端口,AG侦听器指定端口1433时,SQL浏览器如何工作?
EN

Database Administration用户
提问于 2022-11-14 15:59:15
回答 2查看 214关注 0票数 0

背景:

为了保持简单,我们有一个2节点集群,其中集群中的每个节点都安装了3个SQL实例:默认+2名。我理解实例堆叠是不好的,这是我们正在积极摆脱的东西。其中2/3的节点使用Server (缺省&1个命名实例),而另一个节点使用FCI作为DR (最后一个实例并不真正涉及这个问题,但无论如何都要添加它)。我们所有的侦听器都使用端口1433,因为微软在几年前的迁移过程中就建议采用这种方法,因为添加非默认端口将需要在连接时将端口号包括在侦听器名称中。事后看来,我不知道为什么在创建AG监听器时不可能简单地将端口包括在AG侦听器中,因为它是通过CNAME混淆到应用程序中的。我相信我们当时并不知道这一点,并且错误地认为这将要求我们在公司的每个conn字符串中添加",port“,所以我们选择了对每个听者使用1433。

问题:

在下面的示例中,当在非默认端口(例如1400)上设置SQL的默认实例时,所有应用程序都会按预期进行连接。但是,当使用默认端口时,所有CNAMES意外地路由到1433 (猜测这是因为侦听器本身位于端口1433上)。我试图确定的是,当用户试图连接到1433 (但它不存在)时,浏览器是否标识没有端口1433的实例,因此它执行某种辅助检查/解析逻辑,将侦听器本身的名称与适当的SQL实例关联起来?

找到了另一个解释此场景的microsoft文档,但它未能解释SQL如何能够将侦听器VNN与实例本身关联起来。在我看来,WSFC资源将该信息与客户端联系起来,以确定哪个侦听器路由到哪个实例。但是,如果1433上有一个实例,SQL将不适当地将所有内容路由到该实例,前提是所有侦听器都是在1433上设置的。

“在配置可用性组侦听器时,必须通过SSMS指定一个端口。您可以将默认端口配置为1433,以便使客户端连接字符串变得简单。这意味着,如果使用1433,则不需要在应用程序的连接字符串中包含端口号。此外,由于每个可用性组侦听器都有一个单独的虚拟网络名称,因此可以将单个WSFC上配置的每个可用性组侦听器配置为引用相同的默认端口1433。

如果对可用性组侦听器VNNs使用默认端口1433,则仍然需要确保集群节点上没有其他服务使用此端口;否则将导致端口冲突。

如果Server的一个实例已经通过实例侦听器侦听TCP端口1433,并且在侦听端口1433的计算机上没有其他服务(包括SQL Server的其他实例),这不会导致与可用性组侦听器发生端口冲突。这是因为可用性组侦听器可以在同一进程中共享相同的TCP端口。但是,不能将Server的多个实例(并排)配置为在同一个端口上侦听,因为其中一个实例将无法侦听连接。

还可以指定非标准可用性组侦听器端口。但是,在连接到侦听器时,还需要显式地使用应用程序连接字符串中的目标端口。您还需要在防火墙上打开此端口的权限。

您可以使用名称和端口(如果不是1433)连接到侦听器。端口可以是侦听器端口,也可以是配置用于侦听的底层Server端口。“- https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/availability-group-listener-overview?view=sql-server-ver16

EN

回答 2

Database Administration用户

回答已采纳

发布于 2022-11-14 17:09:29

我试图确定的是,当用户试图连接到1433 (但它不存在)时,浏览器是否标识没有端口1433的实例,因此它执行某种辅助检查/解析逻辑,将侦听器本身的名称与适当的SQL实例关联起来?

SQL浏览器根本不与可用性组交互。句号。

我们所有的侦听器都使用端口1433,因为微软在几年前的迁移过程中就建议采用这种方法,因为添加非默认端口将需要在连接时将端口号包括在侦听器名称中。

这是正确的,具有可用性组的非标准端口将需要使用端口号。

对OP答案的响应

如果我不正确,请让我知道,我会编辑我的答案。

你错了。

如果您的设置涉及同一台机器上的多个SQL实例,并且将侦听器配置为在端口1433上运行,则必须在端口1433上没有其他侦听服务(例如,默认的SQL实例)。

这是错误的,没有其他项目可以在相同的IP和端口组合。这是基本的网络基础。您可以使用不同的IP地址和相同的端口(例如,参见下文)。

如果启用了SQL的默认实例,并且客户端正在连接到使用端口1433的侦听器,则端口冲突将发生,因为客户端将导航到主机主节点(AG listener IP),然后立即路由到1433 ( SQL的默认实例),因为SQL Service端口优先于AG侦听器端口。

它不是这样工作的。首先,如果试图绑定相同的IP/端口组合体,则会发生错误。在Server中,这通常会引发错误10013:An attempt was made to access a socket in a way forbidden by its access permissions.第二,因为绑定尝试将失败,无论是谁或任何侦听该唯一IP/端口组合的人仍然拥有绑定,因此任何使用绑定的连接都将继续使用它。

没有端口、AG、SQL的“优先级”之类的东西。正如我前面所解释的那样。

The Rub

这一切都归结为基本的网络和适当的配置。

在下面的屏幕截图中,您可以看到在同一台服务器上堆放着3个实例,所有这些实例都与1433上的侦听器一起进行连接。

这要求您正确配置Server网络,并且有多种方法。一种选择是给网络接口提供多个IP地址,或者为每个实例创建一个网络接口。另一种方法是告诉Server停止侦听所有IP,而只侦听一些IP。为了显示更好的Server配置,并且由于您需要使用第一个选项进行配置,所以我以这种方式配置了它。

请注意,我关闭了“全部侦听”,只启用了我想要的特定IP。这将删除IP ANY上的侦听,然后停止在所有IP上为每个AG绑定到侦听器端口的尝试。由于不再存在任何0.0.0.0:1433绑定,因此不存在冲突,因为每个实例都有一个唯一的IP:端口组合,包括侦听器。

为了重申OPs多个问题的全部症结,SQL浏览器不适用于AGs。CNAME与港口没有约束力,也没有任何关系。IP:端口组合必须是唯一的,没有端口复制魔术发生(虽然您可以制作套接字复制器和重定向器,但这是超出范围的)。

票数 1
EN

Database Administration用户

发布于 2022-11-15 13:14:07

我相信我已经做了足够的研究,以更好地了解正在发生的事情,所以我在这里张贴我的答案,希望它将有益于其他人。如果我不正确,请让我知道,我会编辑我的答案。

正如Sean所说,当通过侦听器连接到AG时,SQL浏览器是不相关的。如果您的设置涉及同一台机器上的多个SQL实例,并且将侦听器配置为在端口1433上运行,则必须在端口1433上没有其他侦听服务(例如,默认的SQL实例)。如果启用了SQL的默认实例,并且客户端正在连接到使用端口1433的侦听器,则端口冲突将发生,因为客户端将导航到主机主节点(AG listener IP),然后立即路由到1433 ( SQL的默认实例),因为SQL Service端口优先于AG侦听器端口。当SQL的默认实例更改为1433以外的端口时,连接客户端再次连接到侦听器IP,然后使用唯一的TCP IP地址+ TCP端口,它能够正确地路由到SQL的正确实例。

票数 -1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/319646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档