你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

部署拆分/合并服务以在分片数据库之间移动数据

适用于:Azure SQL 数据库

可使用拆分/合并工具在分片数据库之间移动数据。 请参阅在扩横向扩展的云数据库之间移动数据

注意

拆分/合并工具适用于 Azure Web 应用。 云服务(经典版)的生命周期将于 2024 年 8 月 31 日结束。 如果在云服务(经典)上使用拆分/合并工具,请在 2024 年 8 月 31 日之前迁移到 Azure Web 应用。

先决条件

  1. 创建将用作拆分/合并状态数据库的 SQL 数据库。 转到 Azure 门户。 创建一个新的 SQL 数据库。 命名数据库并创建新的管理员和密码。 确保记录该名称和密码以供日后使用。

  2. 确保 Azure 中的逻辑服务器允许 Azure 服务连接到它。 在 Azure 门户中,在逻辑服务器的“防火墙设置”中,确保“允许访问 Azure 服务”设置设为“打开”。 选择“保存”图标。

  3. 创建用于诊断输出的 Azure 存储帐户。

  4. 使用公共拆分-合并 docker 映像,或将拆分-合并 docker 映像推送到所选 Azure 容器服务或 docker 注册表。

为服务创建两个 Azure Web 应用

创建两个 Web 应用 - workerUI Web 应用。

辅助角色 Web 应用

  1. Azure 门户中创建 Web 应用

  2. 在“发布”字段中,选择“容器”。

  3. 对于“操作系统”,请选择“Windows” 。

  4. 转到“Docker”选项卡。

  5. 填充以下信息:
    映像源Docker hub
    访问类型Public
    映像和标记mcr.microsoft.com/splitmerge/splitmergeworker:20240812.1

  6. 使用“查看 + 创建”以创建 Web 应用。

UI Web 应用

若要创建 UI Web 应用,请遵循与创建辅助角色 Web 应用相同的步骤进行操作,但有一点不同:

  • 映像和标记”字段中的不同 docker 映像:mcr.microsoft.com/splitmerge/splitmergeweb:20240812.1

配置拆分/合并 Web 应用

配置安全性

有关配置服务安全性的详细说明,请参阅拆分/合并安全配置

为了针对本教程创建一个简单的测试部署,将执行少量的配置步骤来使服务正常运行。 仅一个计算机/帐户可以执行这些步骤,以便与服务进行通信。

创建自签名证书和 PFX 文件

使用 PowerShell 创建自签名证书和 PFX 文件。

首先,创建一个新目录。 然后相应地替换内联值,并从新目录中运行下面的 PowerShell 命令:

  $cert = New-SelfSignedCertificate -Subject "CN=*.cloudapp.net" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256
  $mypwd = ConvertTo-SecureString -String "{myPassword}" -Force -AsPlainText  ## Replace {myPassword}
  Export-PfxCertificate -Cert $cert -FilePath "C:\Users\admin\Desktop\$certname.pfx" -Password $mypwd   ## Specify your preferred location

将 PFX 文件上传到 Web 应用并启用证书使用情况

workerUI Web 应用重复以下步骤。

  1. 转到 Azure 门户
  2. 选择“应用服务”。
  3. 为拆分/合并工具选择上面创建的 Web 应用。
  4. 从菜单中选择“证书”。
  5. 选择自带证书 (.pfx)
  6. 从栏中选择“添加证书”。
  7. 选择 PFX 文件并输入上面所述的相同密码。
  8. 完成操作后,从列表中的新条目复制证书指纹。
  9. 在 Web 应用菜单中,打开“设置” / “配置”。
  10. 将“客户端证书模式”设置为 Require

Web 应用配置

workerUI Web 应用重复以下步骤。

  1. 打开已部署的 Web 应用,并转到“设置”>“环境变量”>“应用设置”。 选择 添加

  2. 添加一个名为 ElasticScaleMetadata 的变量,其值是之前部署的状态数据库的连接字符串。

    重要

    目前,状态数据库必须使用拉丁语排序规则 (SQL\_Latin1\_General\_CP1\_CI\_AS)。 有关详细信息,请参阅 Windows 排序规则名称

    对于 Azure SQL 数据库,连接字符串通常采用以下格式:

    Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<userId>; Password=<password>; Encrypt=True; Connection Timeout=30

  3. 添加其他变量:

    名称
    WorkerRoleSynchronizationStorageAccountConnectionString 对以前创建的 Azure 存储有效的连接字符串。
    DataEncryptionPrimaryCertificateThumbprint 以前生成的证书指纹。
    MetadataExpirationPeriodInMinutes 20160
    MaxRetryCount 5
    WEBSITE_LOAD_CERTIFICATES *
    WEBSITE_PULL_IMAGE_OVER_VNET 0
  4. 选择“应用”并重启应用程序。

  5. workerUI Web 应用重复相同的步骤。

排查部署问题

如果 Web 角色无法联机,则可能是安全配置有问题。 检查是否已按前面所述配置了 TLS/SSL。

如果辅助角色无法联机,但是 Web 角色已成功,则很可能是在连接到之前创建的状态数据库时出现了问题。

  • 确保连接字符串正确。

  • 检查服务器和数据库是否存在,以及用户 ID 和密码是否正确。

  • 对于 Azure SQL 数据库,连接字符串应采用以下形式:

    Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<user>; Password=<password>; Encrypt=True; Connection Timeout=30

  • 确保服务器名称不以 https:// 开头。

  • 确保服务器允许 Azure 服务与其连接。 为此,请在门户中打开数据库,并确保“允许访问 Azure 服务”设置设为“打开”。

测试服务部署

使用 Web 浏览器建立连接

转到 UI Web 应用的“概述”,然后选择“浏览”。 如果出现提示,请选择正确的证书。

使用 PowerShell 脚本进行测试

可以通过运行包含的示例 PowerShell 脚本测试部署和环境。

重要

示例脚本在 PowerShell 5.1 上运行。 它们当前未在 PowerShell 6 或更高版本上运行。

包含的脚本文件为:

  1. SetupSampleSplitMergeEnvironment.ps1 - 为拆分/合并设置测试数据层。

    1. 创建分片映射管理器数据库。
    2. 创建两个分片数据库。
    3. 为这些数据库创建一个分片映射(删除这些数据库上的任何现有分片映射)。
    4. 在这两个分片中创建一个小的示例表,并使用一个分片填充该表。
    5. 声明分片表的 SchemaInfo。
  2. ExecuteSampleSplitMerge.ps1 - 对测试数据层执行测试操作。

    1. 将拆分请求发送到拆分/合并服务 Web 前端,以将数据从第一个分片到第二个分片拆分为两半。
    2. 轮询拆分请求状态的 Web 前端并等待该请求完成。
    3. 将合并请求发送到拆分/合并服务 Web 前端,以将数据从第二个分片移回到第一个分片。
    4. 轮询合并请求状态的 Web 前端并等待该请求完成。
  3. GetMappings.ps1 - 输出分片映射的当前状态的最上层示例脚本。

  4. ShardManagement.psm1 - 包装 ShardManagement API 的帮助程序脚本。

  5. SqlDatabaseHelpers.psm1 - 用于在 SQL 数据库中创建和管理数据库的帮助程序脚本。

使用 PowerShell 验证部署

  1. 打开新的 PowerShell 窗口并导航到下载拆分/合并包的目录,然后导航到“PowerShell”目录中。

  2. 创建一个将要在其中创建分片映射管理器和分片的服务器(或选择现有服务器)。

    注意

    默认情况下,SetupSampleSplitMergeEnvironment.ps1 脚本将在同一服务器上创建所有这些数据库以简化脚本。 这并不表示拆分/合并服务本身存在限制。

    拆分/合并服务需要对数据库具有读/写访问权限的 SQL 身份验证登录,才能移动数据并更新分片映射。 由于拆分/合并服务在云中运行,因此当前不支持集成的身份验证。

    确保服务器已配置为允许从运行这些脚本的计算机的 IP 地址进行访问。 可以在 SQL Server/防火墙和虚拟网络/客户端 IP 地址下找到此设置。

  3. 执行 SetupSampleSplitMergeEnvironment.ps1 脚本以创建示例环境。

    运行此脚本会擦除分片映射管理器数据库和分片上任何现有的分片映射管理数据结构。 若要重新初始化分片映射或分片,重新运行脚本可能会很有用。

    示例命令行:

    .\SetupSampleSplitMergeEnvironment.ps1 ^
    -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  4. 执行 Getmappings.ps1 脚本以查看示例环境中当前存在的映射。

    .\GetMappings.ps1 ^
    -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  5. 执行 ExecuteSampleSplitMerge.ps1 脚本以执行拆分操作(将第一个分片上一半的数据移至第二个分片),然后执行合并操作(将数据移回第一个分片)。 如果已配置 TLS 并且已将 http 终结点保留为禁用,请确保改用 https:// 终结点。

    示例命令行:

    .\ExecuteSampleSplitMerge.ps1 ^
    -UserName 'mysqluser' -Password 'MySqlPassw0rd' ^
    -ShardMapManagerServerName 'abcdefghij.database.windows.net' ^
    -SplitMergeServiceEndpoint 'https://mysplitmergeservice.cloudapp.net' ^
    -CertificateThumbprint '0123456789abcdef0123456789abcdef01234567'
    

    如果收到以下错误,则很可能是 Web 终结点证书有问题。 尝试使用最喜欢的 Web 浏览器连接到 Web 终结点并检查是否存在证书错误。

    Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLSsecure channel.

    如果成功,输出应类似于以下输出:

    .\ExecuteSampleSplitMerge.ps1 -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net' -SplitMergeServiceEndpoint 'http://mysplitmergeservice.cloudapp.net' -CertificateThumbprint 0123456789abcdef0123456789abcdef01234567
    Sending split request
    Began split operation with id dc68dfa0-e22b-4823-886a-9bdc903c80f3
    Polling split-merge request status. Press Ctrl-C to end
    Progress: 0% | Status: Queued | Details: [Informational] Queued request
    Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request.
    Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target     shards.
    Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from     source to target shard.
    Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Waiting for reference tables copy     completion.
    Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from     source to target shard.
    Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of     Sharded tables
    Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range     [100:110) for table [dbo].[MyShardedTable]
    ...
    ...
    Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table     [dbo].[MyShardedTable].
    Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created     while processing the request.
    Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request.
    Sending merge request
    Began merge operation with id 6ffc308f-d006-466b-b24e-857242ec5f66
    Polling request status. Press Ctrl-C to end
    Progress: 0% | Status: Queued | Details: [Informational] Queued request
    Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request.
    Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target     shards.
    Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from     source to target shard.
    Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of     Sharded tables
    Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range     [100:110) for table [dbo].[MyShardedTable]
    ...
    ...
    Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table     [dbo].[MyShardedTable].
    Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created     while processing the request.
    Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request.
    
  6. 试用其他数据类型。 所有这些脚本均采取可选的 -ShardKeyType 参数,该参数允许指定密钥类型。 默认值为 Int32,但你也可以指定 Int64、Guid 或 Binary。

创建请求

可以通过 Web UI 或通过导入并使用 SplitMerge.psm1 PowerShell 模块(该模块会通过 Web 角色提交请求)使用该服务。

该服务可以移动分片表和引用表中的数据。 分片表具有一个分片密钥列并在不同的分片上具有不同的行数据。 引用表未进行分片,因此它在每个分片上都包含相同的行数据。 引用表对于不经常更改的数据非常有用,并且用于在查询中与分片表联接。

为了执行拆分/合并操作,必须声明要移动的分片表和引用表。 使用 SchemaInfo API 完成此操作。 此 API 位于 Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema 命名空间中。

  1. 对于每个分片表,请创建一个 ShardedTableInfo 对象,该对象在包含分片密钥的表中描述了此表的父架构名称(可选,默认为“dbo”)、表名称以及列名称。
  2. 对于每个引用表,请创建一个 ReferenceTableInfo 对象,该对象描述了此表的父架构名称(可选,默认为“dbo”)和表名称。
  3. 将前面的 TableInfo 对象添加到新的 SchemaInfo 对象。
  4. 获取对 ShardMapManager 对象的引用,然后调用 GetSchemaInfoCollection
  5. SchemaInfo 添加到 SchemaInfoCollection,从而提供分片映射名称。

可在 SetupSampleSplitMergeEnvironment.ps1 脚本中看到此操作的示例。

拆分/合并服务不会为用户创建目标数据库(或为数据库中的任何表创建架构)。 在将请求发送到服务之前,必须预先创建它们。

已知错误

在运行示例 PowerShell 脚本时,可能会看到以下消息:

Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

此错误表示 TLS/SSL 证书未正确配置。 按照使用 Web 浏览器建立连接部分中的说明进行操作。

如果无法提交请求,可能会看到以下内容:

[Exception] System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'dbo.InsertRequest'.

在这种情况下,请检查配置文件,特别是 WorkerRoleSynchronizationStorageAccountConnectionString 的设置。 此错误通常表示辅助角色无法成功初始化首次使用的元数据数据库。

尚未使用弹性数据库工具? 请查看入门指南。 如有问题,请在有关 SQL 数据库的 Microsoft Q&A 问题页面上联系我们;如有功能请求,请在 SQL 数据库反馈论坛添加新意见或为现有意见投票。