Condividi tramite


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 divisione-unione è progettato per funzionare con Servizi cloud (versione classica) e non con Servizi app.

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> riflette il numero di versione. I file del servizio di divisione e unione si trovano nella sottodirectory content\splitmerge\service e gli script di PowerShell di divisione e unione, compresi i file DLL client necessari, si trovano nella sottodirectory content\splitmerge\powershell.

Prerequisiti

  1. Creare un database SQL di Azure che verrà usato come database per lo stato di divisione-unione. Vai 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 la connessione ai servizi di Azure. Nel portale accedere a Impostazioni firewall e assicurarsi che l'impostazione Consenti l'accesso a Servizi di Azure sia attiva. Seleziona l'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 di divisione e unione, creare una copia del file ServiceConfiguration.Template.cscfg fornito insieme a 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 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

  4. Immettere la stringa di connessione nel file .cscfg in entrambe le sezioni ruolo SplitMergeWeb e SplitMergeWorker dell'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, 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

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

Al prompt della password per proteggere la chiave privata, immettere una password complessa e confermarla. Quando richiesto, immettere di nuovo la password. Selezionare 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 selezionare Avanti.
  4. Digitare la password, lasciare selezionata l'opzione Includi tutte le proprietà estese e selezionare Avanti.
  5. Lasciare selezionata l'opzione Seleziona automaticamente l'archivio certificati […] e selezionare Avanti.
  6. Selezionare Fine e OK.

Caricare il file PFX nel servizio cloud

  1. Vai al portale di Azure.
  2. Selezionare Servizi cloud.
  3. Selezionare il servizio cloud creato precedentemente per il servizio di divisione e unione.
  4. Selezionare Certificati dal menu in alto.
  5. Selezionare Carica nella barra inferiore.
  6. Selezionare il file PFX e immettere la stessa password usata prima.
  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 precedentemente 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" />

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. Selezionare Panoramica.
  4. Scegliere l'ambiente di gestione temporanea, quindi selezionare Carica.
  5. Nella finestra di dialogo immettere un'etichetta per la distribuzione. Per Package e Configuration, selezionare From Local e scegliere il file SplitMergeService.cspkg e il file 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 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 nel file con estensione CSCFG 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

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://https:// poiché le impostazioni di protezione 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 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.

Risoluzione dei problemi

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.

Risorse aggiuntive

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.