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

Scaricare i pacchetti di divisione e unione

  1. Scaricare la versione più recente di NuGet dal sito Web NuGet.

  2. Aprire un prompt dei comandi e passare alla directory in cui si è scaricato il file nuget.exe. Il download comprende comandi di PowerShell.

  3. Scaricare il pacchetto di divisione e unione più recente nella directory corrente usando il seguente comando:

    nuget install Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge
    

I file vengono inseriti in una directory denominata Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge.x.x.xxx.x dove x.x.xxx.x rappresenta il numero di versione. I file del servizio di divisione e unione si trovano nella sottodirectory contenuto\splitmerge\servizio e gli script di PowerShell di divisione e unione, compresi i file DLL client necessari, si trovano nella sottodirectory contenuto\splitmerge\powershell.

Prerequisiti

  1. Creare un database SQL di Azure database che verrà usato come database di stato di suddivisione-unione. Accedere al portale di Azure. Creazione personalizzata di 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 consenta a Servizi di Azure di connettersi a esso. Nel portale accedere a Impostazioni firewall e assicurarsi che l'impostazione Consenti l'accesso a Servizi di Azure sia attiva. Fare clic sull'icona "Salva".

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

  4. Creare un servizio cloud di Azure per il servizio di divisione e unione.

Configurare il servizio di divisione e unione

Configurazione del servizio di divisione e unione

  1. Nella cartella in cui sono stati scaricati gli assembly necessari di divisione e unione creare una copia del file ServiceConfiguration.Template.cscfg inviato con SplitMergeService.cspkg e rinominarlo ServiceConfiguration.cscfg.

  2. Aprire ServiceConfiguration.cscfg in un editor di testo, ad esempio Visual Studio, che convalida input come il formato delle identificazioni personali del certificato.

  3. Creare un nuovo database o scegliere un database esistente da usare come database per lo stato delle operazioni di divisione e unione, quindi recuperare la stringa di connessione del database.

    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 Windows_collation_name (Transact-SQL).

    Con database SQL di Azure, la stringa di connessione ha in genere il formato seguente:

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

  4. Immettere questa stringa di connessione nel file con estensione cscfg nelle sezioni del ruolo SplitMergeWeb e SplitMergeWorker nell'impostazione ElasticScaleMetadata.

  5. Per il ruolo SplitMergeWorker, immettere una stringa di connessione valida nell'archiviazione di Azure per l'impostazione WorkerRoleSynchronizationStorageAccountConnectionString.

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, verrà 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

Creare una nuova directory e, da questa, eseguire il seguente comando usando una finestra del prompt dei comandi per gli sviluppatori per Visual Studio :

makecert ^
 -n "CN=*.cloudapp.net" ^
 -r -cy end -sky exchange -eku "1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2" ^
 -a sha256 -len 2048 ^
 -sr currentuser -ss root ^
 -sv MyCert.pvk MyCert.cer

Verrà richiesta una password per proteggere la chiave privata. Immettere una password complessa e confermarla. Dopo questo passaggio, verrà richiesto di usare la password una volta ancora. Fare clic su alla fine per importarla nell'archivio delle Autorità di certificazione radice disponibili nell'elenco locale.

Creare un file PFX

Eseguire il seguente comando dalla stessa finestra in cui è stato eseguito makecert. Servirsi della stessa password usata per la creazione del certificato:

pvk2pfx -pvk MyCert.pvk -spc MyCert.cer -pfx MyCert.pfx -pi <password>

Importare il certificato client nell'archivio personale

  1. In Esplora risorse fare doppio clic su MyCert.pfx.
  2. Nell'Importazione guidata certificati selezionare Utente corrente e fare clic su Avanti.
  3. Confermare il percorso del file e fare clic su Avanti.
  4. Digitare la password, lasciare selezionata l'opzione Includi tutte le proprietà estese e fare clic su Avanti.
  5. Lasciare selezionata l'opzione Seleziona automaticamente l'archivio certificati […] e fare clic su Avanti.
  6. Fare clic su Fine, quindi su OK.

Caricare il file PFX nel servizio cloud

  1. Accedere al portale di Azure.
  2. Selezionare Servizi cloud.
  3. Selezionare il servizio cloud creato precedentemente per il servizio di divisione e unione.
  4. Scegliere Certificati dal menu in alto.
  5. Fare clic su Carica nella barra inferiore.
  6. Selezionare il file PFX e immettere la stessa password usata sopra.
  7. Una volta completata l'operazione, copiare l'identificazione personale del certificato dalla nuova voce nell'elenco.

Aggiornare il file di configurazione del servizio

Incollare l'identificazione personale del certificato copiata sopra nell'attributo identificazione personale/valore delle seguenti impostazioni: Per il ruolo di lavoro:

 <Setting name="DataEncryptionPrimaryCertificateThumbprint" value="" />
 <Certificate name="DataEncryptionPrimary" thumbprint="" thumbprintAlgorithm="sha1" />

Per il ruolo Web:

 <Setting name="AdditionalTrustedRootCertificationAuthorities" value="" />
 <Setting name="AllowedClientCertificateThumbprints" value="" />
 <Setting name="DataEncryptionPrimaryCertificateThumbprint" value="" />
 <Certificate name="SSL" thumbprint="" thumbprintAlgorithm="sha1" />
 <Certificate name="CA" thumbprint="" thumbprintAlgorithm="sha1" />
 <Certificate name="DataEncryptionPrimary" thumbprint="" thumbprintAlgorithm="sha1" />

Si noti che per distribuzioni destinate alla produzione è necessario usare certificati separati per CA, crittografia, server e client. Per istruzioni dettagliate, vedere l'articolo relativo alla configurazione della sicurezza.

Distribuire il servizio

  1. Accedere al portale di Azure
  2. Selezionare il servizio cloud creato in precedenza.
  3. Fare clic su Panoramica.
  4. Scegliere l'ambiente di gestione temporanea, quindi fare clic su Carica.
  5. Nella finestra di dialogo immettere un'etichetta per la distribuzione. Per "Pacchetto" e "Configurazione" fare clic su "From Local" (Da locale), scegliere il file SplitMergeService.cspkg e il file con estensione CSCFG configurato in precedenza.
  6. Assicurarsi che la casella di controllo Distribuire anche se uno o più ruoli contengono una singola istanza sia selezionata.
  7. Fare clic sul pulsante con il segno di spunta in basso a destra per avviare la distribuzione. Per il completamento dell'operazione sarà necessario attendere alcuni minuti.

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 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 nel file con estensione CSCFG sia corretta.

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

  • Ad database SQL di Azure, la stringa di connessione deve essere nel formato seguente:

    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 a Servizi di Azure di connettersi a esso. A tale scopo, aprire il database nel portale e verificare che l'impostazione Consenti l'accesso a Servizi di Azure sia attiva.

Testare la distribuzione del servizio

Connettersi con un Web browser

Determinare l'endpoint Web del servizio di divisione e unione. È possibile trovarlo nel portale accedendo alla Panoramica del servizio cloud e guardando in URL sito a destra. Sostituire http:// con https:// poiché le impostazioni di sicurezza predefinite disabilitano l'endpoint HTTP. Caricare la pagina per questo URL nel browser.

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 in PowerShell 5.1. Non vengono attualmente eseguiti in PowerShell 6 o versioni successive.

I file di script inclusi sono i seguenti:

  1. SetupSampleSplitMergeEnvironment.ps1 : consente di impostare un livello di dati di test per divisione e unione (per una descrizione dettagliata, vedere la tabella sottostante).

  2. ExecuteSampleSplitMerge.ps1 : consente di eseguire le operazioni di test sul livello di dati di test (per una descrizione dettagliata, vedere la tabella sottostante).

  3. GetMappings.ps1: script di esempio di primo livello che visualizza lo stato corrente dei mapping di partizione.

  4. ShardManagement.psm1: script helper che esegue il wrapping dell'API ShardManagement

  5. SqlDatabaseHelpers.psm1: script helper per la creazione e la gestione di database in database SQL

    File PowerShell Passaggi
    SetupSampleSplitMergeEnvironment.ps1 1. Crea un database di gestione delle mappe partizioni.
    2. Crea 2 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.
    File PowerShell Passaggi
    ExecuteSampleSplitMerge.ps1 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.

Usare PowerShell per la verifica della distribuzione

  1. Aprire una nuova finestra di PowerShell e passare alla directory in cui è stato scaricato il pacchetto Split-Merge e quindi passare alla directory "powershell".

  2. Creare un server (o scegliere un server esistente) in cui verranno creati il gestore della mappa partizioni e le partizioni.

    Nota

    Lo scriptSetupSampleSplitMergeEnvironment.ps1 crea tutti questi database nello stesso server per impostazione predefinita per mantenere lo script semplice. 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. È possibile trovare questa impostazione in SQL server/firewall e reti virtuali/indirizzi IP client.

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

    L'esecuzione di questo script comporterà la cancellazione di tutte le strutture di dati di gestione dei mapping della partizione nel relativo database, nonché di tutte le partizioni. Potrebbe risultare 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 eseguire un'operazione di divisione (spostamento di metà dei dati nella prima partizione nella seconda partizione) e quindi un'operazione di unione (spostamento dei dati nella prima partizione). Se TLS è stato configurato e l'endpoint HTTP è stato disabilitato, assicurarsi di usare https:// endpoint.

    Riga di comando di esempio:

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

    Se viene visualizzato l'errore seguente, è molto probabile che si sia verificato 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 la connessione riesce, l'output dovrebbe risultare simile al 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. Ora è possibile 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 invierà 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 . Tale API si trova nello spazio dei nomi Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema .

  1. Per ogni tabella partizionata, creare un oggetto ShardedTableInfo che descrive il nome dello schema padre della tabella (facoltativo, il valore predefinito è "dbo"), il nome della tabella e il nome della colonna nella tabella che contiene la chiave di partizionamento orizzontale.
  2. Per ogni tabella di riferimento, creare un oggetto ReferenceTableInfo che descrive 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 richieste al servizio.

Risoluzione dei problemi

Quando si eseguono gli script di PowerShell di esempio, è possibile che venga visualizzato il messaggio seguente:

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 essere 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.

Risorse aggiuntive

Se non si usano gli strumenti di database elastici, vedere la Guida introduttiva. In caso di domande, è possibile visitare la pagina delle domande di Domande e risposte Microsoft per database SQL mentre è possibile inserire le richieste di nuove funzionalità nel forum relativo a commenti e suggerimenti sul database SQL.