Partilhar via


Multilocação e Azure Cosmos DB

Nesta página, descrevemos alguns dos recursos do Azure Cosmos DB que são úteis quando você trabalha com sistemas multilocatário. Também vinculamos orientações e exemplos de como usar o Azure Cosmos DB em uma solução multilocatário.

Recursos do Azure Cosmos DB que oferecem suporte à multilocação

Criação de partições

Usando partições com seus contêineres do Azure Cosmos DB, você pode criar contêineres que são compartilhados entre vários locatários. Normalmente, você usa o identificador de locatário como uma chave de partição, mas também pode considerar o uso de várias chaves de partição para um único locatário. Uma estratégia de particionamento bem planejada implementa efetivamente o padrão Sharding. Com contêineres grandes, o Azure Cosmos DB distribui seus locatários por vários nós físicos para alcançar um alto grau de escala.

Recomendamos que você explore o uso de chaves de partição hierárquicas para melhorar o desempenho de sua solução multilocatário. As chaves de partição hierárquicas permitem criar uma chave de partição que inclui vários valores. Por exemplo, você pode usar uma chave de partição hierárquica que inclua o identificador de locatário e o tipo de dados que você está armazenando. Essa abordagem permite que você escale além do limite de partição lógica de 20 GB por valor de chave de partição.

Mais informações:

Gerenciando unidades de solicitação

O modelo de preços do Azure Cosmos DB é baseado no número de unidades de solicitação por segundo que você provisiona ou consome. Uma unidade de solicitação é uma abstração lógica do custo de uma operação ou consulta de banco de dados. Normalmente, você provisiona um número definido de unidades de solicitação por segundo para sua carga de trabalho, que é chamada de taxa de transferência. O Azure Cosmos DB fornece várias opções para como provisionar a taxa de transferência. Em um ambiente multilocatário, a seleção feita afeta o desempenho e o preço dos recursos do Azure Cosmos DB.

Um modelo de locação para o Azure Cosmos DB envolve a implantação de contêineres separados para cada locatário em um banco de dados compartilhado. O Azure Cosmos DB permite provisionar unidades de solicitação para um banco de dados e todos os contêineres compartilham as unidades de solicitação. Se as cargas de trabalho do locatário normalmente não se sobrepõem, essa abordagem pode ajudar a reduzir os custos operacionais. No entanto, essa abordagem é suscetível ao problema do vizinho barulhento porque o contêiner de um único locatário pode consumir uma quantidade desproporcional das unidades de solicitação provisionadas compartilhadas. Para mitigar esse problema, primeiro identifique os locatários barulhentos. Em seguida, você pode, opcionalmente, definir a taxa de transferência provisionada em um contêiner específico. Os outros contêineres no banco de dados continuam a compartilhar sua taxa de transferência, mas o locatário barulhento consome sua própria taxa de transferência dedicada.

O Azure Cosmos DB também fornece uma camada sem servidor, que é adequada para cargas de trabalho com tráfego intermitente ou imprevisível. Como alternativa, o dimensionamento automático permite configurar políticas para especificar o dimensionamento da taxa de transferência provisionada. Além disso, você pode aproveitar a capacidade de intermitência do Azure Cosmos DB, maximizando a utilização de sua capacidade de taxa de transferência provisionada, que teria sido limitada de outra forma. Em uma solução multilocatário, você pode combinar todas essas abordagens para oferecer suporte a diferentes tipos de locatário.

Nota

Ao planejar sua configuração do Azure Cosmos DB, certifique-se de considerar as cotas e limites de serviço.

Para monitorar e gerenciar os custos associados a cada locatário, cada operação usando a API do Azure Cosmos DB inclui as unidades de solicitação consumidas. Você pode usar essas informações para agregar e comparar as unidades de solicitação reais consumidas por cada locatário e, em seguida, identificar locatários com características de desempenho diferentes.

Mais informações:

Chaves geridas pelo cliente

Alguns locatários podem exigir o uso de suas próprias chaves de criptografia. O Azure Cosmos DB fornece um recurso de chave gerenciado pelo cliente. Esse recurso é aplicado no nível de uma conta do Azure Cosmos DB, portanto, os locatários que precisam de suas próprias chaves de criptografia precisam ser implantados usando contas dedicadas do Azure Cosmos DB.

Mais informações:

Modelos de isolamento

Ao trabalhar com um sistema multilocatário que usa o Azure Cosmos DB, você precisa tomar uma decisão sobre o nível de isolamento que deseja usar. Business-to-business (B2B) refere-se à venda a uma empresa. Business-to-consumer (B2C) refere-se à venda direta a um cliente individual que utiliza o produto ou serviço. O Azure Cosmos DB suporta vários modelos de isolamento:

Necessidade de carga de trabalho Chave de partição por inquilino Contêiner por locatário (taxa de transferência compartilhada) Contêiner por locatário (taxa de transferência dedicada) Base de dados por inquilino Conta de banco de dados por locatário
Consultas entre inquilinos Fácil (o contêiner funciona como limite para consultas) Fixa Fixa Fixa Fixa
Densidade de inquilinos Alto (menor custo por inquilino) Médio Baixo Baixo Baixo
Exclusão de dados do locatário Fixa Fácil (deixar cair o recipiente quando o inquilino sair) Fácil (deixar cair o recipiente quando o inquilino sair) Fácil (soltar banco de dados quando o inquilino sai) Fácil (soltar banco de dados quando o inquilino sai)
Isolamento de segurança de acesso a dados Precisa ser implementado dentro do aplicativo Contentor RBAC Contentor RBAC Banco de dados RBAC RBAC
Georreplicação A replicação geográfica por locatário não é possível Agrupar locatários em contas de banco de dados com base nos requisitos Agrupar locatários em contas de banco de dados com base nos requisitos Agrupar locatários em contas de banco de dados com base nos requisitos Agrupar locatários em contas de banco de dados com base nos requisitos
Prevenção de vizinhos barulhentos Nenhuma Nenhuma Sim Sim Sim
Latência de criação de novos locatários Imediata Rápido Rápido Médio Lento
Vantagens da modelagem de dados Nenhuma Colocation de entidades Colocation de entidades Vários contêineres para modelar entidades locatárias Vários contêineres e bancos de dados para modelar locatários
Chave de encriptação O mesmo para todos os inquilinos O mesmo para todos os inquilinos O mesmo para todos os inquilinos O mesmo para todos os inquilinos Chave gerenciada pelo cliente por locatário
Requisitos de taxa de transferência >0 RUs por locatário >100 RUs por locatário >100 RUs por locatário (apenas com dimensionamento automático, caso contrário >, 400 RUs por locatário) >400 RUs por locatário >400 RUs por locatário
Exemplo(s) de caso(s) de uso Aplicações B2C Oferta padrão para aplicações B2B Oferta premium para aplicações B2B Oferta premium para aplicações B2B Oferta premium para aplicações B2B

Chave de partição por inquilino

Ao usar um único contêiner para vários locatários, você pode usar o suporte ao particionamento do Azure Cosmos DB. Usando chaves de partição separadas para cada locatário, você pode facilmente consultar os dados de um único locatário. Você também pode consultar vários locatários, mesmo que eles estejam em partições separadas. No entanto, as consultas entre partições têm um custo de unidade de solicitação (RU) mais alto do que as consultas de partição única.

Essa abordagem tende a funcionar bem quando a quantidade de dados armazenados para cada locatário é pequena. Pode ser uma boa escolha para construir um modelo de preços que inclua um nível gratuito e para soluções business-to-consumer (B2C). Em geral, ao usar contêineres compartilhados, você obtém a maior densidade de locatários e, portanto, o menor preço por locatário.

É importante considerar a taxa de transferência do seu contêiner. Todos os locatários compartilharão a taxa de transferência do contêiner, portanto, o problema do vizinho barulhento pode causar desafios de desempenho se seus locatários tiverem cargas de trabalho altas ou sobrepostas. Às vezes, esse problema pode ser atenuado agrupando subconjuntos de locatários em contêineres diferentes e garantindo que cada grupo de locatários tenha padrões de uso compatíveis. Como alternativa, você pode considerar um modelo híbrido multi e de locatário único. Agrupe locatários menores em contêineres particionados compartilhados e ofereça contêineres dedicados aos grandes clientes. Além disso, há recursos que podem ajudar a controlar o problema do vizinho barulhento ao modelar locatário por partição, como realocação de taxa de transferência, capacidade de intermitência e controle de taxa de transferência no Java SDK.

Também é importante considerar a quantidade de dados que você armazena em cada partição lógica. O Azure Cosmos DB permite que cada partição lógica cresça até 20 GB. Se você tiver um único locatário que precise armazenar mais de 20 GB de dados, considere distribuir os dados por várias partições lógicas. Por exemplo, em vez de ter uma única chave de partição de , você pode salgar as chaves de partição criando várias chaves de Contosopartição para um locatário, como Contoso1, Contoso2e assim por diante. Ao consultar os dados de um locatário, você pode usar a WHERE IN cláusula para corresponder a todas as chaves de partição. As chaves de partição hierárquicas também podem ser usadas para suportar locatários grandes, com armazenamento superior a 20 GB, sem ter que usar chaves de partição sintéticas ou vários valores de chave de partição por locatário.

Considere os aspetos operacionais da sua solução e as diferentes fases do ciclo de vida do locatário. Por exemplo, quando um locatário muda para um nível de preço dedicado, você provavelmente precisará mover os dados para um contêiner diferente. Quando um locatário é desprovisionado, você precisa executar uma consulta de exclusão no contêiner para remover os dados e, para locatários grandes, essa consulta pode consumir uma quantidade significativa de taxa de transferência enquanto é executada.

Contentor por inquilino

Você pode provisionar contêineres dedicados para cada locatário. Os contêineres dedicados funcionam bem quando os dados que você armazena para seu locatário podem ser combinados em um único contêiner. Esse modelo fornece maior isolamento de desempenho do que o modelo de chave de partição por locatário acima e também fornece maior isolamento de segurança de acesso a dados por meio do Azure RBAC.

Ao usar um contêiner para cada locatário, você pode considerar compartilhar a taxa de transferência com outros locatários provisionando a taxa de transferência no nível do banco de dados. Considere as restrições e limites em torno do número mínimo de unidades de solicitação para seu banco de dados e o número máximo de contêineres no banco de dados. Além disso, considere se seus inquilinos exigem um nível garantido de desempenho e se eles são suscetíveis ao problema do vizinho barulhento. Quando você compartilha a taxa de transferência no nível do banco de dados, a carga de trabalho ou o armazenamento em todos os contêineres deve ser relativamente uniforme. Caso contrário, você pode ter um problema de vizinho barulhento, se houver um ou mais grandes inquilinos. Se necessário, planeje agrupar esses locatários em diferentes bancos de dados baseados em padrões de carga de trabalho.

Como alternativa, você pode provisionar taxa de transferência dedicada para cada contêiner. Esta abordagem funciona bem para inquilinos maiores e para inquilinos que estão em risco do problema do vizinho barulhento. No entanto, a taxa de transferência da linha de base para cada locatário é maior, portanto, considere os requisitos mínimos e as implicações de custo desse modelo.

Se o seu modelo de dados de locatário exigir mais de uma entidade, desde que todas as entidades possam compartilhar a mesma chave de partição, elas poderão ser colocalizadas no mesmo contêiner. No entanto, se o modelo de dados do locatário for mais complexo e exigir entidades que não podem compartilhar a mesma chave de partição, considere os modelos de banco de dados por locatário ou conta de banco de dados por locatário abaixo. Consulte o nosso artigo sobre como modelar e particionar dados no Azure Cosmos DB utilizando um exemplo do mundo real para obter mais orientações.

O gerenciamento do ciclo de vida geralmente é mais simples quando os contêineres são dedicados aos locatários. Você pode facilmente mover locatários entre modelos de taxa de transferência compartilhados e dedicados e, ao desprovisionar um locatário, pode excluir rapidamente o contêiner.

Base de dados por inquilino

Você pode provisionar bancos de dados para cada locatário, na mesma conta de banco de dados. Como o modelo de contêiner por locatário acima, esse modelo fornece maior isolamento de desempenho do que o modelo de chave de partição por locatário e também fornece maior isolamento de segurança de acesso a dados por meio do Azure RBAC.

Como o modelo de conta por locatário abaixo, essa abordagem oferece o mais alto nível de isolamento de desempenho, mas fornece a menor densidade de locatários. No entanto, essa opção é melhor quando cada locatário requer um modelo de dados mais complicado do que é viável no modelo de contêiner por locatário. Ou, você deve seguir essa abordagem quando for um requisito para a criação de novos locatários ser rápido e/ou livre de qualquer sobrecarga para criar contas de locatário antecipadamente. Também pode ser o caso, para a estrutura de desenvolvimento de software específica que está sendo usada, que o banco de dados por locatário seja o único nível de isolamento de desempenho reconhecido nessa estrutura. O isolamento em nível de entidade (contêiner) e a colocalização de entidade normalmente não são suportados nativamente nessas estruturas.

Conta de banco de dados por locatário

O Azure Cosmos DB permite provisionar contas de banco de dados separadas para cada locatário, o que fornece o nível mais alto de isolamento, mas a menor densidade. Como os modelos de contêiner por locatário e banco de dados por locatário acima, esse modelo fornece maior isolamento de desempenho do que o modelo de chave de partição por locatário. Ele também fornece maior isolamento de segurança de acesso a dados por meio do Azure RBAC. Além disso, esse modelo fornece isolamento de segurança de criptografia de banco de dados no nível do locatário por meio de chaves gerenciadas pelo cliente.

Uma única conta de banco de dados é dedicada a um locatário, o que significa que eles não estão sujeitos ao problema do vizinho barulhento. Você pode configurar o local da conta de banco de dados de acordo com os requisitos do locatário. Você também pode ajustar a configuração dos recursos do Azure Cosmos DB, como replicação geográfica e chaves de criptografia gerenciadas pelo cliente, para atender aos requisitos de cada locatário. Ao usar uma conta dedicada do Azure Cosmos DB por locatário, considere o número máximo de contas do Azure Cosmos DB por assinatura do Azure.

Se você usar esse modelo, deverá considerar a rapidez com que seu aplicativo precisa para gerar novos locatários. A criação de contas no Azure Cosmos DB pode levar alguns minutos, portanto, talvez seja necessário criar contas antecipadamente. Se essa abordagem não for viável, considere o modelo de banco de dados por locatário.

Se você permitir que os locatários migrem de uma conta compartilhada para uma conta dedicada do Azure Cosmos DB, considere a abordagem de migração que você usará para mover os dados de um locatário entre as contas antiga e nova.

Abordagens híbridas

Você pode considerar uma combinação das abordagens acima para atender aos requisitos de diferentes locatários e ao seu modelo de preços. Por exemplo:

  • Provisione todos os clientes de avaliação gratuita em um contêiner compartilhado e use o ID do locatário ou uma chave de partição de chave sintética.
  • Ofereça uma camada Bronze paga que implante um contêiner dedicado por locatário, mas com taxa de transferência compartilhada em um banco de dados.
  • Ofereça um nível Silver mais alto que provisione uma taxa de transferência dedicada para o contêiner do locatário.
  • Ofereça a camada Gold mais alta e forneça uma conta de banco de dados dedicada para o locatário, o que também permite que os locatários selecionem a geografia para sua implantação.

Contribuidores

Este artigo é mantido pela Microsoft. Foi originalmente escrito pelos seguintes contribuidores.

Principais autores:

  • Paul Burpo - Brasil | Engenheiro de Clientes Principal, FastTrack for Azure
  • John Downs - Brasil | Engenheiro de Software Principal

Outros contribuidores:

  • Mark Brown - Brasil | Gerente de PM Principal, Azure Cosmos DB
  • Deborah Chen - Brasil | Gerente de Programa Principal
  • Theo van Kraay - Brasil | Gerente de Programa Sênior, Azure Cosmos DB
  • Arsen Vladimirskiy - Brasil | Engenheiro de Clientes Principal, FastTrack for Azure
  • Thomas Weiss - Brasil | Gerente de Programa Principal
  • Vic Perdana - Brasil | Arquiteto de Soluções na Nuvem, Azure ISV

Para ver perfis não públicos do LinkedIn, inicie sessão no LinkedIn.

Próximos passos

Analise as abordagens de armazenamento e dados para multilocação.

Saiba mais sobre multilocação e o Azure Cosmos DB:

  • Azure Cosmos DB e sistemas multilocatário: uma postagem de blog que discute como criar um sistema multilocatário que usa o Azure Cosmos DB.
  • Aplicativos multilocatários com o Azure Cosmos DB (vídeo)
  • Criando um SaaS multilocatário com o Azure Cosmos DB e o Azure (vídeo): Um estudo de caso do mundo real de como a Whally, uma startup SaaS multilocatário, criou uma plataforma moderna do zero no Azure Cosmos DB e no Azure. Whally mostra as decisões de design e implementação que eles tomaram relacionadas ao particionamento, modelagem de dados, multilocação segura, desempenho, streaming em tempo real do feed de alterações para o SignalR e muito mais. Todas essas soluções usam o ASP.NET Core nos Serviços de Aplicativo do Azure.

Consulte alguns de nossos outros cenários de arquitetura do Cosmos DB: