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.
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:
O Azure PowerShell está instalado. Para obter mais detalhes, veja Introdução ao Azure PowerShell
O aplicativo Wingtip Tickets SaaS Multi-tenant Database é implantado. Para implantar em menos de cinco minutos, consulte Implantar e explorar o aplicativo Wingtip Tickets SaaS Multi-tenant Database
Obtenha os scripts e o código-fonte do Wingtip:
- Os scripts Wingtip Tickets SaaS Multi-tenant Database e o código-fonte do aplicativo estão disponíveis no repositório GitHub WingtipTicketsSaaS-MultitenantDB .
- Consulte as orientações gerais para conhecer as etapas para baixar e desbloquear os scripts Wingtip.
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.
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:
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.
Adicione um ponto de interrupção colocando o cursor em qualquer lugar na linha 38, a linha que diz: New-Tenant ', e pressione F9.
Execute o script pressionando F5.
Depois que a execução do script parar no ponto de interrupção, pressione F11 para entrar no código.
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.
Etapas do depurador
Agora, percorra o processo de script ao criar um locatário em seu próprio banco de dados:
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.
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.
Execute o script pressionando F5.
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.
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.
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:
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.
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
No Pesquisador de Objetos do SSMS, navegue até os modos de exibição no banco de dados tenantcatalog .
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.
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
- Biblioteca de clientes da base de dados elástica
- How to Debug Scripts in Windows PowerShell ISE (Como Depurar os Scripts do ISE do Windows PowerShell)
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.