Bereitstellen eines Split-Merge-Diensts, um Daten zwischen Sharddatenbanken zu verschieben
Gilt für:: Azure SQL-Datenbank
Mit dem Split-Merge-Tool können Sie Daten zwischen Sharddatenbanken verschieben. Siehe Skalierung mit dem Split-Merge-Tool für elastische Datenbanken.
Hinweis
Das Tool für die geteilte Zusammenführung ist für Azure Web-Apps vorgesehen. Das Ende der Lebensdauer für die Cloud Services (Classic) ist der 31. August 2024. Wenn Sie das Tool für die geteilte Zusammenführung in Cloud Services (Klassisch) verwenden, migrieren Sie vor dem 31. August 2024 zu Azure Web-Apps.
Voraussetzungen
Erstellen Sie eine SQL-Datenbank, die als Split-Merge-Statusdatenbank verwendet wird. Öffnen Sie das Azure-Portal. Erstellen Sie eine neue SQL-Datenbank. Geben Sie der Datenbank einen Namen, und erstellen Sie einen neuen Administrator und ein neues Kennwort. Achten Sie darauf, dass Sie den Namen und das Kennwort zur späteren Verwendung notieren.
Achten Sie darauf, dass Ihr logischer Server in Azure Verbindungen mit Azure-Diensten zulässt. Stellen Sie im Azure Portal in den Firewalleinstellungen für Ihren logischen Server sicher, dass die Einstellung Zugriff auf Azure-Dienste erlauben auf Ein festgelegt ist. Wählen Sie das Symbol Speichern aus.
Erstellen Sie ein Azure-Speicherkonto für die Diagnoseausgabe.
Verwenden Sie die öffentlichen Docker-Images für die geteilte Zusammenführung oder pushen Sie Docker-Images für geteilte Zusammenführungen entweder an Azure Container Service oder Ihre Docker-Registrierung.
Erstellen von zwei Azure Web-Apps für Ihren Dienst
Erstellen Sie zwei Web-Apps – eine worker
und UI
eine Web-App.
Worker-Web-App
Erstellen Sie eine Web-App im Azure-Portal.
Wählen Sie im Feld Veröffentlichen Container aus.
Wählen Sie unter Betriebssystem die Option Windows aus.
Fahren Sie mit der Registerkarte Docker fort.
Geben Sie die folgenden Informationen ein:
Imagequelle:Docker hub
Zugriffstyp:Public
Image und Tag:mcr.microsoft.com/splitmerge/splitmergeworker:20240812.1
Wählen Sie Überprüfen und erstellen aus, um die Web-App zu erstellen.
UI-Web-App
Führen Sie zum Erstellen der UI-Web-App die gleichen Schritte aus, die Sie zum Erstellen der Worker-Web-App verwendet haben, mit einem Unterschied:
- Ein anderes Docker-Image im Feld Bild und Tag:
mcr.microsoft.com/splitmerge/splitmergeweb:20240812.1
Konfigurieren Ihrer Split-Merge-Web-Apps
Konfigurieren der Sicherheit
Ausführliche Anweisungen zum Konfigurieren der Dienstsicherheit finden Sie unter Split-Merge-Sicherheitskonfiguration.
Für eine einfache Testbereitstellung, die für dieses Tutorial geeignet ist, führen Sie einige wenige Konfigurationsschritte aus, um den Dienst zu aktivieren und auszuführen. Durch diese Schritte werden nur ein Computer und Konto für die Kommunikation mit dem Dienst aktiviert.
Erstellen eines selbstsignierten PFX-Zertifikats
Verwenden Sie PowerShell, um ein selbstsigniertes Zertifikat und eine PFX-Datei zu erstellen.
Erstellen Sie zunächst ein neues Verzeichnis. Ersetzen Sie dann die Inline-Werte entsprechend, und führen Sie die folgenden PowerShell-Befehle aus dem neuen Verzeichnis aus:
$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
Hochladen der PFX-Datei in die Web-Apps und Aktivieren der Zertifikatverwendung
Wiederholen Sie die folgenden Schritte für die Web-Apps worker
und UI
.
- Öffnen Sie das Azure-Portal.
- Wählen Sie App Services aus.
- Wählen Sie die Web-App aus, die Sie oben für das Tool für die geteilte Zusammenführung erstellt haben.
- Wählen Sie Zertifikate im Menü aus.
- Wählen Sie Bring your own Certificate (.pfx).
- Wählen Sie in der Leiste Zertifikat hinzufügen aus.
- Wählen Sie die PFX-Datei aus, und geben Sie dasselbe Kennwort wie oben ein.
- Nach Abschluss kopieren Sie den Zertifikatfingerabdruck aus dem neuen Eintrag in der Liste.
- Öffnen Sie im Steuerungsbereich der Web-App Einstellungen / Konfiguration.
- Legen Sie Clientzertifikatmodus auf
Require
fest.
Web-App-Konfiguration
Wiederholen Sie die folgenden Schritte für die Web-Apps worker
und UI
.
Öffnen Sie die bereitgestellte Web App, und wechseln Sie zu Einstellungen>Umgebungsvariablen>App-Einstellungen. Wählen Sie Hinzufügen.
Fügen Sie eine Variable mit dem Namen ElasticScaleMetadata und dem Wert mit der Verbindungszeichenfolge für die zuvor bereitgestellte Statusdatenbank hinzu.
Wichtig
Zu diesem Zeitpunkt muss die Statusdatenbank die Sortierung „Latin“ verwenden (
SQL\_Latin1\_General\_CP1\_CI\_AS
). Weitere Informationen finden Sie unter Name der Windows-Sortierung.Bei der Azure SQL-Datenbank weist die Verbindungszeichenfolge in der Regel folgendes Format auf:
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<userId>; Password=<password>; Encrypt=True; Connection Timeout=30
Hinzufügen zusätzlicher Variablen:
Name Wert WorkerRoleSynchronizationStorageAccountConnectionString Gültige Verbindungszeichenfolge für den zuvor erstellten Azure-Speicher. DataEncryptionPrimaryCertificateThumbprint Zuvor generierter Zertifikatfingerabdruck. MetadataExpirationPeriodInMinutes 20160 MaxRetryCount 5 WEBSITE_LOAD_CERTIFICATES * WEBSITE_PULL_IMAGE_OVER_VNET 0 Wählen Sie Anwenden aus, und starten Sie die Anwendung neu.
Wiederholen Sie die gleichen Schritte für die Web-Apps
worker
undUI
.
Problembehandlung bei der Bereitstellung
Wenn Ihre Webrolle nicht online geschaltet wird, liegt möglicherweise ein Problem mit der Sicherheitskonfiguration vor. Überprüfen Sie, ob TLS/SSL wie zuvor beschrieben konfiguriert ist.
Wenn die Workerrolle nicht online geschaltet wird, während der Vorgang bei der Webrolle erfolgreich ist, liegt sehr wahrscheinlich ein Problem beim Herstellen der Verbindung mit der Statusdatenbank vor, die Sie zuvor erstellt haben.
Stellen Sie sicher, dass die Verbindungszeichenfolge richtig ist.
Vergewissern Sie sich, dass der Server und die Datenbank vorhanden sind und dass die Benutzer-ID und das Kennwort korrekt sind.
Bei der Azure SQL-Datenbank sollte die Verbindungszeichenfolge folgendes Format aufweisen:
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<user>; Password=<password>; Encrypt=True; Connection Timeout=30
Stellen Sie sicher, dass der Servername nicht mit
https://
beginnt.Achten Sie darauf, dass Ihr Server Verbindungen mit Azure-Diensten zulässt. Öffnen Sie dazu Ihre Datenbak im Portal, und stellen Sie sicher, dass die Einstellung Zugriff auf Azure-Dienste erlauben auf Ein festgelegt ist.
Testen der Dienstbereitstellung
Herstellen einer Verbindung mit einem Webbrowser
Wechseln Sie zur Übersicht Ihrer UI
Web-App, und wählen Sie Durchsuchen aus. Wählen Sie das richtige Zertifikat aus, wenn Sie dazu aufgefordert werden.
Testen mit PowerShell-Skripts
Die Bereitstellung und Ihre Umgebung können getestet werden, indem Sie die im Paket enthaltenen PowerShell-Beispielskripts ausführen.
Wichtig
Die Beispielskripts werden unter PowerShell 5.1 ausgeführt. Sie können derzeit nicht unter PowerShell 6 oder höher ausgeführt werden.
Die enthaltenen Skriptdateien lauten:
SetupSampleSplitMergeEnvironment.ps1
– richtet eine Testdatenschicht für Split-Merge ein.- Erstellt eine ShardMapManager-Datenbank.
- Erstellt zwei Sharddatenbanken.
- Erstellt eine Shard Map für diese Datenbanken (löscht alle vorhandenen Shard Maps für diese Datenbanken).
- Erstellt eine kleine Beispieltabelle in beiden Shards und füllt die Tabelle in einem der Shards auf.
- Deklariert SchemaInfo für die Shardtabelle.
ExecuteSampleSplitMerge.ps1
- führt Testoperationen auf der Testdatenschicht aus.- Sendet eine Teilungsanforderung an das Web-Front-End des Split-Merge-Diensts, wodurch eine Hälfte der Daten vom ersten auf den zweiten Shard verteilt wird.
- Ruft den Status der Teilungsanforderung vom Web-Front-End ab und wartet, bis die Anforderung abgeschlossen ist.
- Sendet eine Zusammenführungsanforderung an das Web-Front-End des Split-Merge-Diensts, wodurch die Daten vom zweiten wieder auf den ersten Shard verschoben werden.
- Ruft den Status der Zusammenführungsanforderung vom Web-Front-End ab und wartet, bis die Anforderung abgeschlossen ist.
GetMappings.ps1
- Beispielskript auf oberster Ebene, das den aktuellen Status der Shardzuordnungen druckt.ShardManagement.psm1
- Hilfsskript, das die ShardManagement-API umschließt.SqlDatabaseHelpers.psm1
- Hilfsskript zum Erstellen und Verwalten von Datenbanken in Azure SQL-Datenbank.
Überprüfen der Bereitstellung mithilfe von PowerShell
Öffnen Sie ein neues PowerShell-Fenster, und navigieren Sie zu dem Verzeichnis, in das Sie das Split-Merge-Paket heruntergeladen haben, und wechseln Sie dann in das Verzeichnis „powershell“.
Erstellen Sie einen Server (oder wählen Sie einen vorhandenen Server aus), auf dem ShardMapManager und Shards erstellt werden.
Hinweis
Das Skript
SetupSampleSplitMergeEnvironment.ps1
erstellt alle diese Datenbanken standardmäßig auf dem gleichen Server, um das Skript einfach zu halten. Dies ist keine Einschränkung des Split-Merge-Diensts selbst.Damit der Split-Merge-Dienst Daten verschieben und die Shard Map aktualisieren kann, ist eine Anmeldung mit SQL-Authentifizierung und Lese-/Schreibzugriff auf die Datenbanken erforderlich. Da der Split-Merge-Dienst in der Cloud ausgeführt wird, bietet er derzeit keine Unterstützung für die integrierte Authentifizierung.
Stellen Sie sicher, dass der Server so konfiguriert ist, dass er den Zugriff über die IP-Adresse des Computers zulässt, auf dem diese Skripts ausgeführt werden. Diese Einstellung finden Sie unter „SQL Server“ > „Firewalls und virtuelle Netzwerke“ > „Client-IP-Adressen“.
Führen Sie das
SetupSampleSplitMergeEnvironment.ps1
-Skript aus, um die Beispielumgebung zu erstellen.Durch die Ausführung dieses Skripts werden alle vorhandenen Datenstrukturen der Shard Map-Verwaltung in der ShardMapManager-Datenbank und auf den Shards gelöscht. Es kann sinnvoll sein, das Skript erneut auszuführen, wenn Sie die Shard-Map oder Shards neu initialisieren möchten.
Beispiel für eine Befehlszeile:
.\SetupSampleSplitMergeEnvironment.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
Führen Sie das Skript „Getmappings.ps1“ aus, um die derzeit in der Beispielumgebung vorhandenen Zuordnungen anzuzeigen.
.\GetMappings.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
Führen Sie das Skript
ExecuteSampleSplitMerge.ps1
aus, um einen Teilungsvorgang auszuführen (die Hälfte der Daten vom ersten Shard auf den zweiten Shard zu verschieben) und dann einen Zusammenführungsvorgang auszuführen (die Daten wieder zurück auf den ersten Shard zu verschieben). Wenn Sie TLS konfiguriert und den http-Endpunkt deaktiviert gelassen haben, stellen Sie sicher, dass Sie stattdessen den https://-Endpunkt verwenden.Beispiel für eine Befehlszeile:
.\ExecuteSampleSplitMerge.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' ^ -ShardMapManagerServerName 'abcdefghij.database.windows.net' ^ -SplitMergeServiceEndpoint 'https://mysplitmergeservice.cloudapp.net' ^ -CertificateThumbprint '0123456789abcdef0123456789abcdef01234567'
Wenn Sie den folgenden Fehler erhalten, liegt sehr wahrscheinlich ein Problem mit dem Zertifikat Ihres Webendpunkts vor. Stellen Sie unter Verwendung Ihres bevorzugten Webbrowsers eine Verbindung mit dem Webendpunkt her, und überprüfen Sie, ob ein Zertifikatfehler auftritt.
Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLSsecure channel.
Wenn er erfolgreich ist, sollte die Ausgabe dem folgenden Ausgabeblock ähneln:
.\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.
Probieren Sie andere Datentypen aus. Alle diese Skripts akzeptieren einen optionalen -ShardKeyType-Parameter, mit dem Sie den Schlüsseltyp angeben können. Der Standardwert ist „Int32“, Sie können aber auch „Int64“, „Guid“ oder „Binary“ angeben.
Erstellen von Anforderungen
Der Dienst kann entweder über die Web-Benutzeroberfläche verwendet werden, oder indem Sie das PowerShell-Modul „SplitMerge.psm1
“ importieren und verwenden, das Ihre Anforderungen über die Webrolle übermittelt.
Der Dienst kann Daten sowohl in Shardtabellen als auch in Verweistabellen verschieben. Eine Shardtabelle verfügt über eine Shardingschlüsselspalte und weist auf jedem Shard unterschiedliche Zeilendaten auf. Eine Verweistabelle ist keine Shardtabelle, sodass sie auf jedem Shard dieselben Zeilendaten enthält. Verweistabellen sind hilfreich für Daten, die sich nicht häufig ändern, und werden für JOIN-Vorgänge mit Shardtabellen in Abfragen verwendet.
Um einen Teilungs-/Zusammenführungsvorgang auszuführen, müssen Sie die zu verschiebenden Shardtabellen und Verweistabellen deklarieren. Sie verwenden dazu die SchemaInfo -API. Diese API befindet sich im Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema
-Namespace.
- Erstellen Sie für jede Shardtabelle ein ShardedTableInfo-Objekt, das den Namen des übergeordneten Schemas der Tabelle (optional, standardmäßig „dbo“), den Tabellennamen und den Spaltennamen in der Tabelle angibt, die den Shardschlüssel enthält.
- Erstellen Sie für jede Verweistabelle ein ReferenceTableInfo-Objekt, das den Namen des übergeordneten Schemas der Tabelle (optional, standardmäßig „dbo“) und den Tabellennamen angibt.
- Fügen Sie die zuvor beschriebenen TableInfo-Objekte einem neuen SchemaInfo -Objekt hinzu.
- Rufen Sie einen Verweis auf ein ShardMapManager-Objekt ab, und rufen Sie GetSchemaInfoCollection auf.
- Fügen Sie SchemaInfo unter Angabe des Namens der Shard Map dem SchemaInfoCollection-Element hinzu.
Ein Beispiel dazu finden Sie im Skript „SetupSampleSplitMergeEnvironment.ps1“.
Durch den Split-Merge-Dienst wird keine Zieldatenbank (bzw. kein Schema für Tabellen in der Datenbank) für Sie erstellt. Diese müssen erstellt werden, bevor eine Anforderung an den Dienst gesendet wird.
Bekannte Fehler
Beim Ausführen der PowerShell-Beispielskripts kann folgende Meldung angezeigt werden:
Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
Dieser Fehler weist darauf hin, dass das TLS/SSL-Zertifikat nicht ordnungsgemäß konfiguriert ist. Folgen Sie den Anweisungen im Abschnitt Herstellen einer Verbindung mit einem Webbrowser.
Wenn Sie keine Anforderungen übermitteln können, wird möglicherweise Folgendes angezeigt:
[Exception] System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'dbo.InsertRequest'.
Überprüfen Sie in diesem Fall Ihre Konfigurationsdatei, insbesondere die Einstellung für WorkerRoleSynchronizationStorageAccountConnectionString
. Dieser Fehler weist normalerweise darauf hin, dass die Workerrolle die Metadaten-Datenbank bei der ersten Verwendung nicht erfolgreich initialisieren konnte.
Zugehöriger Inhalt
Verwenden Sie noch keine elastischen Datenbanktools? Sehen Sie sich unseren Leitfaden zu den ersten Schritten an. Wenden Sie sich bei Fragen auf der Frageseite von Microsoft Q&A für SQL-Datenbank und für Featureanforderungen an uns, fügen Sie neue Ideen hinzu, oder stimmen Sie im SQL-Datenbank-Feedbackforumüber vorhandene Ideen ab.