【问题标题】:Transform connection string depending on data centre for Azure SQL database根据 Azure SQL 数据库的数据中心转换连接字符串
【发布时间】:2018-08-02 16:05:44
【问题描述】:

我正在将单个数据中心 .NET 应用程序转换为地理分布。当前,在单个 VM 上的 IIS 中运行了一个 Web 应用程序。它使用配置中的连接字符串连接到单个数据库服务器。

我已经为开发、UAT 和生产使用了配置转换,这些转换在部署时从我的构建服务器应用。

在地理分布式设置中,网络应用将部署到 2 个或更多(可能多达 10 个)不同的数据中心。

每个数据中心都将保存异地复制的 Azure SQL 数据库。

我需要每个数据中心的每个 VM 访问位于同一数据中心的 Azure SQL 数据库。

我不想在我的项目中为每个数据中心创建配置,在每个配置转换中指定不同的连接字符串。这是不可维护或不可扩展的。

示例

| Data centre      | VM  | DB server                |
| -------------    |-----| -------------------------|
| UK South         | VM1 | db1.database.windows.net |
| South Central US | VM2 | db2.database.windows.net |
| West US          | VM3 | db3.database.windows.net |
| West Europe      | VM4 | db4.database.windows.net |
| ...              | ... | ...                      |

如您所见,每个数据库服务器的服务器名称不同,这是 Azure SQL 的要求。您不能在不同的数据中心使用相同的名称,因为名称是全局的。

我无法找到将 1 个连接字符串映射到上述每个数据库服务器名称的方法。

Azure 流量管理器能够为您执行地理 DNS,但 Azure SQL 要求您在连接字符串中包含服务器名称(db1、db2...)(作为“服务器名称”的一部分或与“登录”,例如“user@db1”)。

解决这个问题的最佳方法是什么?为每个数据中心创建配置转换是我唯一的选择,还是有其他方法?

【问题讨论】:

  • 您可以从环境变量\vm 名称中读取它,但无论哪种方式,它都必须是某种映射,因此代码可以找出从哪里获取值
  • @4c74356b41 所以你认为我需要调整我的连接字符串在应用程序中的获取方式吗? IE。不要只是从.config 文件中提取纯字符串,而是提取模板字符串并使用交付服务器上的某些环境变量填充空白?有点像使用 SQL 别名(SQL Azure 不支持)。
  • 如何构造它并不重要,但事实是,没有任何内置的所以

标签: azure deployment dns database-connection azure-sql-database


【解决方案1】:

我不知道有任何内置功能可以将 SQL Azure 地理分布式数据库与相应区域匹配以输出正确的连接字符串(我可能是错的)。我知道的唯一地理感知数据库(天蓝色)是 CosmosDB。我建议不要自己编写这种类型的功能,我怀疑它会很脆弱并增加开销,我建议从不同的方向接近它。

您提到了您的构建环境。相同的代码根据其部署到的区域具有不同的设置是很常见的,我通常将这些设置作为 CI\CD 管道的一部分进行管理。当应用程序被部署(通过管道)时,它会更新该区域的设置,作为部署到该特定区域的一部分。如果您部署到新区域,您只需使用正确的连接字符串更新您的 CI\CD。相同的规则适用于 dev\stage 等。管理构建中的复杂性并在其他任何地方保持简单。

【讨论】:

  • 你能指出我做这样的多区域部署的任何文档/博客/指南的方向吗?我们使用 TeamCity 并为之前在 Visual Studio 解决方案中设置的 MSBuild 配置(例如调试、暂存、发布)切换构建参数。您是说我需要在解决方案中为每个数据中心创建配置并在 Team City 中为每个数据中心创建相应的构建步骤吗?还是我会在部署时使用 TeamCity 存储和更改连接字符串,同时仍然为每个区域使用“发布”配置?
【解决方案2】:

我知道您已经对 ATM 进行了一些研究,但从技术上讲,这可以通过自定义 url 和 Azure 流量管理器来完成。这应该可以帮助您解决连接字符串问题。

获取自定义域并将其映射到 Azure ATM。将四个数据库 url 作为外部端点添加到 ATM,您应该有足够的 Azure SQL 连接字符串信息;如果您对自定义 ATM url 进行 nslookup,您将在别名列表中看到您的 4 个数据库 url 之一,其中包含数据库服务器名称。

关于使用 Azure TM 进行地理路由的警告。对于我们不拥有知识产权的情况,这对我来说非常不准确。您也可以使用性能路由,但这并不能 100% 保证您会被路由到最近的数据库服务器。

【讨论】:

  • 谢谢@jeff。我尝试过这样做,但似乎连接字符串上的子域(无论它指向的 ip 是什么)都需要与数据库服务器名称匹配。例如,db1.mycustomdonain.com 仅在 ATM 解析为 db1.database.windows.net 的 ip 时才有效。其他人将失败。我错过了什么吗?
  • 数据库服务器 url(即 db1.database.windows.net)返回给您并在本地缓存您的 TTL 值(默认为 300 秒)。使用该 url(而不是 ATM url)来建立你的数据库连接。
  • 但这需要在应用代码中手动进行 nslookup,而不是仅仅将连接字符串用作“普通”连接字符串,对吗?
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 2017-03-07
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多