Revisão do Azure Well-Architected Framework – Azure Cosmos DB para NoSQL
Este artigo descreve as práticas recomendadas para o Azure Cosmos DB para NoSQL. Essas práticas recomendadas garantem que você possa implantar soluções no Azure Cosmos DB que sejam eficientes, confiáveis, seguras, otimizadas para custos e operacionalmente excelentes. Esta orientação centra-se nos cinco pilares da excelência da arquitetura no Well-Architected Framework:
Este guia de revisão pressupõe que você tenha um conhecimento prático do Azure Cosmos DB e conheça bem seus recursos. Para obter mais informações, consulte Azure Cosmos DB para NoSQL.
Pré-requisitos
Compreender os pilares do Well-Architected Framework pode ajudar a produzir uma arquitetura de nuvem de alta qualidade, estável e eficiente. Recomendamos que você comece revisando sua carga de trabalho usando a avaliação do Azure Well-Architected Framework Review.
Para obter mais contexto, revise várias arquiteturas de referência que refletem as considerações deste guia em seu design. Essas arquiteturas incluem, mas não estão limitadas a:
- Aplicativos de missão crítica distribuídos globalmente usando o Azure Cosmos DB
- Aplicativos sem servidor usando o Azure Cosmos DB
- Aplicativo Web de várias regiões com replicação do Azure Cosmos DB
Fiabilidade
Como em qualquer serviço de nuvem, falhas podem ocorrer tanto no lado do serviço quanto no lado da carga de trabalho. É impossível evitar todas as falhas potenciais, mas é um objetivo melhor minimizar os efeitos que um único componente com falha pode ter em toda a sua carga de trabalho. Esta seção inclui considerações e recomendações para minimizar as consequências de uma falha pontual.
Lista de verificação de estruturação
- Considere como o nível de consistência e o modo de replicação selecionados afetam o RPO (Recovery Point Objetive, objetivo de ponto de recuperação) em uma interrupção em toda a região.
- Projete sua implantação de conta de banco de dados para que ela abranja pelo menos duas regiões no Azure. Além disso, distribua sua conta em várias zonas de disponibilidade quando oferecida em sua região do Azure.
- Avalie as estratégias de gravação de várias regiões e regiões únicas para sua carga de trabalho. Para gravação de região única, projete sua carga de trabalho para ter pelo menos uma segunda região de leitura para failover. Habilite o failover automático para cenários de gravação de região única e leitura de várias regiões. Para gravação em várias regiões, compare as compensações em complexidade e consistência com as vantagens de escrever em várias regiões. Analise as expectativas durante uma interrupção regional para contas de gravação de uma região e de várias regiões.
- Habilite o failover gerenciado por serviço para sua conta.
- Projete um teste completo de alta disponibilidade para seu aplicativo.
- Percorra os processos comuns de backup, incluindo, mas não limitado a: restauração point-in-time, recuperação de operações destrutivas acidentais, restauração de recursos excluídos e restauração para outra região em um point-in-time. Configure a conta com backup contínuo, escolhendo o período de retenção apropriado com base nos requisitos do seu negócio.
- Explore o guia de criação de aplicativos resilientes, revise a política de repetição padrão para os SDKs e planeje o tratamento personalizado para erros transitórios específicos. Esses guias fornecerão práticas recomendadas para tornar o código do aplicativo resiliente a erros transitórios.
Recomendações
Recomendação | Benefício |
---|---|
Distribua sua conta do Azure Cosmos DB entre zonas de disponibilidade (quando disponível). | As zonas de disponibilidade fornecem energia, rede e resfriamento distintos, isolando falhas de hardware para um subconjunto de réplicas. O Azure Cosmos DB tem várias réplicas que se estendem por uma única zona de disponibilidade aleatória quando o recurso de zonas de disponibilidade não é usado. Se o recurso de zona de disponibilidade for usado, as réplicas se estenderão por várias zonas de disponibilidade. |
Configure sua conta do Azure Cosmos DB para abranger pelo menos duas regiões. | A abrangência de várias regiões evita que sua conta fique totalmente indisponível se houver uma interrupção de região isolada. |
Habilite o failover gerenciado por serviço para sua conta. | O failover gerenciado por serviço permite que o Azure Cosmos DB altere a região de gravação de uma conta de várias regiões para preservar a disponibilidade. Essa alteração ocorre sem interação do usuário. Compreenda as compensações com o failover gerenciado por serviço e planeje o failover forçado, se necessário. Para obter mais informações, consulte a criação de aplicativos altamente disponíveis. |
Valide a disponibilidade testando o failover manualmente com o failover gerenciado pelo serviço temporariamente desativado. | A desativação temporária do failover de gerenciamento de serviço permite validar a alta disponibilidade de ponta a ponta do seu aplicativo com um failover manual iniciado usando um script ou o portal do Azure. Depois, você pode reativar o failover gerenciado pelo serviço. |
Definições do Azure Policy
- Política: Requer pelo menos duas regiões
- Política: Habilitar failover gerenciado por serviço
- Política: Exigir regiões de implantação específicas
Segurança
A segurança é uma parte crítica de qualquer arquitetura que pode ser facilmente negligenciada por conveniência. Aumente a segurança da sua carga de trabalho final considerando várias práticas recomendadas de segurança antecipadamente antes que o primeiro recurso ou prova de conceito seja criado. Esta seção inclui considerações e recomendações para reduzir o número de vulnerabilidades de segurança para sua carga de trabalho final.
Lista de verificação de estruturação
- Reduza a área de ataque à superfície projetando para usar pontos de extremidade privados de acordo com a linha de base de segurança do Azure Cosmos DB.
- Crie funções, grupos e atribuições para acesso de plano de controle e plano de dados à sua conta de acordo com o princípio de acesso de privilégios mínimos. Considere desativar a autenticação baseada em chave.
- Avalie a conformidade e as certificações de nível de serviço no contexto dos atuais requisitos globais de dados pessoais.
- Criptografe dados em repouso ou em movimento usando chaves gerenciadas por serviço ou chaves gerenciadas pelo cliente (CMKs).
- Audite o acesso do usuário, violações de segurança e operações de recursos com logs de plano de controle.
- Monitore a saída de dados, as alterações de dados, o uso e a latência com métricas do plano de dados.
Recomendações
Recomendação | Benefício |
---|---|
Implemente, no mínimo, as linhas de base de segurança de proteção de dados e gerenciamento de identidade. | Percorra a linha de base de segurança, incluindo gerenciamento de identidade e proteção de dados. Implemente as recomendações para proteger sua conta do Azure Cosmos DB. |
Desative pontos de extremidade públicos e use pontos de extremidade privados sempre que possível. | Evite deixar pontos de extremidade públicos desnecessários ou não utilizados disponíveis para ataques à área de superfície na sua conta. |
Use o controle de acesso baseado em função para limitar o acesso do plano de controle a identidades e grupos específicos e dentro do escopo de atribuições bem definidas. | Use o controle de acesso baseado em função para evitar o acesso não intencional à sua conta. Atribua funções e permissões apropriadas a usuários ou aplicativos que acessam o Azure Cosmos DB. |
Crie pontos de extremidade de rede virtual e regras para limitar o acesso à conta. | Implemente pontos de extremidade de serviço de rede virtual e regras de firewall para restringir o acesso à sua conta do Azure Cosmos DB. Use NSGs (grupos de segurança de rede) para controlar o tráfego de entrada e saída de e para os recursos do Azure Cosmos DB. Limitar o acesso a redes confiáveis e aplicar medidas de segurança de rede apropriadas ajuda a proteger seus dados contra acesso não autorizado. |
Siga as melhores práticas de desenvolvimento de software para acesso seguro aos dados. | Siga práticas de codificação seguras e execute revisões de código seguras ao desenvolver aplicativos que interagem com o Azure Cosmos DB. Proteja-se contra vulnerabilidades de segurança comuns, como ataques de injeção, scripts entre sites (XSS) ou referências diretas de objetos inseguras (IDOR). Implemente validação de entrada, consultas parametrizadas e tratamento de erros apropriado para códigos de status HTTP comuns para evitar riscos de segurança. |
Monitore os logs do plano de controle em busca de violações. | O monitoramento ajuda você a rastrear padrões de acesso e logs de auditoria, garantindo que seu banco de dados permaneça seguro e em conformidade com as regulamentações relevantes de proteção de dados. O monitoramento de métricas de plano de dados também pode ajudar a identificar padrões desconhecidos que podem revelar uma violação de segurança. Para obter mais informações, consulte Lista de verificação de segurança para bancos de dados do Azure. |
Habilitar o Microsoft Defender para Azure Cosmos DB | O Microsoft Defender deteta tentativas de explorar bancos de dados em sua conta do Azure Cosmos DB para NoSQL. O Defender deteta possíveis injeções de SQL, padrões de acesso suspeitos e outras explorações potenciais. |
Definições do Azure Policy
- Política: Habilitar o Microsoft Defender
- Política: Exigir um ponto de extremidade de serviço de rede virtual
- Política: Desativar a autenticação local
- Política: Exigir regras de firewall
Otimização de custos
As características da sua carga de trabalho e a implementação da sua solução podem influenciar o custo final de execução no Azure. Considere os principais drivers, como sua estratégia de particionamento, nível de consistência, replicação e tipo de gravação ao projetar sua carga de trabalho. Ao dimensionar sua carga de trabalho, considere a natureza de leitura/gravação de seus dados, o tamanho dos itens médios, a normalização e o TTL. Esta seção inclui considerações e recomendações para simplificar os custos de sua carga de trabalho.
- Crie uma política de indexação que considere as operações e consultas que você normalmente faz em sua carga de trabalho.
- Determine uma chave de partição ou um conjunto de chaves de partição que tenham um valor que tenha alta cardinalidade e não seja alterado. Use as diretrizes e as práticas recomendadas existentes para ajudar a selecionar uma chave de partição apropriada. Além disso, considere sua política de indexação ao determinar uma chave de partição.
- Selecione um esquema de alocação de taxa de transferência apropriado para sua carga de trabalho. Analise os benefícios da taxa de transferência padrão e de dimensionamento automático distribuída no nível do banco de dados ou do contêiner. Além disso, considere serverless quando apropriado. Analise os padrões de tráfego da sua carga de trabalho no contexto da seleção de um esquema de alocação de taxa de transferência.
- Considere os níveis de consistência relacionados à sua carga de trabalho. Além disso, considere se as sessões de cliente devem alterar o nível de consistência padrão.
- Calcule o armazenamento de dados geral esperado para sua carga de trabalho. O tamanho dos itens e índices influencia o custo de armazenamento de dados. Dimensione o impacto da replicação e do backup nos custos de armazenamento.
- Crie uma estratégia para remover automaticamente itens mais antigos que não são mais usados ou necessários. Se necessário, exporte esses itens para uma solução de armazenamento de baixo custo antes de serem removidos.
- Avalie suas consultas mais comuns que minimizam pesquisas entre partições. Use essas informações para informar o processo de seleção de uma chave de partição ou personalização de uma política de indexação.
Recomendações
Recomendação | Benefício |
---|---|
Monitore a utilização e os padrões de RU/s. | Use métricas para monitorar o consumo de RU desde o início da sua solução. Use consultas e outras técnicas de pesquisa de dados para encontrar antipadrões no código do aplicativo. |
Personalize sua política de indexação para mapear sua carga de trabalho. | A política de indexação padrão indexa todos os caminhos em um item, e essa política pode ter impactos significativos no consumo e nos custos de RU. Use uma política de indexação projetada com base apenas nos caminhos que você precisa indexar para suas consultas comuns. Para cargas de trabalho com muita gravação, desative a indexação automática de colunas não usadas em consultas. |
Selecione a(s) chave(s) de partição que são ideais para a sua carga de trabalho. | A(s) chave(s) de partição deve(m) distribuir o consumo de taxa de transferência e o armazenamento de dados uniformemente entre partições lógicas. A seleção também deve minimizar o número de consultas de partição cruzada não limitadas. Evite partições quentes que recebem uma quantidade desproporcional de tráfego, pois desequilibrar partições pode aumentar os custos de taxa de transferência e erros transitórios. Use as consultas de pesquisa mais comuns para determinar possíveis chaves de partição que provavelmente executam apenas consultas de partição única ou de partição cruzada limitada. |
Use taxa de transferência sem servidor ou provisionada, provisionamento manual ou dimensionamento automático, no nível de banco de dados ou contêiner, quando apropriado para sua carga de trabalho. | Compare os tipos de taxa de transferência provisionada e selecione a opção apropriada para sua carga de trabalho. Geralmente, cargas de trabalho menores e de desenvolvimento/teste podem se beneficiar da taxa de transferência sem servidor ou da taxa de transferência compartilhada manual no nível do banco de dados. Cargas de trabalho maiores e de missão crítica podem se beneficiar da taxa de transferência provisionada atribuída no nível do contêiner. |
Configure o nível de consistência padrão para seu aplicativo. Quando apropriado, faça downgrade do nível de consistência padrão nas sessões do cliente. | Talvez nem sempre seja necessário alterar o nível de consistência padrão padrão ou substituí-lo em sessões de cliente. Considere os custos mais altos associados às leituras em níveis de consistência mais fortes. |
Para cargas de trabalho de desenvolvimento/teste, use o emulador do Azure Cosmos DB. | O emulador do Azure Cosmos DB é uma opção para desenvolvimento/teste e integração contínua que pode economizar nos custos dessas cargas de trabalho comuns para sua equipe de desenvolvimento. O emulador também está disponível como uma imagem de contêiner do Docker. |
Usar operações em lote transacionais | Projete partições para aproveitar as operações em lote transacionais dentro de uma chave de partição lógica para inserção. Use operações em lote em SDKs do lado do cliente para inserir, atualizar ou excluir vários documentos em uma única solicitação de transação. Essa etapa pode reduzir o número de solicitações individuais e, eventualmente, levar a uma melhor eficiência da taxa de transferência. |
Use a projeção para reduzir os custos de taxa de transferência de grandes conjuntos de resultados de consulta. | Consultas de autor para projetar apenas o número mínimo de campos necessários de um conjunto de resultados. Se os cálculos nos campos forem necessários, avalie o custo da taxa de transferência da execução desses cálculos do lado do servidor versus do lado do cliente. |
Evite usar consultas entre partições ilimitadas. | Avalie e crie consultas para garantir que elas pesquisem dentro de uma única partição lógica sempre que possível. Use filtros de consulta para controlar quais partições lógicas os destinos da consulta. Se uma consulta precisar pesquisar em partições lógicas, vincule a consulta a pesquisar apenas um subconjunto de partições lógicas em vez de uma verificação completa. |
Implemente o tempo de vida útil (TTL) para remover itens não utilizados. | Use o TTL para excluir automaticamente os dados que não são mais necessários. Gerencie os custos de armazenamento removendo dados expirados ou obsoletos. Se necessário, exporte os dados expirados para uma solução de armazenamento de baixo custo. |
Considere um repositório analítico para agregações pesadas. | O repositório analítico do Azure Cosmos DB sincroniza automaticamente seus dados com um repositório de colunas separado para otimizar grandes agregações, relatórios e consultas analíticas. |
Definições do Azure Policy
Excelência operacional
As cargas de trabalho devem ser monitoradas depois de implantadas para garantir que tenham o desempenho esperado. Além disso, o monitoramento de cargas de trabalho pode ajudar a desbloquear novas eficiências não imediatamente óbvias durante a fase de planejamento. Em cenários catastróficos, os dados de diagnóstico são a chave para descobrir por que um incidente de alta gravidade pode ter ocorrido. Esta seção inclui considerações e recomendações para monitorar eventos e características de suas cargas de trabalho.
Lista de verificação de estruturação
- Elabore uma estratégia de monitoramento de log e métricas para diferenciar entre diferentes cargas de trabalho, sinalizar cenários excecionais, controlar padrões em exceções/erros e controlar o desempenho da máquina host.
- Projete grandes cargas de trabalho para usar operações em massa sempre que possível.
- Defina vários alertas para monitorar a limitação, analisar a alocação de taxa de transferência e controlar o tamanho dos dados.
- Projete uma estratégia de monitoramento para a disponibilidade de sua solução em todas as regiões.
- Crie e aplique práticas recomendadas para automatizar a implantação de sua conta e recursos do Azure Cosmos DB para NoSQL.
- Planeje os limites métricos esperados com base no design de partição e índice. Certifique-se de que há um plano para monitorar essas métricas para determinar o quão perto elas estão dos limites planejados.
Recomendações
Recomendação | Benefício |
---|---|
Verifique se os desenvolvedores de aplicativos estão usando a versão mais recente do SDK do desenvolvedor. | Cada SDK do Azure Cosmos DB para NoSQL tem uma versão mínima recomendada. Para obter mais informações, consulte .NET SDK e Java SDK. |
Crie identificadores no aplicativo cliente para diferenciar cargas de trabalho. | Considere sinalizadores, como o sufixo user-agent, para identificar a qual carga de trabalho cada entrada de log ou métrica deve ser associada. |
Capture diagnósticos suplementares usando o SDK do desenvolvedor. | Use as técnicas de injeção de diagnóstico para cada SDK para adicionar informações suplementares sobre a carga de trabalho juntamente com métricas e logs padrão. Para obter mais informações, consulte .NET SDK e Java SDK. |
Crie alertas associados aos recursos da máquina host. | Problemas de conectividade e disponibilidade podem ocorrer devido a problemas na máquina host do lado do cliente. Monitore recursos como CPU, memória e armazenamento em máquinas host com aplicativos cliente usando o Azure Cosmos DB para SDKs NoSQL. |
Use os recursos em massa dos SDKs de cliente para operações grandes. | Cenários que exigem um alto grau de taxa de transferência se beneficiam do uso do recurso em massa do SDK. O recurso em massa gerencia automaticamente e agrupa as operações para maximizar a taxa de transferência. |
Crie alertas para limitação de taxa de transferência. | Use alertas para acompanhar a limitação da taxa de transferência além dos limites esperados. Com o tempo, revise e ajuste os alertas à medida que você aprende mais sobre sua carga de trabalho em relação ao Azure Cosmos DB. A métrica Consumo Normalizado de RU é uma métrica que mede a porcentagem de utilização da taxa de transferência provisionada em um banco de dados ou contêiner. Se essa métrica estiver consistentemente em 100%, as solicitações provavelmente retornarão um erro transitório. |
Acompanhe o desempenho da consulta usando métricas. | Use métricas para acompanhar o desempenho das suas principais consultas ao longo do tempo. Avalie se há eficiências a serem encontradas atualizando a política de indexação ou alterando consultas. Se o desempenho da consulta for ruim, solucione problemas de desempenho e aplique as práticas recomendadas de consulta. Para obter mais informações, consulte dicas de desempenho de consulta. |
Use modelos para implantar automaticamente os recursos da conta. | Considere os modelos do Azure Resource Manager, Bíceps ou Terraform para automatizar a implantação de sua conta e recursos subsequentes. Certifique-se de que sua equipe esteja usando os mesmos modelos para implantar em outros ambientes que não sejam de produção. |
Acompanhe as principais métricas para identificar problemas comuns em sua carga de trabalho. | Use métricas específicas para encontrar problemas comuns em sua carga de trabalho, incluindo, mas não limitado a; Utilização de RU, utilização de RU por partição, limitação e volumes de solicitação por tipo. Para obter mais informações, consulte Referência de dados do monitor. |
Definições do Azure Policy
Eficiência de desempenho
- Defina uma linha de base de desempenho para seu aplicativo. Meça quantos usuários simultâneos e transações você pode precisar lidar. Considere as características da carga de trabalho, como o fluxo médio de usuários, as operações comuns e os picos de uso.
- Pesquise as suas consultas mais comuns e complexas. Identifique consultas que usam várias pesquisas, junções ou agregações. Considere essas consultas em quaisquer considerações de design para a chave de partição ou política de indexação.
- Para as consultas mais comuns, determine o número de resultados esperados por página. Esse número ajudará a formalizar uma contagem de itens em buffer para resultados pré-buscados.
- Pesquise seus usuários-alvo. Determine quais regiões do Azure estão mais próximas delas.
- Identifique consultas que usam um ou mais campos de ordenação. Além disso, identifique as operações que afetam vários campos. Inclua esses campos explicitamente no design da política de indexação.
- Projete itens para que seus documentos JSON correspondentes sejam o menor possível. Considerar a divisão de dados entre vários itens, se necessário.
- Identifique consultas em matrizes filhas e determine se elas são candidatas a subconsultas mais eficientes.
- Determine se sua carga de trabalho requer um armazenamento analítico. Considere armazenamentos analíticos e serviços como o Azure Synapse Link para consultas extremamente complexas.
Recomendação | Benefício |
---|---|
Configure sua taxa de transferência com base em sua linha de base de desempenho. | Use ferramentas como a calculadora de capacidade para determinar a quantidade de taxa de transferência necessária para sua linha de base de desempenho. Use recursos como o dimensionamento automático para dimensionar sua taxa de transferência real para corresponder mais de perto à sua carga de trabalho real. Monitore seu consumo real de rendimento depois e faça ajustes. |
Use técnicas de otimização nos lados do cliente e do servidor quando apropriado. | Aproveite o cache integrado integrado. Configure o SDK para gerenciar quantos itens são pré-buscados (buffer) e retornados para cada página. |
Implante o Azure Cosmos DB para NoSQL em regiões mais próximas de seus usuários finais. | Reduza a latência implantando o Azure Cosmos DB para NoSQL nas regiões mais próximas de seus usuários finais, tanto quanto possível. Aproveite a replicação de leitura para fornecer um desempenho de leitura eficiente, independentemente de como você configura a gravação (uma ou várias regiões). Configure o SDK (.NET/Java) para preferir regiões mais próximas do seu usuário final. |
Configure o SDK para o modo Direct. | O modo direto é a opção preferida para o melhor desempenho. Esse modo permite que seu cliente abra conexões TCP diretamente para partições no serviço e envie solicitações diretamente sem gateway intermediário. Este modo oferece um melhor desempenho porque há menos saltos de rede. |
Desative a indexação para operações em massa. | Se houver muitas operações de inserção/substituição/upsert, desative a indexação para melhorar a velocidade da operação enquanto usa o suporte em massa do SDK correspondente. A indexação pode ser reativada imediatamente mais tarde. |
Crie índices compostos para campos que são usados em operações complexas. | Os índices compostos podem aumentar a eficiência das operações em vários campos por ordens de magnitude. Em muitos casos, use índices compostos para ORDER BY instruções com vários campos. |
Otimize máquinas cliente host para os SDKs. | Para casos mais comuns, use pelo menos 4 núcleos e 8 GB de memória em máquinas host de 64 bits usando os SDKs (.NET/Java). Além disso, habilite a rede acelerada em máquinas host. |
Use o padrão singleton para a CosmosClient classe na maioria dos SDKs. |
Use a classe client na maioria dos SDKs como um singleton. A classe de cliente gerencia seu próprio ciclo de vida e é projetada para não ser descartada. A criação e eliminação constantes de instâncias pode resultar em desempenho reduzido. |
Mantenha os tamanhos dos itens com menos de 100 KB . | Itens maiores consomem mais taxa de transferência para operações comuns de leitura e gravação. Consultas em itens maiores que projetam todos os campos também podem ter um custo de taxa de transferência significativo. |
Use subconsultas estrategicamente para otimizar consultas que unem grandes conjuntos de dados. | As consultas que unem matrizes filhas podem aumentar em complexidade se várias matrizes estiverem envolvidas e não forem filtradas. Por exemplo, uma consulta que une mais de duas matrizes de pelo menos 10 itens cada pode se expandir para 1.000+ tuplas. Otimize expressões de associação automática usando subconsultas para filtrar as matrizes antes de unir matrizes dentro do item. Para consultas entre partições, otimize sua consulta para incluir um filtro na chave de partição para otimizar o roteamento de sua consulta para a menor quantidade de partições possível. |
Use cargas de trabalho analíticas para as consultas mais complexas. | Se você executar agregações frequentes ou ingressar consultas em contêineres grandes, considere habilitar o repositório analítico e fazer consultas no Azure Synapse Analytics. |
Definições do Azure Policy
Recursos extras
Considere mais recursos relacionados ao Azure Cosmos DB para NoSQL.
Orientação do Centro de Arquitetura do Azure
- Multilocação e Azure Cosmos DB
- Pesquisa visual no varejo com o Azure Cosmos DB
- Jogos usando o Azure Cosmos DB
- Aplicativos sem servidor usando o Azure Cosmos DB
- Personalização usando o Azure Cosmos DB