Migrar bancos de dados existentes para escalar horizontalmente

Aplica-se a:Banco de Dados SQL do Azure

Gerencie facilmente seus bancos de dados existentes que são fragmentados e escalonados horizontalmente com ferramentas como a biblioteca de cliente do Banco de Dados Elástico. Primeiro converta um conjunto existente de bancos de dados para usar o gerenciador de mapa de fragmentos.

Visão geral

Para migrar um banco de dados fragmentado existente:

  1. Prepare o banco de dados do gerenciador de mapa de fragmentos.
  2. Criar o mapa de fragmentos.
  3. Preparar os fragmentos individuais.
  4. Adicione os mapeamentos ao mapa de fragmentos.

Essas técnicas podem ser implementadas com a biblioteca de cliente do .NET Framework ou com os scripts do PowerShell encontrados em Banco de Dados SQL do Azure – Scripts de ferramentas de Banco de Dados Elástico. Os exemplos aqui usam os scripts do PowerShell.

Para saber mais sobre o ShardMapManager, confira Gerenciamento de mapa de fragmentos. Para obter uma visão geral das ferramentas de Banco de Dados Elástico, consulte Visão geral dos recursos de Banco de Dados Elástico.

Preparar o banco de dados do gerenciador de mapa de fragmentos

O gerenciador de mapa de fragmentos é um banco de dados especial que contém os dados para gerenciar bancos de dados escalonados horizontalmente. Você pode usar um banco de dados existente ou criar um novo banco de dados. Um banco de dados que age como o gerenciador de mapa de fragmentos não deve ser o mesmo banco de dados que o do fragmento. O script do PowerShell não cria o banco de dados para você.

Etapa 1: criar um gerenciador de mapa de fragmentos

# Create a shard map manager
New-ShardMapManager -UserName '<user_name>' -Password '<password>' -SqlServerName '<server_name>' -SqlDatabaseName '<smm_db_name>'
#<server_name> and <smm_db_name> are the server name and database name
# for the new or existing database that should be used for storing
# tenant-database mapping information.

Para recuperar o gerenciador de mapa de fragmentos

Após a criação, você pode recuperar o gerenciador de mapa de fragmentos com este cmdlet. Esta etapa será necessária toda vez que você precisar usar o objeto ShardMapManager.

# Try to get a reference to the Shard Map Manager  
$ShardMapManager = Get-ShardMapManager -UserName '<user_name>' -Password '<password>' -SqlServerName '<server_name>' -SqlDatabaseName '<smm_db_name>'

Etapa 2: criar o mapa de fragmentos

Selecione o tipo de mapa de fragmentos a ser criado. A escolha depende da arquitetura do banco de dados:

  1. Um locatário único por banco de dados (para termos, consulte o glossário.)
  2. Vários locatários por banco de dados (dois tipos):
    1. Mapeamento de lista
    2. Mapeamento de intervalo

Para um modelo de locatário único, crie um mapa de fragmentos de mapeamento de lista . O modelo de locatário único atribui um banco de dados por locatário. Esse é um modelo eficaz para desenvolvedores de SaaS, pois simplifica o gerenciamento.

List mapping

O modelo multilocatário atribui vários locatários a um banco de dados individual (e você pode distribuir grupos de locatários entre vários bancos de dados). Use esse modelo quando você esperar que cada locatário tenha necessidades de dados pequenas. Nesse modelo, atribua um intervalo de locatários para um banco de dados usando o mapeamento intervalo.

Range mapping

Ou então, você pode implementar um modelo de banco de dados multilocatário usando um mapeamento de lista para atribuir vários locatários a um banco de dados individual. Por exemplo, DB1 é usado para armazenar informações sobre a ID do locatário 1 e 5, e o DB2 armazena dados do locatário 7 e do locatário 10.

Multiple tenants on single DB

Com base na sua escolha, escolha uma destas opções:

Opção 1: criar um mapa de fragmentos para um mapeamento de lista

Crie um mapa de fragmentos usando o objeto ShardMapManager.

# $ShardMapManager is the shard map manager object
$ShardMap = New-ListShardMap -KeyType $([int]) -ListShardMapName 'ListShardMap' -ShardMapManager $ShardMapManager

Opção 2: criar um mapa de fragmentos para um mapeamento de intervalo

Para utilizar esse padrão de mapeamento, os valores de ID do locatário precisam ser intervalos contínuos. É possível ter lacunas nos intervalos, pulando o intervalo ao criar os bancos de dados.

# $ShardMapManager is the shard map manager object
# 'RangeShardMap' is the unique identifier for the range shard map.  
$ShardMap = New-RangeShardMap -KeyType $([int]) -RangeShardMapName 'RangeShardMap' -ShardMapManager $ShardMapManager

Opção 3: Mapeamentos de lista em um banco de dados individual

A configuração desse padrão também exige a criação de um mapa de lista conforme mostrado na etapa 2, opção 1.

Etapa 3: Preparar os fragmentos individuais

Adicione cada fragmento (banco de dados)ao gerenciador de mapa de fragmentos. Isso prepara os bancos de dados individuais para armazenar informações de mapeamento. Execute esse método em cada fragmento.

Add-Shard -ShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'
# The $ShardMap is the shard map created in step 2.

Etapa 4: Adicionar mapeamentos

A adição de mapeamentos depende do tipo de mapa de fragmentos criado. Se tiver criado um mapa de lista, você adicionará mapeamentos de lista. Se tiver criado um mapa de intervalo, você adicionará mapeamentos de intervalo.

Opção 1: mapear os dados para um mapeamento de lista

Mapeie os dados adicionando um mapeamento de lista para cada locatário.

# Create the mappings and associate it with the new shards
Add-ListMapping -KeyType $([int]) -ListPoint '<tenant_id>' -ListShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'

Opção 2: mapear os dados para um mapeamento de intervalo

Adicione os mapeamentos de intervalo de todas as associações entre intervalo de ID do locatário e banco de dados:

# Create the mappings and associate it with the new shards
Add-RangeMapping -KeyType $([int]) -RangeHigh '5' -RangeLow '1' -RangeShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'

Etapa 4, opção 3: mapear os dados de vários locatários em um banco de dados individual

Para cada locatário, execute o Add-ListMapping (opção 1).

Verificando os mapeamentos

Informações sobre os fragmentos existentes e os mapeamentos associados a eles podem ser consultadas usando os seguintes comandos:

# List the shards and mappings
Get-Shards -ShardMap $ShardMap
Get-Mappings -ShardMap $ShardMap

Resumo

Após ter concluído a configuração, você pode começar a usar a biblioteca de cliente do Banco de Dados Elástico. Você também pode usar o roteamento dependente de dados e a consulta de vários fragmentos.

Próximas etapas

Obtenha os scripts do PowerShell de Azure Elastic Database tools scripts (Scripts das ferramentas de Banco de Dados Elástico do BD SQL do Azure).

A biblioteca de clientes das ferramentas de banco de dados elástico está disponível GitHub: Azure/elastic-db-tools.

Use a ferramenta de divisão e mesclagem para mover dados de/para um modelo multilocatário de/para um modelo de locatário único. Consulte Ferramenta de divisão e mesclagem.

Recursos adicionais

Para obter informações sobre os padrões comuns da arquitetura de dados dos aplicativos do banco de dados SaaS (software como serviço) multilocatário, consulte Padrões de Design para Aplicativos SaaS multilocatário com o Banco de Dados SQL do Azure.

Perguntas e solicitações de recursos

Em caso de dúvidas, use a página de perguntas e respostas da Microsoft sobre o Banco de Dados SQL, e para solicitações de recurso, adicione-as ao Fórum de comentários do Banco de Dados SQL.