【问题标题】:Why is SQL Server 2019 container (deployed in Azure Container Instances) not able to accept connections right after it has started?为什么 SQL Server 2019 容器(部署在 Azure 容器实例中)在启动后无法立即接受连接?
【发布时间】:2022-01-19 06:42:37
【问题描述】:

使用 docker compose(和 ACI 集成),我启动要在 Azure 容器实例中运行的服务。其中一项服务是 SQL Server 2019 docker 容器。让容器启动并运行需要一点时间。但是,即使 SQL Server 容器处于运行状态并且日志显示它已成功启动,SQL Server 也需要很长时间(几分钟)才能接受连接。

有人知道为什么需要这么长时间吗?

因此,当尝试使用 sqlcmd 连接到服务器时,在服务器启动后几分钟后,我不断收到以下响应:

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x102.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..

更新 [2021/12/22]:

我还想知道为什么从 DB 容器中执行的“top”命令会显示以下内容。 mssql 进程使用几乎 100% 的 CPU。但是,CPU 的整体状态(请参阅“%Cpu(s):”行)显示 CPU 空闲率为 66%。 有人知道为什么吗?

【问题讨论】:

  • 你试过自己研究这个吗?你试过什么有帮助/没有帮助?最早的谷歌搜索结果之一:github.com/microsoft/mssql-docker/issues/644
  • 你运行docker logs <container_id> | less了吗?您可能会观察到 SQL Server 需要一些时间来加载每个系统和用户数据库,其中包括回滚不完整的事务、验证页面以及将文件升级到最新的文件格式版本。只有在那之后,它才会打开一个服务器套接字来接受客户端连接。有人会假设您的 Docker/k8s 健康检查应该测试 mssql 进程是否正在接受连接,而不仅仅是该进程本身正在运行。
  • @Alex 是的,我已经做了一些研究,但还没有找到答案。感谢您在 github 上向我指出该问题。
  • @AlwaysLearning 是的,我总是先检查容器日志。从日志中可以看出,服务器已准备就绪。没有用户数据库,它只是一个空服务器(带有主数据库等)。日志显示“服务器正在侦听任何地址..”,它最后还包含以下消息,通常表明(我从本地运行 ????‍♀️ 它知道)数据库已启动。 Recovery is complete. This is an informational message only. No user action is required. 但是,服务器通常会在几分钟后不接受任何远程连接。
  • 可能是,公网DNS地址未设置,MSSQL服务尚未启动,首次尝试连接的容器未绑定。

标签: sql-server azure docker docker-compose azure-container-instances


【解决方案1】:

• 我尝试通过在容器组实例中部署 mssql/server:2019-CU12-ubuntu-20.04 映像在我的环境中重现您的场景。我几乎可以在容器实例启动后立即连接到它。此外,在启动容器组实例后,我几乎立即通过 sqlcmd 实用程序连接到 SQL 数据库服务。以下是供您参考的屏幕截图:-

我建议您重新配置分配给运行 SQL 映像的 ACI 组的 vCPU 和内存,并再次重新启动 ACI 组,然后再次尝试连接到其中的 SQL 实例。它应该在启动 ACI 后几乎立即连接。

此外,由于可用资源不足,SQL 服务可能需要更长的时间才能启动并通过 DNS 被发现。

问题更新:- ACI CPU 使用率指标似乎以毫核为单位,而不是百分比。因此,当您看到上面的 mssql 进程使用 99.7% 的 CPU 时,这意味着一个 CPU 使用了 99.7 毫核,几乎占单个 vCPU 内核的 10%。

有关 CPU 使用率计算的更多详细信息,请参阅此文档链接:-

https://docs.microsoft.com/en-us/azure/container-instances/container-instances-monitor#available-metrics

【讨论】:

  • 您好,感谢您试用。我今天又试了一次。我第一次和第二次重新启动容器时,可以从远程机器立即访问数据库。但是,在第 3 次尝试时,即使 7 分钟后也无法访问数据库(即使数据库日志显示它已启动)。 DB 容器预留了 2 个 vCPU 和 4 GB 内存。我想知道这是否仍然与缺乏可用资源或网络配置需要时间有关。
  • 对上述问题添加了更新。
  • 请检查上面的答案,我已对其进行了编辑,以包括您编辑的问题的答案,以尽可能提高我的理解水平。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2011-04-21
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多