Distribuire un servizio di divisione e unione per spostare i dati tra database partizionati

Si applica a: Database SQL di Azure

Lo strumento di divisione e unione sposta i dati tra database partizionati. Vedere Spostamento di dati tra database cloud con numero maggiore di istanze.

Nota

Lo strumento di suddivisione-unione è destinato alle app Web di Azure. Il fine vita dei servizi cloud (versione classica) è il 31 agosto 2024. Se si usa lo strumento di suddivisione-unione nei servizi cloud (versione classica), eseguire la migrazione alle app Web di Azure prima del 31 agosto 2024.

Prerequisiti

  1. Creare un database SQL che verrà usato come database per lo stato di suddivisione-unione. Vai al portale di Azure. Creare un nuovo database SQL. Assegnare un nome al database e creare un nuovo amministratore e una password. Assicurarsi di prendere nota del nome e della password per l'uso successivo.

  2. Assicurarsi che il server logico in Azure consenta la connessione ai servizi di Azure. Nel portale di Azure, in Impostazioni firewall per il server logico, assicurarsi che l'impostazione Consenti l'accesso a Servizi di Azure sia impostata su On. Seleziona l'icona Salva.

  3. Creare un account di archiviazione di Azure per l'output di diagnostica.

  4. Usare le immagini Docker di suddivisione-unione pubbliche o eseguire il push di immagini Docker di suddivisione-unione nel servizio Azure Container o nel registro Docker preferito.

Creare due app Web di Azure per il servizio

Creare due App Web: worker e UI.

App Web di Worker

  1. Creare un'app Web nel portale di Azure.

  2. Nel campo Pubblica selezionare Contenitore.

  3. Per Sistema operativo selezionare Windows.

  4. Passare alla scheda Docker.

  5. Aggiornare le informazioni seguenti:
    Origine immagine: Docker hub
    Tipo di accesso: Public
    Immagine e tag: mcr.microsoft.com/splitmerge/splitmergeworker:20240812.1

  6. Usare Rivedi e crea per creare l'app Web.

App Web dell'interfaccia utente

Per creare l'app Web dell'interfaccia utente, seguire la stessa procedura usata per creare l'app Web Worker con una differenza:

  • Un'immagine Docker diversa nel campo Immagine e tag: mcr.microsoft.com/splitmerge/splitmergeweb:20240812.1

Configurare le app Web di suddivisione-unione

Configurare la sicurezza

Per istruzioni dettagliate sulla configurazione della sicurezza del servizio, vedere l'articolo Configurazione di sicurezza per suddivisione-unione

Ai fini di una semplice distribuzione di prova per questa esercitazione, viene completata una serie minima di passaggi di configurazione per la messa in funzione del servizio. Questi passaggi abilitano unicamente il computer/l'account che li esegue alla comunicazione con il servizio.

Creare un certificato autofirmato e un file PFX

Usare PowerShell per creare un certificato autofirmato e un file PFX.

Per prima cosa, creare una nuova directory. Sostituire quindi i valori inline di conseguenza ed eseguire i comandi di PowerShell seguenti dalla nuova directory:

  $certname = "{certificateName}"    ## Replace {certificateName}
  $cert = New-SelfSignedCertificate -Subject "CN=$certname" -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

Caricare il file PFX nelle app Web e abilitare l'utilizzo dei certificati

Ripetere i passaggi seguenti per entrambe le app Web worker e UI.

  1. Vai al portale di Azure.
  2. Selezionare Servizi app.
  3. Selezionare l'app Web creata in precedenza per lo strumento di suddivisione-unione.
  4. Scegliere Certificati dal menu.
  5. Selezionare Bring Your Own Certificate (.pfx).
  6. Scegliere Aggiungi certificato dalla barra.
  7. Selezionare il file PFX e immettere la stessa password usata sopra.
  8. Una volta completata l'operazione, copiare l'identificazione personale del certificato dalla nuova voce nell'elenco.
  9. Nel menu App Web, aprire Impostazioni / Configurazione.
  10. Imposta Modalità certificato client su Require.

Configurazione app Web

Ripetere i passaggi seguenti per entrambe le app Web worker e UI.

  1. Aprire l'app Web distribuita e passare a Impostazioni>Variabili di ambiente>Impostazioni app. Selezionare Aggiungi.

  2. Aggiungere una variabile con il nome ElasticScaleMetadata e il valore con il stringa di connessione per il database di stato distribuito in precedenza.

    Importante

    A questo punto, il database dello stato deve usare le regole di confronto Latin (SQL\_Latin1\_General\_CP1\_CI\_AS). Per altre informazioni, vedere Nome di regole di confronto di Windows.

    Con il database SQL di Azure, la stringa di connessione presenta in genere un formato simile al seguente:

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

  3. Aggiungere altre variabili:

    Nome Valore
    WorkerRoleSynchronizationStorageAccountConnectionString Stringa di connessione validi per l'archiviazione di Azure creata in precedenza.
    DataEncryptionPrimaryCertificateThumbprint Identificazione personale del certificato generato in precedenza.
    MetadataExpirationPeriodInMinutes 20160
    MaxRetryCount 5
    WEBSITE_LOAD_CERTIFICATES *
  4. Selezionare Applica e riavviare l'applicazione.

  5. Ripetere gli stessi passaggi per entrambe le app Web worker e UI.

Risolvere i problemi relativi alla distribuzione

Se la messa in linea del proprio ruolo Web non riesce, è probabile che si tratti di un problema relativo alla configurazione della sicurezza. Verificare che il TLS/SSL sia configurato come descritto in precedenza.

Se la messa online del proprio ruolo di lavoro non riesce, ma riesce quella del ruolo Web, è probabile che si tratti di un problema con la connessione al database per lo stato creato in precedenza.

  • Assicurarsi che la stringa di connessione sia corretta.

  • Verificare che il server e il database siano presenti e che l'ID utente e la password siano corretti.

  • Per il database SQL di Azure, la stringa di connessione deve presentare il seguente formato:

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

  • Assicurarsi che il nome del server non inizi con https://.

  • Assicurarsi che il server consenta la connessione ai servizi di Azure. A tale scopo, aprire il database nel portale e verificare che l'impostazione Consenti l'accesso a Servizi di Azure sia impostata su On.

Testare la distribuzione del servizio

Connettersi con un Web browser

Passare a Panoramica dell'app Web UI e selezionare Sfoglia. Scegliere il certificato corretto, se richiesto.

Eseguire i test con gli script di PowerShell

È possibile testare la distribuzione e l'ambiente eseguendo gli script di PowerShell di esempio inclusi.

Importante

Gli script di esempio vengono eseguiti con PowerShell 5.1. Attualmente non vengono eseguiti con PowerShell 6 o versione successiva.

I file di script inclusi sono i seguenti:

  1. SetupSampleSplitMergeEnvironment.ps1 : imposta un livello dati di test per divisione/unione.

    1. Crea un database di gestione delle mappe shard.
    2. Crea due database partizioni.
    3. Crea una mappa di partizioni per tali database, elimina eventuali mappe di partizioni esistenti per i database.
    4. Crea una tabella di esempio di piccole dimensioni in entrambe le partizioni e popola la tabella in una delle partizioni.
    5. Dichiara l'elemento SchemaInfo per la tabella partizionata.
  2. ExecuteSampleSplitMerge.ps1: esegue operazioni di test sul livello dati di test.

    1. Invia una richiesta di divisione al front-end Web del servizio di divisione e unione, che sposta la metà dei dati dalla prima partizione alla seconda partizione.
    2. Esegue il polling del front-end Web per lo stato della richiesta di divisione e attende il completamento della richiesta.
    3. Invia una richiesta di unione al front-end Web del servizio di divisione e unione, che sposta la metà dei dati dalla seconda partizione alla prima partizione.
    4. Esegue il polling del front-end Web per lo stato della richiesta di unione e attende il completamento della richiesta.
  3. GetMappings.ps1: script di esempio di primo livello che visualizza lo stato corrente dei mapping di shard.

  4. ShardManagement.psm1: script helper che include l'API ShardManagement.

  5. SqlDatabaseHelpers.psm1: script helper per creare e gestire database in database SQL.

Usare PowerShell per la verifica della distribuzione

  1. Aprire una nuova finestra di PowerShell e passare alla directory in cui si è scaricato il pacchetto di divisione-unione, quindi passare alla directory "PowerShell".

  2. Creare un server (o sceglierne uno esistente) che conterrà il gestore delle mappe di partizionamento e le partizioni stesse.

    Nota

    Lo script SetupSampleSplitMergeEnvironment.ps1 crea tutti questi database sullo stesso server per impostazione predefinita, a scopo di semplificazione. Non si tratta di una restrizione del servizio di divisione e unione in sé stesso.

    Per spostare dati e aggiornare il mapping della partizione, sarà necessario un account di accesso di autenticazione SQL con accesso in lettura/scrittura ai database per il servizio di divisione e unione. Poiché il servizio di divisione e unione viene eseguito nel cloud, non supporta attualmente l'autenticazione integrata.

    Assicurarsi che il server sia configurato per consentire l'accesso dall'indirizzo IP del computer che esegue questi script. Questa impostazione si trova in SQL Server/Firewall e reti virtuali/Indirizzi IP client.

  3. Eseguire lo script SetupSampleSplitMergeEnvironment.ps1 per creare l'ambiente di esempio.

    L'esecuzione di questo script comporta la cancellazione di tutte le strutture di dati di gestione dei mapping della partizione nel relativo database, nonché di tutte le partizioni. Potrebbe essere utile eseguire nuovamente lo script se si vuole inizializzare nuovamente il mapping della partizione o le partizioni stesse.

    Riga di comando di esempio:

    .\SetupSampleSplitMergeEnvironment.ps1 ^
    -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  4. Eseguire lo script Getmappings.ps1 per visualizzare i mapping esistenti nell'ambiente di esempio.

    .\GetMappings.ps1 ^
    -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  5. Eseguire lo script ExecuteSampleSplitMerge.ps1 per realizzare un'operazione di divisione (spostamento della metà dei dati dalla prima partizione alla seconda) e successivamente un'operazione di unione (spostando nuovamente i dati nella prima partizione). Se si è configurato TLS (archiviazione thread-local) e si è lasciato l'endpoint http disabilitato, assicurarsi di usare l'endpoint https://.

    Riga di comando di esempio:

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

    Se si visualizza il seguente errore, è probabile che vi sia un problema con il certificato dell'endpoint Web. Provare a connettersi all'endpoint con un Web browser e controllare se è presente un errore di certificato.

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

    Se funziona, l'output dovrebbe essere simile al blocco di output seguente:

    .\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. Sperimentare il processo con altri tipi di dati. Questi script accettano un parametro facoltativo, ShardKeyType, che consente di specificare il tipo di chiave. Il tipo predefinito è Int32, ma è anche possibile specificare Int64, Guid o Binary.

Creare richieste

Il servizio può essere usato tramite l'interfaccia utente Web o l'importazione nonché mediante il modulo PowerShell SplitMerge.psm1 che invia le richieste tramite il ruolo web.

Il servizio può spostare i dati in tabelle partizionate e tabelle di riferimento. Una tabella partizionata ha una colonna chiave di partizionamento e ospita dati di riga diversi per ogni partizione. Una tabella di riferimento non è partizionata e può così contenere gli stessi dati di riga in ogni partizione. Le tabelle di riferimento sono utili per i dati che non vengono modificati di frequente e vengono usate per il JOIN con tabelle partizionate nelle query.

Per eseguire un'operazione di divisione e unione, è necessario dichiarare le tabelle partizionate e le tabelle di riferimento che si vogliono spostare. Questa operazione viene eseguita con l'API SchemaInfo . Questa API si trova nello spazio dei nomi Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema.

  1. Per ogni tabella partizionata, creare un oggetto ShardedTableInfo che descriva il nome dello schema padre della tabella (facoltativo, il valore predefinito è "dbo"), il nome della tabella e il nome della colonna della tabella che contiene la chiave di partizionamento orizzontale.
  2. Per ogni tabella di riferimento, creare un oggetto ReferenceTableInfo che descriva il nome dello schema padre della tabella (facoltativo, il valore predefinito è "dbo") e il nome della tabella.
  3. Aggiungere gli oggetti TableInfo precedenti a un nuovo oggetto SchemaInfo .
  4. Ottenere un riferimento all'oggetto ShardMapManager, quindi chiamare GetSchemaInfoCollection.
  5. Aggiungere SchemaInfo a SchemaInfoCollection, fornendo il nome della mappa partizioni.

È possibile consultare un esempio nello script SetupSampleSplitMergeEnvironment.ps1.

Il servizio di divisione e unione non crea automaticamente il database di destinazione (o lo schema per tutte le tabelle nel database). Questi devono essere creati precedentemente, prima di inviare una richiesta al servizio.

Errori noti

Quando si eseguono gli script di esempio di PowerShell, è possibile che venga visualizzato un messaggio simile a quello riportato di seguito:

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

Questo errore indica che il certificato TLS/SSL non è configurato correttamente. Seguire le istruzioni nella sezione Connessione a un Web browser.

Se non è possibile inviare richieste, potrebbe venire visualizzato il seguente messaggio:

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

In questo caso, controllare il file di configurazione, in particolare l'impostazione per WorkerRoleSynchronizationStorageAccountConnectionString. In genere, questo errore indica che il ruolo di lavoro non è riuscito a inizializzare in modo corretto il database dei metadati al primo utilizzo.

Se non si usano gli strumenti di database elastici, vedere la Guida introduttiva. In caso di domande, usare la pagina Microsoft Q&A per il database SQL, mentre è possibile inserire le richieste di nuove funzionalità, aggiungere nuove idee o votare quelle esistenti nel forum relativo al feedback sul database SQL.