Implantar um serviço de mesclagem dividida para mover dados entre bancos de dados compartilhados

Aplica-se a:Banco de Dados SQL do Azure

A ferramenta de divisão e mesclagem permite mover dados entre bancos de dados fragmentados. Veja Mover dados entre bancos de dados expandidos na nuvem.

Observação

A ferramenta de divisão e mesclagem destina-se a funcionar com Serviços de Nuvem (Clássico) e não com Serviços de Aplicativos.

Baixe os pacotes de Divisão-Mesclagem

  1. Baixe a versão mais recente do NuGet de NuGet.

  2. Abra um prompt de comando e navegue até o diretório onde baixou o nuget.exe. O download inclui comandos do PowerShell.

  3. Baixe o pacote de mesclagem divisão mais recente no diretório atual com o comando abaixo:

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

Os arquivos são colocados em um diretório chamado Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge.x.x.xxx.x onde x.x.xxx.x reflete o número de versão. Localize os arquivos do Serviço de divisão e mesclagem no subdiretório content\splitmerge\service e os scripts de divisão e mesclagem do PowerShell (e as dlls do cliente necessárias) no subdiretório content\splitmerge\powershell.

Pré-requisitos

  1. Crie um banco de dados do Banco de Dados SQL do Azure que será usado como o banco de dados de status de divisão e mesclagem. Acesse o portal do Azure. Crie um novo banco de dados SQL. Nomeie o banco de dados e crie um novo administrador e uma senha. Certifique-se de registrar o nome e a senha para uso posterior.

  2. Verifique se o servidor permite que os Serviços do Azure se conectem a ele. No portal, em Configurações de Firewall, verifique se a configuração Permitir acesso aos Serviços do Azure foi definida como Ativada. Clique no botão “Salvar”.

  3. Crie uma conta de Armazenamento do Azure para saída de diagnóstico.

  4. Crie um serviço de nuvem do Azure para seu serviço de divisão/mesclagem.

Configurar o serviço de divisão e mesclagem

Configuração do serviço de Divisão-Mesclagem

  1. Na pasta para a qual você baixou os assemblies de Divisão e Mesclagem, crie uma cópia do arquivo ServiceConfiguration.Template.cscfg fornecido junto com SplitMergeService.cspkg e renomeie-o como ServiceConfiguration.cscfg.

  2. Abra ServiceConfiguration.cscfg em um editor de texto como o Visual Studio que valide as entradas como o formato de impressões digitais de certificado.

  3. Crie um novo banco de dados ou escolha um já existente para servir como o banco de dados de status para as operações de Divisão/Mesclagem e recupere a cadeia de conexão do banco de dados.

    Importante

    Neste momento, o banco de dados de status deve usar a ordenação latina (SQL_Latin1_General_CP1_CI_AS). Para obter mais informações, confira Nome de ordenação do Windows (Transact-SQL).

    Com o Banco de Dados SQL do Azure, a cadeia de caracteres de conexão normalmente tem o seguinte formato:

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

  4. Insira essa cadeia de conexão no arquivo .cscfg nas seções de função SplitMergeWeb e SplitMergeWorker na configuração de ElasticScaleMetadata.

  5. Para a função SplitMergeWorker, digite uma cadeia de caracteres de conexão válida para o armazenamento do Azure para a configuração WorkerRoleSynchronizationStorageAccountConnectionString.

Configurar a segurança

Para obter instruções detalhadas configurar a segurança do serviço, consulte as Configuração de segurança da divisão e mesclagem.

Para fins de implantação de teste simples para este tutorial, um conjunto mínimo de etapas de configuração será executado para colocar o serviço em operação. Essas etapas permite que somente o computador/conta que as executa se comunique com o serviço.

Crie um certificado autoassinado

Crie um novo diretório e, nesse diretório, execute o seguinte comando usando uma janela de Prompt de comando do desenvolvedor para o 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

Você precisará fornecer uma senha para proteger a chave privada. Digite uma senha forte e confirme-a. Em seguida, será solicitado que você digite a senha mais uma vez. Clique em Sim no final para importá-la no armazenamento Raiz de autoridades de certificação confiável.

Criar um arquivo PFX

Execute o seguinte comando na mesma janela onde o makecert foi executado; use a mesma senha que você usou para criar o certificado:

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

Importe o certificado do cliente no repositório pessoal

  1. No Windows Explorer, clique duas vezes em Mycert.pfx.
  2. No Assistente de importação de certificado, selecione o Usuário Atual e clique em Avançar.
  3. Confirme o caminho do arquivo e clique em Avançar.
  4. Digite a senha, deixe Incluir todas as propriedades estendidas marcado e clique em Avançar.
  5. Deixe Selecionar automaticamente o repositório de certificados[...] marcado e clique em Avançar.
  6. Clique em Concluir e em OK.

Carregue o arquivo PFX para o serviço de nuvem

  1. Acesse o portal do Azure.
  2. Selecione Serviços de Nuvem.
  3. Selecione o serviço de nuvem criado anteriormente para o serviço de Divisão/Mesclagem.
  4. Clique em Certificados no menu superior.
  5. Clique em Carregar na barra de ferramentas inferior.
  6. Selecione o arquivo PFX e digite a mesma senha como acima.
  7. Depois de concluído, copie a impressão digital do certificado da nova entrada na lista.

Atualize o arquivo de configuração de serviço

Cole a impressão digital do certificado copiado acima no atributo de impressão digital/valor dessas configurações. Para a função de trabalho:

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

Para a função da 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" />

Observe que para implantações de produção devem ser usados certificados separados para a autoridade de certificação, para criptografia, o certificado do servidor e os certificados de cliente. Para obter instruções detalhadas sobre isso, consulte a Configuração de segurança.

Implantar o serviço

  1. Vá para o Portal do Azure
  2. Selecione o serviço de nuvem que você já criou.
  3. Clique em Visão Geral.
  4. Escolha o ambiente de preparo e clique em Carregar.
  5. Na caixa de diálogo, digite um rótulo de implantação. Para 'Pacote' e 'Configuração', clique em 'Do local' e escolha o arquivo SplitMergeService.cspkg e seu arquivo cscfg configurado anteriormente.
  6. Certifique-se de que a caixa de seleção rotulada Implantar mesmo se uma ou mais funções contiverem uma única instância esteja marcada.
  7. Clique no botão de escala no canto inferior direito para iniciar a implantação. Isso poderá levar alguns minutos para ser concluído.

Solucionar problemas de implantação

Se sua função web não ficar online, provavelmente é um problema com a configuração de segurança. Verifique se o TLS/SSL está configurado conforme descrito acima.

Se sua função de trabalho não fica online, mas sua função web tiver êxito, provavelmente é um problema na conexão com o banco de dados de status que você criou anteriormente.

  • Verifique se a cadeia de conexão no seu cscfg é precisa.

  • Verifique se o servidor e o banco de dados existem e se a ID de usuário e a senha estão corretas.

  • Para o Banco de Dados SQL do Azure, a cadeia de conexão deve estar no formato:

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

  • Verifique se o nome do servidor não começa com https://.

  • Verifique se o servidor permite que os Serviços do Azure se conectem a ele. Para fazer isso, abra o banco de dados no portal e verifique se a configuração Permitir acesso aos serviços do Azure está definida como Habilitada.

Testar a implantação do serviço

Conectar-se com um navegador da Web

Determine o ponto de extremidade da web do serviço de Divisão-Mesclagem. Encontre-o no portal acessando a Visão geral do serviço de nuvem e procurando em URL do Site no lado direito. Substitua http:// por https://, uma vez que as configurações de segurança padrão desabilitam o ponto de extremidade HTTP. Carregue a página para este URL no seu navegador.

Testes com scripts do PowerShell

A implantação e sue ambiente podem ser testados, executando os scripts de exemplo do PowerShell incluídos.

Importante

Os scripts de exemplo são executados no PowerShell 5.1. No momento, eles não são executados no PowerShell 6 ou posterior.

Os arquivos de script incluídos são:

  1. SetupSampleSplitMergeEnvironment.ps1 - configura uma camada de dados de teste para Divisão/Mesclagem (consulte a tabela abaixo para uma descrição detalhada)

  2. ExecuteSampleSplitMerge.ps1 - executa operações de teste no teste de camada de dados (consulte a tabela abaixo para uma descrição detalhada)

  3. GetMappings.ps1 — o script de exemplo de nível superior que imprime o estado atual dos mapeamentos de fragmento.

  4. ShardManagement.psm1 – o script auxiliar que encapsula a API ShardManagement

  5. SqlDatabaseHelpers.psm1 – o script auxiliar para criar e gerenciar bancos de dados no Banco de Dados SQL

    Arquivo do PowerShell Etapas
    SetupSampleSplitMergeEnvironment.ps1 1. Cria um banco de dados do gerenciador de mapa do fragmento
    2. Cria 2 bancos de dados do fragmento.
    3. Cria um mapa do fragmento para esses bancos de dados (exclui quaisquer mapas do fragmento existentes nesses bancos de dados).
    4. Cria uma pequena tabela de exemplo em ambos os fragmentos e preenche a tabela em um dos fragmentos.
    5. Declara o SchemaInfo para a tabela fragmentada.
    Arquivo do PowerShell Etapas
    ExecuteSampleSplitMerge.ps1 1. Envia uma solicitação divisão para o front-end da Web do Serviço de Divisão-Mesclagem, que divide metade dos dados do primeiro fragmento para o segundo.
    2. Elege o front-end da web para o status da solicitação de divisão e aguarda até que a solicitação seja concluída.
    3. Envia uma solicitação de mesclagem ao front-end da Web do Serviço de Divisão-Mesclagem, que move os dados do segundo fragmento para o primeiro.
    4. Elege o front-end da web para o status da solicitação de mesclagem e aguarda até que a solicitação seja concluída.

Usar o PowerShell para verificar sua implantação

  1. Abra uma nova janela do PowerShell, acesse o diretório no qual baixou o pacote de Divisão-Mesclagem e, em seguida, acesse o diretório "Powershell".

  2. Crie um servidor (ou escolha um servidor existente) em que o gerenciador do mapa do fragmento e os fragmentos serão criados.

    Observação

    O script SetupSampleSplitMergeEnvironment.ps1 cria todos esses bancos de dados no mesmo servidor por padrão para manter o script simples. Isso não é uma restrição do Serviço de Divisão-Mesclagem em si.

    Um logon de autenticação do SQL com acesso de leitura/gravação para os bancos de dados será necessário para que o serviço de Divisão-Mesclagem mova os dados e atualize o mapa do fragmento. Desde que o Serviço de Divisão-Mesclagem seja executado na nuvem, ele atualmente não dá suporte à Autenticação integrada.

    Verifique se o servidor está configurado para permitir acesso do endereço IP do computador que executa esses scripts. Você pode encontrar essa configuração em SQL Server/Firewalls e redes virtuais/endereços IP do cliente.

  3. Execute o script SetupSampleSplitMergeEnvironment.ps1 para criar o ambiente de exemplo.

    A execução desse script apagará quaisquer estruturas de dados de gerenciamento de mapa do fragmento existentes no banco de dados do gerenciador do mapa do fragmento e nos fragmentos. Ele pode ser útil para executar novamente o script, se quiser reinicializar o mapa do fragmento ou os fragmentos.

    Linha de comando de exemplo:

    .\SetupSampleSplitMergeEnvironment.ps1
     -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  4. Execute o script Getmappings.ps1 para exibir os mapeamentos que existem atualmente no ambiente de exemplo.

    .\GetMappings.ps1
     -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  5. Execute o script ExecuteSampleSplitMerge.ps1 para executar uma operação de divisão (mover metade dos dados no primeiro fragmento para o segundo) e, em seguida, uma operação de mesclagem (mover os dados de volta para o primeiro fragmento). Se você configurou o TLS e deixou o ponto de extremidade http desabilitado, verifique se, ao invés disso, usou o ponto de extremidade https://.

    Linha de comando de exemplo:

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

    Se você receber o erro abaixo, provavelmente é um problema com o certificado do ponto de extremidade da Web. Tente se conectar ao ponto de extremidade da Web com seu navegador da Web favorito e verifique se há um erro de certificado.

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

    Se for bem-sucedido, a saída deve se parecer com isso:

    > .\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. Experimente com outros tipos de dados. Todos esses scripts usam um parâmetro de - ShardKeyType opcional que permite que você especifique o tipo de chave. O padrão é Int32, mas você também pode especificar Int64, Guid ou binário.

Criar solicitações

O serviço pode ser usado por meio da IU da web ou importando e usando o módulo SplitMerge.psm1 do PowerShell que irá enviar suas solicitações por meio da função web.

O serviço pode mover dados em tabelas fragmentadas e tabelas de referência. Uma tabela fragmentada possui uma coluna de chave de fragmentação e tem diferentes dados de linha em cada fragmento. Uma tabela de referência não é fragmentada para que ele contenha os mesmos dados de linha em cada fragmento. As tabelas de referência são úteis para dados que não mudam com frequência e são usadas para associação com tabelas fragmentadas em consultas.

Para executar uma operação de Divisão-Mesclagem, você deve declarar as tabelas fragmentadas e as tabelas de referência que deseja mover. Isso é feito com a API SchemaInfo . Esta API está no namespace Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema .

  1. Para cada tabela fragmentada, crie um objeto ShardedTableInfo que descreve o nome do esquema da tabela pai (opcional, o padrão é "dbo"), o nome da tabela e o nome da coluna na tabela que contém a chave de fragmentação.
  2. Para cada tabela de referência, crie um objeto de ReferenceTableInfo que descreve o nome do esquema da tabela pai (opcional, o padrão é "dbo") e o nome da tabela.
  3. Adicione os objetos TableInfo acima para um novo objeto SchemaInfo .
  4. Obtenha uma referência para um objeto ShardMapManager e chame GetSchemaInfoCollection.
  5. Adicione o SchemaInfo ao SchemaInfoCollection, fornecendo o nome do mapa de fragmento.

Um exemplo disso pode ser visto no script SetupSampleSplitMergeEnvironment.ps1.

O serviço de Divisão-Mesclagem não cria para você o banco de dados de destino (ou o esquema para todas as tabelas no banco de dados). Eles devem ser previamente criados antes de enviar uma solicitação ao serviço.

Solução de problemas

Você poderá ver a mensagem abaixo ao executar os scripts de exemplo do PowerShell:

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

Esse erro significa que o certificado TLS/SSL não está corretamente configurado. Siga as instruções na seção 'Conectando-se com um navegador da Web'.

Se não for possível enviar solicitações, você verá isso:

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

Nesse caso, verifique seu arquivo de configuração, em particular a configuração para WorkerRoleSynchronizationStorageAccountConnectionString. Esse erro normalmente indica que a função de trabalho não pôde inicializar com êxito o banco de dados de metadados no primeiro uso.

Recursos adicionais

Ainda não está usando ferramentas de banco de dados elástico? Confira nosso Guia de Introdução. Em caso de dúvidas, entre em contato conosco na página de perguntas do Microsoft Q&A para Banco de Dados SQL e, para solicitações de recursos, adicione novas ideias ou vote em ideias existentes no Fórum de comentários sobre o Banco de Dados SQL.