Partilhar via


Provisionar e catalogar novos locatários em um aplicativo SaaS usando um Banco de Dados SQL do Azure multilocatário fragmentado

Aplica-se a:Banco de Dados SQL do Azure

Este artigo aborda o provisionamento e a catalogação de novos locatários, em um modelo ou padrão de banco de dados fragmentado multilocatário.

Este artigo tem duas partes principais:

  • Discussão conceptual do aprovisionamento e catalogação de novos inquilinos.

  • Tutorial que destaca o código de script do PowerShell que realiza o provisionamento e a catalogação.

    • O tutorial usa o aplicativo SaaS Wingtip Tickets, adaptado ao padrão de banco de dados fragmentado multilocatário.

Padrão de banco de dados

Esta seção, além de mais algumas que se seguem, discute os conceitos do padrão de banco de dados fragmentado multilocatário.

Neste modelo fragmentado multilocatário, os esquemas de tabela dentro de cada banco de dados incluem uma chave de locatário na chave primária de tabelas que armazenam dados de locatário. A chave de locatário permite que cada banco de dados individual armazene 0, 1 ou muitos locatários. O uso de bancos de dados fragmentados facilita o suporte do sistema de aplicativos a um número muito grande de locatários. Todos os dados de qualquer locatário são armazenados em um banco de dados. O grande número de locatários é distribuído pelos muitos bancos de dados fragmentados. Um banco de dados de catálogo armazena o mapeamento de cada locatário para seu banco de dados.

Isolamento versus menor custo

Um inquilino que tem um banco de dados só para si desfruta dos benefícios do isolamento. O locatário pode ter o banco de dados restaurado para uma data anterior sem ser restringido pelo impacto em outros locatários. O desempenho do banco de dados pode ser ajustado para otimizar para um locatário, novamente sem ter que comprometer com outros locatários. O problema é que o isolamento custa mais do que compartilhar um banco de dados com outros locatários.

Quando um novo locatário é provisionado, ele pode compartilhar um banco de dados com outros locatários ou pode ser colocado em seu próprio novo banco de dados. Mais tarde, você pode mudar de ideia e mover o banco de dados para a outra situação.

Bancos de dados com vários locatários e locatários únicos são misturados no mesmo aplicativo SaaS, para otimizar o custo ou o isolamento para cada locatário.

Sharded multi-tenant database app with tenant catalog

Padrão de catálogo do locatário

Quando você tem dois ou mais bancos de dados que contêm pelo menos um locatário, o aplicativo deve ter uma maneira de descobrir qual banco de dados armazena o locatário de interesse atual. Um banco de dados de catálogo armazena esse mapeamento.

Chave do inquilino

Para cada locatário, o aplicativo Wingtip pode derivar uma chave exclusiva, que é a chave do locatário. O aplicativo extrai o nome do locatário da URL da página da Web. A aplicação cria um hash do nome para obter a chave. O aplicativo usa a chave para acessar o catálogo. O catálogo faz referências cruzadas a informações sobre o banco de dados no qual o locatário está armazenado. O aplicativo usa as informações do banco de dados para se conectar. Outros esquemas de chaves de locatário também podem ser usados.

O uso de um catálogo permite que o nome ou o local de um banco de dados de locatário seja alterado após o provisionamento sem interromper o aplicativo. Em um modelo de banco de dados multilocatário, o catálogo acomoda mover um locatário entre bancos de dados.

Metadados do locatário além do local

O catálogo também pode indicar se um locatário está offline para manutenção ou outras ações. E o catálogo pode ser estendido para armazenar metadados adicionais de locatário ou banco de dados, como os seguintes itens:

  • A camada de serviço ou edição de um banco de dados.
  • A versão do esquema de banco de dados.
  • O nome do locatário e seu SLA (contrato de nível de serviço).
  • Informações para habilitar o gerenciamento de aplicativos, suporte ao cliente ou processos de devops.

O catálogo também pode ser usado para habilitar relatórios entre locatários, gerenciamento de esquema e extração de dados para fins de análise.

Biblioteca de Clientes da Base de Dados Elástica

No Wingtip, o catálogo é implementado no banco de dados tenantcatalog . O tenantcatalog é criado usando os recursos de Gerenciamento de Fragmentos da EDCL (Elastic Database Client Library). A biblioteca permite que um aplicativo crie, gerencie e use um mapa de estilhaços armazenado em um banco de dados. Um mapa de estilhaços faz referência cruzada à chave do locatário com seu fragmento, ou seja, seu banco de dados fragmentado.

Durante o provisionamento de locatário, as funções EDCL podem ser usadas a partir de aplicativos ou scripts do PowerShell para criar as entradas no mapa de estilhaços. Mais tarde, as funções EDCL podem ser usadas para se conectar ao banco de dados correto. O EDCL armazena em cache informações de conexão para minimizar o tráfego no banco de dados de catálogo e acelerar o processo de conexão.

Importante

Não edite os dados na base de dados do catálogo através de acesso direto! As atualizações diretas não são suportadas devido ao alto risco de corrupção de dados. Em vez disso, edite os dados de mapeamento usando apenas APIs EDCL.

Padrão de provisionamento de locatário

Lista de Verificação

Quando você deseja provisionar um novo locatário em um banco de dados compartilhado existente, do banco de dados compartilhado, você deve fazer as seguintes perguntas:

  • Tem espaço suficiente para o novo inquilino?
  • Ele tem tabelas com os dados de referência necessários para o novo locatário ou os dados podem ser adicionados?
  • Ele tem a variação apropriada do esquema base para o novo locatário?
  • Está na localização geográfica apropriada perto do novo inquilino?
  • Está no nível de serviço certo para o novo inquilino?

Quando desejar que o novo locatário seja isolado em seu próprio banco de dados, você poderá criá-lo para atender às especificações do locatário.

Após a conclusão do provisionamento, você deve registrar o locatário no catálogo. Finalmente, o mapeamento de locatário pode ser adicionado para fazer referência ao fragmento apropriado.

Base de dados de modelos

Provisione o banco de dados executando scripts SQL, implantando um bacpac ou copiando um banco de dados de modelo. Os aplicativos Wingtip copiam um banco de dados de modelo para criar novos bancos de dados de locatário.

Como qualquer aplicação, o Wingtip irá evoluir ao longo do tempo. Às vezes, o Wingtip exigirá alterações no banco de dados. As alterações podem incluir os seguintes itens:

  • Esquema novo ou alterado.
  • Dados de referência novos ou alterados.
  • Tarefas rotineiras de manutenção do banco de dados para garantir o desempenho ideal do aplicativo.

Com uma aplicação SaaS, estas alterações têm de ser implementadas de forma coordenada através de uma frota potencialmente massiva de bases de dados de inquilinos. Para que essas alterações estejam em futuros bancos de dados de locatários, elas precisam ser incorporadas ao processo de provisionamento. Esse desafio é explorado mais detalhadamente no tutorial de gerenciamento de esquema.

Scripts

Os scripts de provisionamento de locatário neste tutorial oferecem suporte aos dois cenários a seguir:

  • Provisionamento de um locatário em um banco de dados existente compartilhado com outros locatários.
  • Provisionamento de um locatário em seu próprio banco de dados.

Os dados do locatário são então inicializados e registrados no mapa de estilhaços do catálogo. No aplicativo de exemplo, os bancos de dados que contêm vários locatários recebem um nome genérico, como locatários1 ou locatários2. Os bancos de dados que contêm um único locatário recebem o nome do locatário. As convenções de nomenclatura específicas usadas no exemplo não são uma parte crítica do padrão, pois o uso de um catálogo permite que qualquer nome seja atribuído ao banco de dados.

Tutorial começa

Neste tutorial, irá aprender a:

  • Provisionar um locatário em um banco de dados multilocatário
  • Provisionar um locatário em um banco de dados de locatário único
  • Provisionar um lote de locatários em bancos de dados multilocatário e de locatário único
  • Registrar um banco de dados e mapeamento de locatário em um catálogo

Pré-requisitos

Para concluir este tutorial, devem ser cumpridos os seguintes pré-requisitos:

Provisionar um locatário em um banco de dados compartilhado com outros locatários

Nesta seção, você verá uma lista das principais ações de provisionamento tomadas pelos scripts do PowerShell. Em seguida, use o depurador ISE do PowerShell para percorrer os scripts para ver as ações no código.

Principais ações de provisionamento

A seguir estão os principais elementos do fluxo de trabalho de provisionamento percorrido:

  • Calcular a nova chave do inquilino: é utilizada uma função hash para criar a chave do inquilino a partir do nome do inquilino.

  • Verifique se a chave do locatário já existe: o catálogo é verificado para garantir que a chave ainda não tenha sido registrada.

  • Inicializar locatário no banco de dados de locatário padrão: o banco de dados de locatários é atualizado para adicionar as novas informações de locatário.

  • Registrar locatário no catálogo: o mapeamento entre a nova chave de locatário e o banco de dados de locatários existentes1 é adicionado ao catálogo.

  • Adicionar o nome do locatário a uma tabela de extensão de catálogo: o nome do local é adicionado à tabela Locatários no catálogo. Esta adição mostra como o banco de dados de catálogo pode ser estendido para oferecer suporte a dados adicionais específicos do aplicativo.

  • Abrir página de eventos para o novo inquilino: a página de eventos do Bushwillow Blues é aberta no navegador.

    Screenshot that shows the Events page for a new tenant.

Etapas do depurador

Para entender como o aplicativo Wingtip implementa o provisionamento de novos locatários em um banco de dados compartilhado, adicione um ponto de interrupção e percorra o fluxo de trabalho:

  1. No ISE do PowerShell, abra ...\Learning Modules\ProvisionTenants\Demo-ProvisionTenants.ps1 e defina os seguintes parâmetros:

    • = $TenantName Bushwillow Blues, o nome de um novo local.
    • = $VenueType blues, um dos tipos de locais pré-definidos: blues, música clássica, dança, jazz, judô, automobilismo, multiuso, ópera, rockmusic, futebol (minúsculas, sem espaços).
    • = $DemoScenario 1, para provisionar um locatário em um banco de dados compartilhado com outros locatários.
  2. Adicione um ponto de interrupção colocando o cursor em qualquer lugar na linha 38, a linha que diz: New-Tenant ', e pressione F9.

    Screenshot that highlights the line that includes New Tenant.

  3. Execute o script pressionando F5.

  4. Depois que a execução do script parar no ponto de interrupção, pressione F11 para entrar no código.

    Screenshot shows the Windows PowerShell ISE with the Debug menu open and Step Into selected.

  5. Rastreie a execução do script usando as opções do menu Depurar, F10 e F11, para passar por cima ou entrar em funções chamadas.

Para obter mais informações sobre como depurar scripts do PowerShell, consulte Dicas sobre como trabalhar com scripts do PowerShell e depurá-los.

Provisionar um locatário em seu próprio banco de dados

Principais ações de provisionamento

A seguir estão os principais elementos do fluxo de trabalho que você percorre ao rastrear o script:

  • Calcular a nova chave do inquilino: é utilizada uma função hash para criar a chave do inquilino a partir do nome do inquilino.

  • Verifique se a chave do locatário já existe: o catálogo é verificado para garantir que a chave ainda não tenha sido registrada.

  • Criar um novo banco de dados de locatário: O banco de dados é criado copiando o banco de dados basetenantdb usando um modelo do Gerenciador de Recursos. O novo nome do banco de dados é baseado no nome do locatário.

  • Adicionar banco de dados ao catálogo: o novo banco de dados de locatário é registrado como um fragmento no catálogo.

  • Inicializar locatário no banco de dados de locatário padrão: o banco de dados de locatários é atualizado para adicionar as novas informações de locatário.

  • Registrar locatário no catálogo: o mapeamento entre a nova chave de locatário e o banco de dados sequoiasoccer é adicionado ao catálogo.

  • O nome do locatário é adicionado ao catálogo: o nome do local é adicionado à tabela de extensão Locatários no catálogo.

  • Página Abrir Eventos para o novo inquilino: A página Eventos de Futebol da Sequoia é aberta no navegador.

    events

Etapas do depurador

Agora, percorra o processo de script ao criar um locatário em seu próprio banco de dados:

  1. Ainda em ...\Learning Modules\ProvisionTenants\Demo-ProvisionTenants.ps1 defina os seguintes parâmetros:

    • = $TenantName Sequoia Soccer, o nome de um novo local.
    • = $VenueType futebol, um dos tipos de locais pré-definidos: blues, música clássica, dança, jazz, judô, automobilismo, multiuso, ópera, rockmusic, futebol (minúsculas, sem espaços).
    • = $DemoScenario 2, para provisionar um locatário em seu próprio banco de dados.
  2. Adicione um novo ponto de interrupção colocando o cursor em qualquer lugar na linha 57, a linha que diz: & $PSScriptRoot\New-TenantAndDatabase ', e pressione F9.

    break point

  3. Execute o script pressionando F5.

  4. Depois que a execução do script parar no ponto de interrupção, pressione F11 para entrar no código. Use F10 e F11 para passar e entrar em funções para rastrear a execução.

Provisionar um lote de locatários

Este exercício prevê um lote de 17 inquilinos. É recomendável provisionar esse lote de locatários antes de iniciar outros tutoriais do Wingtip Tickets para que haja mais bancos de dados para trabalhar.

  1. No ISE do PowerShell, abra ...\Learning Modules\ProvisionTenants\Demo-ProvisionTenants.ps1 e altere o parâmetro $DemoScenario para 4:

    • = $DemoScenario 4, para provisionar um lote de locatários em um banco de dados compartilhado.
  2. Prima F5 e execute o script.

Verificar o conjunto de locatários implantado

Nesta etapa, você tem uma combinação de locatários implantados em um banco de dados compartilhado e locatários implantados em seus próprios bancos de dados. O portal do Azure pode ser usado para inspecionar os bancos de dados criados. No portal do Azure, abra o servidor tenants1-mt-USER>< navegando até a lista de servidores SQL. A lista de bancos de dados SQL deve incluir o banco de dados de locatários compartilhados1 e os bancos de dados para os locatários que estão em seu próprio banco de dados:

Screenshot of the tenants1-mt-USER server Overview page that highlights the databases.

Embora o portal do Azure mostre os bancos de dados de locatário, ele não permite que você veja os locatários dentro do banco de dados compartilhado. A lista completa de locatários pode ser vista na página do Hub de Eventos da Wingtip e navegando no catálogo.

Usando a página do hub de eventos do Wingtip Tickets

Abra a página do Hub de Eventos no navegador (http:events.wingtip-mt.<USUÁRIO.trafficmanager.net>)

Usando o banco de dados de catálogo

A lista completa de locatários e o banco de dados correspondente para cada um está disponível no catálogo. É fornecida uma vista SQL que associa o nome do inquilino ao nome da base de dados. A exibição demonstra bem o valor de estender os metadados armazenados no catálogo.

  • A exibição SQL está disponível no banco de dados tenantcatalog.
  • O nome do locatário é armazenado na tabela Locatários.
  • O nome do banco de dados é armazenado nas tabelas de Gerenciamento de Fragmentos.
  1. No SQL Server Management Studio (SSMS), conecte-se ao servidor de locatários em catalog-mt.<USER.database.windows.net>, com Login = desenvolvedor e Senha = P@ssword1

    SSMS connection dialog

  2. No Pesquisador de Objetos do SSMS, navegue até os modos de exibição no banco de dados tenantcatalog .

  3. Clique com o botão direito do mouse na visualização TenantsExtended e escolha Select Top 1000 Rows. Observe o mapeamento entre o nome do locatário e o banco de dados para os diferentes locatários.

    ExtendedTenants view in SSMS

Outros padrões de aprovisionamento

Esta seção discute outros padrões de provisionamento interessantes.

Pré-provisionamento de bancos de dados em pools elásticos

O padrão de pré-provisionamento explora o fato de que, ao usar pools elásticos, o faturamento é para o pool e não para os bancos de dados. Assim, os bancos de dados podem ser adicionados a um pool elástico antes de serem necessários sem incorrer em custo extra. Essa previsão reduz significativamente o tempo necessário para provisionar um locatário em um banco de dados. O número de bancos de dados pré-provisionados pode ser ajustado conforme necessário para manter um buffer adequado para a taxa de provisionamento prevista.

Aprovisionamento automático

No padrão de provisionamento automático, um serviço de provisionamento dedicado é usado para provisionar servidores, pools e bancos de dados automaticamente, conforme necessário. Essa automação inclui o pré-provisionamento de bancos de dados em pools elásticos. E se os bancos de dados forem descomissionados e excluídos, as lacunas criadas nos pools elásticos poderão ser preenchidas pelo serviço de provisionamento, conforme desejado.

Este tipo de serviço automatizado pode ser simples ou complexo. Por exemplo, a automação poderia lidar com o provisionamento em várias regiões geográficas e configurar a replicação geográfica para recuperação de desastres. Com o padrão de provisionamento automático, um aplicativo cliente ou script enviaria uma solicitação de provisionamento para uma fila a ser processada por um serviço de provisionamento. O script seria então sondado para detetar a conclusão. Se o pré-provisionamento for usado, as solicitações serão tratadas rapidamente, enquanto um serviço em segundo plano gerenciará o provisionamento de um banco de dados de substituição.

Recursos adicionais

Próximos passos

Neste tutorial, ficou a saber como:

  • Provisionar um único novo locatário em um banco de dados multilocatário compartilhado e seu próprio banco de dados
  • Aprovisionar um lote de inquilinos adicionais
  • Percorra os detalhes do provisionamento de locatários e registre-os no catálogo

Experimente o tutorial Monitoramento de desempenho.