Multilocação e Azure Cosmos DB
Este artigo descreve os recursos do Azure Cosmos DB que você pode usar para sistemas multilocatário. Ele fornece orientação e exemplos sobre como usar o Azure Cosmos DB em uma solução multilocatário.
Requisitos de multilocação
Ao planejar uma solução multilocatário, você tem dois requisitos principais:
- Ajude a garantir um forte isolamento entre inquilinos e cumpra requisitos de segurança rigorosos para aqueles que deles necessitam.
- Mantenha um baixo custo por inquilino. Como provedor, certifique-se de que o custo para executar o aplicativo permaneça sustentável à medida que ele é dimensionado.
Essas duas necessidades muitas vezes podem entrar em conflito e introduzir um trade-off onde você deve priorizar uma sobre a outra. As orientações neste artigo podem ajudá-lo a entender melhor as compensações que você deve fazer para atender a essas necessidades. Este artigo ajuda você a navegar por essas considerações para que possa tomar decisões informadas ao projetar sua solução multilocatário.
Modelos de isolamento
Determine o nível de isolamento necessário entre seus locatários. O Azure Cosmos DB dá suporte a uma variedade de modelos de isolamento, mas para a maioria das soluções, recomendamos que você use uma das seguintes estratégias:
- Uma chave de partição por locatário é frequentemente usada para soluções totalmente multilocatário, como soluções de software como serviço (B2C SaaS) de empresa para consumidor.
- Uma conta de banco de dados por locatário é frequentemente usada para soluções SaaS entre empresas (B2B).
Para escolher o modelo de isolamento mais adequado, considere o seu modelo de negócio e os requisitos dos inquilinos. Por exemplo, um forte isolamento de desempenho pode não ser uma prioridade para alguns modelos B2C em que uma empresa vende um produto ou serviço diretamente a um cliente individual. No entanto, os modelos B2B podem priorizar um forte isolamento de segurança e desempenho e podem exigir que os locatários tenham sua própria conta de banco de dados provisionada.
Você também pode combinar vários modelos para atender às diferentes necessidades dos clientes. Por exemplo, suponha que você crie uma solução SaaS B2B que vende para clientes corporativos e forneça uma avaliação gratuita para novos clientes em potencial. Você pode implantar uma conta de banco de dados separada para locatários corporativos pagos que precisam de fortes garantias de segurança e isolamento. E você pode compartilhar uma conta de banco de dados e usar chaves de partição para isolar clientes de avaliação.
Modelos de isolamento recomendados
O modelo de chave de partição por locatário e o modelo de conta de banco de dados por locatário são os modelos de isolamento mais comuns para soluções multilocatário. Esses modelos oferecem o melhor equilíbrio entre isolamento do locatário e eficiência de custos.
Modelo de chave de partição por locatário
Se os inquilinos forem isolados por chave de partição, a largura de banda será partilhada entre inquilinos e gerida dentro do mesmo contentor.
Nota
Uma unidade de solicitação (RU) é uma abstração lógica do custo de uma operação ou consulta de banco de dados. Normalmente, provisiona-se um número definido de unidades de solicitação por segundo (RU/s) para a carga de trabalho, o que é conhecido como throughput.
Benefícios
Eficiência de custos: você coloca todos os locatários em um contêiner, que é particionado pelo ID do locatário. Essa abordagem tem apenas um recurso faturável que provisiona e compartilha RUs entre vários locatários. Este modelo é geralmente mais rentável e mais fácil de gerir do que ter contas separadas para cada inquilino.
Gerenciamento simplificado: você tem menos contas do Azure Cosmos DB para gerenciar.
Compensações
Contenção de recursos: a largura de banda compartilhada (RU/s) entre locatários que estão no mesmo contêiner pode levar à contenção durante os períodos de pico. Essa contenção pode criar problemas de vizinhos barulhentos e desafios de desempenho se seus locatários tiverem cargas de trabalho altas ou sobrepostas. Use esse modelo de isolamento para cargas de trabalho que precisam de RUs garantidas em um único locatário e podem compartilhar a taxa de transferência.
Isolamento limitado: esta abordagem fornece isolamento lógico, não físico. Ele pode não atender aos requisitos estritos de isolamento do ponto de vista do desempenho ou da segurança.
Menos flexibilidade: não é possível personalizar recursos no nível da conta, como replicação geográfica, restauração point-in-time e chaves gerenciadas pelo cliente, para cada locatário se você isolar por chave de partição ou por banco de dados ou contêiner.
Funcionalidades do Azure Cosmos DB para multitenant
Controle sua taxa de transferência: explore recursos que podem ajudar a controlar o problema do vizinho barulhento quando você usa uma chave de partição para isolar locatários. Use recursos como realocação da taxa de transferência, capacidade de rajada, e controlo de taxa de transferência no Java SDK.
Chaves de partição hierárquica: use o Azure Cosmos DB para que cada partição lógica possa aumentar em tamanho de 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
Contoso
, pode distribuir as chaves de partição criando várias chaves de partição para um inquilino, comoContoso1
eContoso2
.Ao consultar dados para um locatário, você pode usar a
WHERE IN
cláusula para corresponder a todas as chaves de partição. Você também pode usar chaves de partição hierárquicas para fornecer aos grandes locatários um armazenamento superior a 20 GB se tiver uma alta cardinalidade de locatários. Não é necessário usar chaves de partição sintéticas ou vários valores de chave de partição por locatário para esse método.Suponha que você tenha uma carga de trabalho que isola os locatários por chave de partição. Um inquilino, Contoso, é maior e tem um volume de escrita maior que os outros, e continua a crescer. Para evitar o risco de não conseguir inserir mais dados para este locatário, pode utilizar chaves de partição hierárquicas. Especifique
TenantID
como a chave de primeiro nível e, em seguida, adicione um segundo nível comoUserId
. Se antecipar a combinaçãoTenantID
eUserID
para produzir partições lógicas que excedam o limite de 20 GB, poderá particionar ainda mais para outro nível, comoSessionID
. Consultas que especificam ouTenantID
ou ambasTenantID
eUserID
são efetivamente encaminhadas apenas para o subconjunto de partições físicas que contêm os dados relevantes, o que evita uma consulta totalmente distribuída. Se o contêiner tiver 1.000 partições físicas, mas um valor específicoTenantId
estiver apenas em cinco partições físicas, a consulta será roteada para o menor número de partições físicas relevantes.Se o seu primeiro nível não tiver cardinalidade suficientemente alta e você atingir o limite de partição lógica de 20 GB na sua chave de partição, considere usar uma chave de partição sintética em vez de uma chave de partição hierárquica.
Modelo de conta de banco de dados por locatário
Se isolar os seus inquilinos por conta de banco de dados, cada inquilino terá a sua própria largura de banda provisionada ao nível do banco de dados ou do contêiner.
Benefícios
Alto isolamento: esta abordagem evita a contenção ou interferência devido a contas dedicadas do Azure Cosmos DB e a contêineres que têm RUs provisionadas por locatário exclusivo.
Contratos de nível de serviço (SLAs) personalizados: cada inquilino tem a sua própria conta, de forma a poder fornecer recursos específicos personalizados, SLAs voltados para o cliente e garantias, pois pode configurar a conta de base de dados de cada inquilino de forma independente para o débito de dados.
Segurança aprimorada: o isolamento de dados físicos ajuda a garantir uma segurança robusta porque os clientes podem habilitar chaves gerenciadas pelo cliente em um nível de conta por locatário. Os dados de cada locatário são isolados por conta, em vez de estarem no mesmo contêiner.
Flexibilidade: os locatários podem habilitar recursos no nível da conta, como replicação geográfica, restauração point-in-time e chaves gerenciadas pelo cliente, conforme necessário.
Compensações
Gerenciamento aprimorado: essa abordagem é mais complexa porque você gerencia várias contas do Azure Cosmos DB.
Custos mais elevados: mais contas significam que deve-se provisionar a largura de banda em cada recurso, como bases de dados ou contentores, dentro da conta para cada inquilino. Sempre que um recurso provisiona RUs, os custos do Azure Cosmos DB aumentam.
Limitações de consulta: Todos os locatários estão em contas diferentes, portanto, os aplicativos que consultam vários locatários exigem várias chamadas dentro da lógica do aplicativo.
Recursos do Azure Cosmos DB para multilocação
Recursos de segurança: esse modelo fornece maior isolamento de segurança de acesso a dados por meio do Azure RBAC. Esse modelo também fornece isolamento de segurança de criptografia de banco de dados no nível do locatário por meio de chaves gerenciadas pelo cliente.
Configuração personalizada: Você pode configurar o local da conta do 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.
Quando se utiliza 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.
Lista completa de modelos de isolamento
Necessidade de carga de trabalho | Chave de partição por inquilino (recomendado) | 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 (recomendado) |
---|---|---|---|---|---|
Consultas entre inquilinos | Fácil (o contêiner funciona como limite para consultas) | Difícil | Difícil | Difícil | Difícil |
Densidade de inquilinos | Alto (menor custo por inquilino) | Médio | Baixo | Baixo | Baixo |
Exclusão de dados do locatário | Fácil | 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 | Necessidade de implementação dentro do aplicativo | Contêiner RBAC | Container 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 | Não | Não | 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 | Alojamento conjunto da entidade | Colocação conjunta de entidade | 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 de caso 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 |
Modelo de contêiner por locatário
Você pode provisionar contêineres dedicados para cada locatário. Os contêineres dedicados funcionam bem quando você pode combinar os dados que armazena para seu locatário em um único contêiner. Este 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.
Ao usar um contentor para cada locatário, considere compartilhar a largura de banda de transferência com outros locatários, provisionando-a ao nível do banco de dados. Considere as restrições e limites para o número mínimo de RUs para seu banco de dados e o número máximo de contêineres no banco de dados. Considere também 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 você tiver um ou mais inquilinos grandes. 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. Mas 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 modelo de dados do locatário exigir mais de uma entidade e se todas as entidades puderem compartilhar a mesma chave de partição, você poderá realocá-las no mesmo contêiner. Mas 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. Para obter mais informações, consulte Dados de modelo e partição no Azure Cosmos DB.
O gerenciamento do ciclo de vida geralmente é mais simples quando você dedica contêineres a locatários. Você pode mover locatários entre modelos de taxa de transferência compartilhados e dedicados facilmente. E quando você desprovisiona um locatário, pode excluir rapidamente o contêiner.
Modelo de banco de dados por locatário
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, 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.
Semelhante ao modelo de conta por locatário, essa abordagem fornece o mais alto nível de isolamento de desempenho, mas fornece a menor densidade de locatário. Use essa opção se cada locatário exigir um modelo de dados mais complicado do que é viável no modelo de contêiner por locatário. Ou siga esta abordagem se a criação de novos locatários tiver que ser rápida ou livre de quaisquer despesas iniciais. Para algumas estruturas de desenvolvimento de software, o modelo de banco de dados por locatário pode ser o único nível de isolamento de desempenho suportado pela estrutura. Essas estruturas normalmente não suportam isolamento ao nível da entidade (contentor) e colocação de entidade.
Recursos do Azure Cosmos DB que oferecem suporte à multilocação
Particionamento
Use partições com seus contêineres do Azure Cosmos DB para criar contêineres que vários locatários compartilham. 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. Quando se tem contentores grandes, o Azure Cosmos DB distribui os seus inquilinos por vários nós físicos para atingir um elevado grau de escalabilidade.
Considere chaves de partição hierárquicas para melhorar o desempenho da sua solução multilocatário. Use chaves de partição hierárquicas para criar uma chave de partição que inclua vários valores. Por exemplo, você pode usar uma chave de partição hierárquica que inclua o identificador de locatário, como um GUID de alta cardinalidade, para permitir uma escala quase ilimitada. Ou você pode especificar uma chave de partição hierárquica que inclua uma propriedade que as consultas usam com freqüência. Essa abordagem ajuda a evitar que ocorram consultas entre partições. Use chaves de partição hierárquicas para escalar além do limite de partição lógica de 20 GB por valor de chave de partição e limitar consultas de distribuição caras.
Para obter mais informações, consulte os seguintes recursos:
Gerenciar RUs
O modelo de preços do Azure Cosmos DB é baseado no número de RU/s que você provisiona ou consome. O Azure Cosmos DB fornece várias opções para provisionar a taxa de transferência. Em um ambiente multilocatário, sua seleção afeta o desempenho e o preço dos recursos do Azure Cosmos DB.
Para locatários que exigem desempenho garantido e isolamento de segurança, recomendamos que você isole os locatários por conta de banco de dados e aloque RUs para o locatário. Para locatários com requisitos menos rigorosos, recomendamos que você isole os locatários por chave de partição. Utilize este modelo para partilhar RUs entre os seus inquilinos e optimizar o custo por inquilino.
Um modelo de locação alternativo para o Azure Cosmos DB envolve a implantação de contêineres separados para cada locatário em um banco de dados compartilhado. Use o Azure Cosmos DB para provisionar RUs para um banco de dados para que todos os contêineres compartilhem as RUs. Se as cargas de trabalho do locatário normalmente não se sobrepõem, essa abordagem pode ajudar a reduzir os custos operacionais. Mas esta abordagem é suscetível ao problema do vizinho barulhento porque o contentor de um único inquilino pode consumir uma quantidade desproporcional das RUs 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 contentores na base de dados continuam a partilhar o seu throughput, mas o inquilino barulhento consome o seu próprio throughput dedicado.
O Azure Cosmos DB também fornece uma camada sem servidor, que se adapta a cargas de trabalho com tráfego intermitente ou imprevisível. Como alternativa, você pode usar o dimensionamento automático para configurar políticas que especificam o dimensionamento da taxa de transferência provisionada. Você também pode aproveitar a capacidade de pico do Azure Cosmos DB para maximizar o uso da sua capacidade de taxa de transferência provisionada, que, caso contrário, seria limitada por limites de taxa. Em uma solução multilocatário, você pode combinar todas essas abordagens para oferecer suporte a diferentes tipos de locatários.
Nota
Ao planejar sua configuração do Azure Cosmos DB, considere as cotas e limites de serviço.
Para monitorar e gerenciar os custos associados a cada locatário, lembre-se de que cada operação que usa a API do Azure Cosmos DB inclui as RUs consumidas. Você pode usar essas informações para agregar e comparar as RUs reais que cada locatário consome. Em seguida, você pode identificar locatários que têm características de desempenho diferentes.
Para obter mais informações, consulte os seguintes recursos:
- Taxa de transferência provisionada
- Dimensionamento Automático
- Sem servidor
- Medir o consumo de RU de uma requisição
- Quotas de serviço do Azure Cosmos DB
- Capacidade de pico
Chaves geridas pelo próprio 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. Você aplica esse recurso no nível de uma conta do Azure Cosmos DB. Portanto, se os locatários precisarem de suas próprias chaves de criptografia, você deverá usar contas dedicadas do Azure Cosmos DB para implantar os locatários.
Para obter mais informações, consulte Configurar chaves gerenciadas pelo cliente para sua conta do Azure Cosmos DB com o Azure Key Vault.
Contribuidores
Este artigo é mantido pela Microsoft. Foi originalmente escrito pelos seguintes contribuidores.
Principais autores:
- Tara Bhatia | Gerente de Programas, Azure Cosmos DB
- Paul Burpo | Engenheiro de Clientes Principal, FastTrack for Azure
- John Downs | Engenheiro de Software Principal
Outros contribuidores:
- Mark Brown | Gestor Principal de PM, Azure Cosmos DB
- Deborah Chen | Gerente de Programa Principal
- Theo van Kraay | Senior Program Manager, Azure Cosmos DB
- Arsen Vladimirskiy | Engenheiro de Clientes Principal, FastTrack for Azure
- Thomas Weiss | Gerente de Programa Principal
- Vic Perdana | 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
Saiba mais sobre multilocação e o Azure Cosmos DB:
- Projete e crie aplicativos SaaS multilocatários em escala com o Azure Cosmos DB: uma sessão no Build 2024 que orienta você sobre como projetar para multilocação no Azure Cosmos DB e aprender as práticas recomendadas de um fornecedor de software independente do mundo real.
- Azure Cosmos DB e sistemas multilocatários: um artigo de blogue que discute como criar um sistema multilocatário que utiliza o Azure Cosmos DB.
- Vídeo: Aplicativos multilocatários com o Azure Cosmos DB
- Vídeo: Criar um SaaS multilocatário com o Azure Cosmos DB e o Azure: um estudo de caso do mundo real sobre como a Whally, uma startup SaaS multilocatário, cria uma plataforma moderna do zero no Azure Cosmos DB e no Azure. Whally mostra as decisões de design e implementação que eles tomam relacionadas ao particionamento, modelagem de dados, multilocação segura, desempenho e transmissão em tempo real do feed de alterações para o SignalR. Todas essas soluções usam o ASP.NET Core no Serviço de Aplicativo do Azure.
Recursos relacionados
Consulte alguns de nossos outros cenários de arquitetura do Azure Cosmos DB: