Partilhar via


Estratégias de arquitetura para otimizar o dimensionamento e o particionamento

Aplica-se a esta recomendação da lista de verificação de Eficiência de Desempenho do Azure Well-Architected Framework:

PE:05 Otimize o dimensionamento e o particionamento. Incorpore dimensionamento e particionamento confiáveis e controlados. O design da unidade de escala da carga de trabalho é a base da estratégia de dimensionamento e particionamento.

Este guia descreve as recomendações para dimensionar e particionar uma carga de trabalho. Dimensionamento é a capacidade de aumentar ou diminuir os recursos alocados a uma carga de trabalho com base na demanda. O particionamento envolve a divisão da carga de trabalho em unidades menores e gerenciáveis para distribuir dados e processamento em vários recursos. Uma carga de trabalho que não é dimensionada ou particionada pode ter um desempenho ruim em períodos de alta demanda e capacidade subutilizada em períodos de baixa demanda.

Definições

Term Definition
Escala automática Um recurso que ajusta automaticamente os limites de capacidade de um serviço com base em configurações predefinidas, permitindo que ele aumente ou diminua a escala conforme necessário.
Capacidade O limite superior ou a capacidade máxima de um determinado serviço ou recurso.
Afinidade com o cliente (afinidade de sessão) O roteamento intencional de solicitações de um único cliente para uma única instância de servidor para ajudar a garantir um gerenciamento de sessão consistente.
Consistência (banco de dados distribuído) A uniformidade de dados entre vários nós em um banco de dados distribuído, garantindo que todas as réplicas tenham os mesmos dados em um determinado momento.
Consistência (banco de dados relacional) A propriedade de uma transação que traz um banco de dados de um estado válido para outro, mantendo a integridade dos dados.
Nível de consistência Uma configuração que define como e quando os dados são replicados em um sistema de banco de dados distribuído, determinando a compensação entre consistência e desempenho.
Bloqueio de dados Um mecanismo usado para evitar atualizações simultâneas dos mesmos dados.
Dimensionamento horizontal Uma abordagem de dimensionamento que adiciona instâncias de um determinado tipo de recurso.
Concorrência otimista Uma abordagem para atualizar bancos de dados que usa instantâneos para fazer atualizações em vez dos mecanismos tradicionais de bloqueio.
Partitioning O processo de divisão física de dados em armazenamentos de dados separados.
Escalabilidade A capacidade de uma carga de trabalho alterar dinamicamente seus limites de capacidade para acomodar diferentes níveis de demanda.
Unidade de escala Um grupo de recursos que se dimensionam proporcionalmente.
Afinidade de Estado O armazenamento de dados de sessão do cliente em um único servidor para que o mesmo servidor lide com solicitações subsequentes do mesmo cliente.
Dimensionamento vertical Uma abordagem de dimensionamento que adiciona capacidade de computação aos recursos existentes.

Tanto o dimensionamento quanto o particionamento contribuem para a eficiência do desempenho, garantindo que os recursos sejam usados de forma eficaz e que a carga de trabalho possa lidar com cargas variáveis. Essas práticas são especialmente importantes em ambientes de nuvem, onde os aplicativos precisam ser flexíveis e adaptáveis às demandas em constante mudança. O dimensionamento garante que você possa expandir a capacidade da carga de trabalho para atender às demandas crescentes. O particionamento permite dividir tarefas ou dados de forma eficiente para lidar com essas necessidades crescentes. A base de ambos os processos é o design da unidade de escala da carga de trabalho. Ele dita como sua carga de trabalho deve crescer e distribuir tarefas. Ao incorporar uma abordagem confiável e controlada para dimensionamento e particionamento, você pode evitar possíveis ineficiências da carga de trabalho.

Otimize o dimensionamento

Otimizar o dimensionamento é o processo de ajustar o número de servidores, instâncias ou recursos para atender às demandas flutuantes de uma carga de trabalho. Ele garante que a carga de trabalho possa lidar com o aumento do tráfego ou das demandas sem sofrer degradação de desempenho ou tempo de inatividade.

Escolha uma estratégia de dimensionamento

A escolha de uma estratégia de dimensionamento envolve decidir entre métodos verticais ou horizontais para aumentar a capacidade de uma carga de trabalho com base em seus requisitos específicos. Selecionar a estratégia certa garante que os recursos sejam ajustados de forma eficiente para atender às demandas de carga de trabalho sem uso excessivo ou desperdício. Para escolher a estratégia de dimensionamento correta, você precisa entender os casos de uso para dimensionamento vertical e horizontal e como eles atendem às necessidades de sua carga de trabalho.

Entenda o dimensionamento vertical. Usando o dimensionamento vertical, você pode aumentar a capacidade de um único recurso, como atualizar para um servidor ou tamanho de instância maior. O dimensionamento vertical é útil quando a carga de trabalho pode se beneficiar do aumento da capacidade de processamento, da memória ou de outros recursos em uma única instância. O dimensionamento vertical é apropriado para cargas de trabalho que não são facilmente divididas em partes menores ou quando a arquitetura do aplicativo não oferece suporte ao dimensionamento horizontal.

Entenda o dimensionamento horizontal. Usando o dimensionamento horizontal, você pode adicionar mais instâncias ou recursos para distribuir a carga de trabalho entre vários servidores. O dimensionamento horizontal oferece benefícios como resiliência aprimorada, maior capacidade e a capacidade de lidar com demandas de tráfego ou carga de trabalho maiores. É eficaz para aplicações nativas da nuvem concebidas para serem executadas em vários nós. O dimensionamento horizontal é apropriado para cargas de trabalho que podem ser divididas em partes menores que são executadas de forma independente.

Entenda a carga de trabalho. A adequação do dimensionamento vertical ou horizontal depende das características e requisitos específicos da carga de trabalho. O monitoramento e os testes regulares de desempenho nas seguintes áreas podem ajudar a otimizar a estratégia de dimensionamento ao longo do tempo:

  • Requisitos: Compreenda os requisitos específicos da carga de trabalho considerando fatores como demandas de recursos, necessidades de escalabilidade e as limitações da carga de trabalho.

  • Unidades de escala: crie um design de unidade de escala para componentes que se espera que sejam dimensionados juntos. Por exemplo, 100 máquinas virtuais podem exigir duas filas e três contas de armazenamento para lidar com a carga de trabalho extra. A unidade de escala seria de 100 máquinas virtuais, duas filas e três contas de armazenamento. Você deve dimensionar de forma independente todos os componentes que apresentam flutuação de uso de capacidade.

  • Arquitetura: Avalie o design da arquitetura do aplicativo. Alguns aplicativos podem ser inerentemente projetados para serem dimensionados horizontalmente, com componentes sem monitoração de estado que podem ser facilmente distribuídos em várias instâncias. Outros aplicativos podem ter componentes ou dependências com monitoração de estado que tornam o dimensionamento vertical mais apropriado. Avalie os requisitos de escalabilidade e elasticidade da carga de trabalho.

Projete a infraestrutura para dimensionar

Projetar a infraestrutura para dimensionar é o processo de criação de uma arquitetura que pode lidar com demandas e cargas de trabalho crescentes, adicionando ou ajustando recursos conforme necessário. Envolve o planejamento e a implementação de soluções que podem ser dimensionadas horizontal ou verticalmente para acomodar o crescimento. As estratégias incluem evitar singletons que podem se tornar gargalos e dissociar componentes de aplicativos para garantir escalabilidade independente. Quando você projeta uma carga de trabalho para ser escalável, ela pode distribuir efetivamente a carga de trabalho entre vários recursos, o que evita gargalos e maximiza a utilização de recursos.

Evite singletons. Você deve evitar o uso de um único recurso centralizado para toda a carga de trabalho. Em vez disso, distribua sua carga de trabalho por vários recursos para melhor escalabilidade, tolerância a falhas e desempenho. Explore alguns exemplos específicos e considerações de design para evitar singletons em recursos de carga de trabalho:

  • Nivelamento de carga baseado em fila: em vez de depender de uma única fila para processar mensagens, considere particionar a carga de trabalho em várias filas para distribuir a carga de processamento. Ele fornece melhor escalabilidade e processamento paralelo.

  • Processamento de dados: os padrões singleton geralmente aparecem em cenários de processamento de dados em que o processamento não se esgota. Divida tarefas de longa duração em tarefas menores que podem ser dimensionadas melhor para distribuir a carga de trabalho em vários recursos e aproveitar o paralelismo.

  • Padrões de design: Padrões de design como Fan-out/Fan-in ou Pipes and Filters podem ajudar a evitar singletons em fluxos de trabalho. Esses padrões permitem a distribuição de tarefas de processamento em vários recursos e promovem escalabilidade e flexibilidade.

Desacoplar componentes. O desacoplamento de componentes de aplicativos é um aspeto importante do design para escalabilidade. Isso envolve dividir o aplicativo em componentes menores e independentes que podem operar e dimensionar independentemente com base em requisitos específicos de carga de trabalho. Por exemplo, se um componente requer mais recursos devido ao aumento da demanda, você pode dimensionar esse componente sem afetar os outros. Essa flexibilidade garante uma alocação eficiente de recursos e evita gargalos. Ao desacoplar componentes, você pode isolar falhas e minimizar o efeito na aplicação geral. Se um componente falhar, os outros componentes podem continuar a funcionar independentemente.

Os componentes dissociados são mais fáceis de manter e atualizar. Alterações ou atualizações em um componente podem ser feitas sem afetar os outros, pois são independentes. Siga estas diretrizes para dissociar os componentes do aplicativo para escalabilidade:

  • Separação de preocupações: identifique as responsabilidades e funcionalidades da sua aplicação. Divida as responsabilidades em componentes separados com base em suas tarefas específicas. Por exemplo, você pode ter componentes separados para autenticação de usuário, processamento de dados e interface do usuário.

  • Acoplamento flexível: Projete os componentes para se comunicarem entre si através de interfaces e protocolos bem definidos. Este design reduz as dependências entre componentes e permite uma substituição ou dimensionamento mais fácil de componentes individuais.

  • Comunicação assíncrona: use padrões de comunicação assíncronos, como filas de mensagens ou arquiteturas controladas por eventos, para separar ainda mais os componentes. Esses padrões permitem que os componentes processem tarefas de forma independente em seu próprio ritmo, melhorando a escalabilidade geral.

  • Microsserviços: considere a implementação de microsserviços, que são serviços pequenos e independentes que se concentram em funcionalidades específicas do negócio. Cada microsserviço pode ser desenvolvido, implantado e dimensionado de forma independente, proporcionando maior flexibilidade e escalabilidade.

Projete a aplicação à escala

Ao dimensionar uma carga de trabalho, você deve projetar o aplicativo para distribuir a carga. Só porque você pode adicionar mais réplicas no nível de infraestrutura não significa que seu aplicativo pode usar as réplicas. Projetar um aplicativo para dimensionar é estruturar um aplicativo para que ele possa lidar com demandas crescentes distribuindo sua carga de trabalho entre recursos. Evite soluções que exijam afinidade de cliente, bloqueio de dados ou afinidade de estado para uma única instância, se possível. Você deseja rotear um cliente ou processo para um recurso que tenha capacidade disponível. Para projetar a escalabilidade do aplicativo, considere as seguintes estratégias:

Elimine o estado da sessão do lado do servidor. Você deve projetar aplicativos para serem sem monitoração de estado sempre que possível. Para aplicativos com monitoração de estado, você deve usar um armazenamento de estado externo ao servidor. Externalizar o estado da sessão é a prática de armazenar dados da sessão fora do servidor de aplicativos ou contêiner. Você pode externalizar o estado da sessão para distribuir dados de sessão entre vários servidores ou serviços, permitindo o gerenciamento contínuo da sessão em um ambiente distribuído. Considere o seguinte ao externalizar o estado da sessão:

  • Avalie os requisitos da sessão. Entenda os dados da sessão que precisam ser armazenados e gerenciados. Considere atributos de sessão, tempos limite de sessão e quaisquer requisitos específicos para replicação ou persistência de sessão. Determine o tamanho do estado da sessão e a frequência das operações de leitura e gravação.

  • Escolha uma solução. Selecione uma solução de armazenamento que esteja alinhada com suas necessidades de desempenho e escalabilidade. As opções incluem o uso de um cache distribuído, um banco de dados ou um serviço de estado de sessão. Considere fatores como consistência de dados, latência e escalabilidade ao fazer sua escolha.

  • Configure seu aplicativo. Atualize seu aplicativo para usar a solução de armazenamento de estado de sessão escolhida. Talvez seja necessário alterar os arquivos de configuração ou o código do aplicativo para se conectar ao serviço de armazenamento externo.

  • Atualize sua lógica. Altere a lógica de gerenciamento de sessão do aplicativo para armazenar e recuperar dados de sessão da solução de armazenamento externo. Talvez seja necessário usar APIs ou bibliotecas fornecidas pela solução de armazenamento para gerenciar o estado da sessão.

Elimine a afinidade com o cliente. A afinidade com o cliente também é conhecida como afinidade de sessão ou sessões adesivas. Ao eliminar a afinidade do cliente, você distribui as solicitações do cliente uniformemente em várias réplicas ou servidores, sem rotear todas as solicitações de um cliente para a mesma réplica. Essa configuração pode melhorar a escalabilidade e o desempenho dos aplicativos, permitindo que qualquer réplica disponível processe as solicitações.

Reveja o algoritmo de balanceamento de carga. Um algoritmo de balanceamento de carga pode causar a fixação artificial e não intencional do cliente onde muitas solicitações são enviadas para uma instância de back-end. A fixação pode acontecer se o algoritmo estiver configurado para sempre enviar solicitações do mesmo usuário para a mesma instância. Também pode acontecer se os pedidos forem muito semelhantes entre si.

Elimine o bloqueio de dados. O bloqueio de dados garante consistência, mas tem desvantagens de desempenho. Pode causar escalonamentos de bloqueio e afetar negativamente a simultaneidade, a latência e a disponibilidade. Para eliminar o bloqueio de dados, você deve implementar simultaneidade otimista. Os bancos de dados não relacionais devem usar um controle de simultaneidade otimista e ter o nível de consistência correto. Sua estratégia de particionamento de dados também deve suportar suas necessidades de simultaneidade.

Use a descoberta de serviço dinâmico. A descoberta dinâmica de serviços é o processo de detetar e registrar automaticamente serviços em um sistema distribuído. Ele permite que os clientes descubram serviços disponíveis sem estarem fortemente acoplados a instâncias específicas. Os clientes não devem ser capazes de assumir uma dependência direta de uma instância específica na carga de trabalho. Para evitar essas dependências, você deve usar um proxy para distribuir e redistribuir conexões de cliente. O proxy atua como um intermediário entre clientes e serviços, fornecendo uma camada de abstração que permite que os serviços sejam adicionados ou removidos sem afetar os clientes.

Use tarefas em segundo plano. Quando um aplicativo é dimensionado, ele pode lidar com uma carga de trabalho crescente ou um número maior de solicitações simultâneas. O descarregamento de tarefas intensivas como tarefas em segundo plano permite que o aplicativo principal lide com solicitações do usuário sem que as operações que consomem muitos recursos o sobrecarreguem. Siga estas etapas para descarregar tarefas como tarefas em segundo plano:

  1. Encontre as tarefas com uso intensivo de CPU e E/S em seu aplicativo que você pode descarregar. Essas tarefas geralmente envolvem cálculos pesados ou interações com recursos externos, como bancos de dados ou operações de rede.

  2. Projete seu aplicativo para dar suporte a tarefas em segundo plano. Desacople as tarefas intensivas da lógica principal do aplicativo e forneça um mecanismo para iniciar e gerenciar tarefas em segundo plano.

  3. Implemente o processamento de tarefas em segundo plano com tecnologias ou estruturas apropriadas. Inclua recursos fornecidos pela sua linguagem de programação ou plataforma, como programação assíncrona, threading ou filas de tarefas. Contêm operações intensivas em tarefas ou threads separados, essas tarefas podem ser executadas simultaneamente ou agendadas para serem executadas em intervalos específicos.

  4. Distribua tarefas em segundo plano se houver muitas delas ou se as tarefas exigirem tempo ou recursos substanciais. Para uma solução possível, consulte o padrão Consumidores concorrentes.

Configurar o dimensionamento

A configuração do dimensionamento é o processo de configuração e ajuste de parâmetros para alocar recursos dinamicamente com base nas demandas de carga de trabalho. Ele engloba estratégias como o uso de recursos de dimensionamento automático, a compreensão dos limites de dimensionamento de serviço e a implementação de métricas de carga significativas. A configuração adequada garante que um aplicativo possa responder a demandas variadas enquanto maximiza a eficiência. Ao configurar o dimensionamento, considere as seguintes estratégias:

Use serviços com dimensionamento automático. O recurso de dimensionamento automático dimensiona automaticamente a infraestrutura para atender à demanda. Use ofertas de plataforma como serviço (PaaS) com recursos integrados de dimensionamento automático. A facilidade de dimensionamento em PaaS é uma grande vantagem. Por exemplo, a expansão de máquinas virtuais requer um balanceador de carga separado, tratamento de solicitação de cliente e estado armazenado externamente. As ofertas de PaaS lidam com a maioria dessas tarefas.

Restringir o dimensionamento automático. Defina limites de dimensionamento automático para minimizar o excesso de dimensionamento que pode resultar em custos desnecessários. Às vezes, não é possível definir limites de escala. Nesses casos, você deve definir alertas para notificá-lo quando o componente atingir o limite máximo de escala e sobredimensionado.

Entenda os limites de dimensionamento de serviço. Ao entender os limites, incrementos e restrições de dimensionamento de serviço, você pode tomar decisões informadas ao selecionar um serviço. Os limites de dimensionamento determinam se o serviço escolhido pode ou não lidar com a carga de trabalho esperada, dimensionar de forma eficiente e atender aos requisitos de desempenho do seu aplicativo. Os limites de escala a serem considerados incluem:

  • Limites de dimensionamento: os limites de dimensionamento são a capacidade máxima que um local ou serviço pode suportar. É importante conhecer esses limites para ajudar a garantir que o serviço possa acomodar a carga de trabalho esperada e lidar com o pico de uso sem degradação do desempenho. Cada recurso tem um limite de escala superior. Se você precisar ir além dos limites de escala, deverá particionar sua carga de trabalho.

  • Incrementos de dimensionamento: os serviços são dimensionados em incrementos definidos. Por exemplo, os serviços de computação podem ser dimensionados por instâncias e pods, enquanto os bancos de dados podem ser dimensionados por instâncias, unidades de transação e núcleos virtuais. É importante entender esses incrementos para otimizar a alocação de recursos e evitar a confusão de recursos.

  • Restrições de dimensionamento: alguns serviços permitem aumentar ou diminuir a escala, mas limitam sua capacidade de reverter automaticamente o dimensionamento. Você é forçado a dimensionar manualmente ou talvez seja necessário reimplantar um novo recurso. Essas limitações geralmente são para proteger a carga de trabalho. A redução ou a expansão podem ter implicações na disponibilidade e no desempenho da carga de trabalho. Um serviço pode impor certas limitações ou restrições para ajudar a garantir que a carga de trabalho tenha recursos suficientes para operar de forma eficaz. Essas limitações podem afetar a consistência e a sincronização de dados, especialmente em sistemas distribuídos. O serviço pode ter mecanismos para lidar com a replicação e a consistência de dados durante a expansão ou a redução, mas pode não fornecer o mesmo nível de suporte para redução ou entrada.

Use métricas de carga significativas. O dimensionamento deve usar métricas de carga significativas como gatilhos de dimensionamento. As métricas de carga significativas incluem métricas simples, como CPU ou memória. Eles também incluem métricas mais avançadas, como profundidade da fila, consultas SQL, consultas de métricas personalizadas e comprimento da fila HTTP. Considere usar uma combinação de métricas de carga simples e avançadas como seu gatilho de dimensionamento.

Use um buffer. Um buffer é uma capacidade não utilizada que pode ser usada para lidar com picos de demanda. Uma carga de trabalho bem projetada planeja picos inesperados na carga de trabalho. Você deve adicionar um buffer para lidar com picos para dimensionamento horizontal e vertical.

Evite bater. Flapping é uma condição de looping que ocorre quando um evento de escala dispara um evento de escala oposta, criando uma ação contínua de escala de ida e volta. Por exemplo, se o dimensionamento reduzir o número de instâncias, isso pode fazer com que o uso da CPU aumente nas instâncias restantes, acionando um evento de expansão. O evento de expansão, por sua vez, faz com que o uso da CPU caia, repetindo o processo.

É importante escolher uma margem adequada entre os limites de expansão e de expansão para evitar batimentos. Você pode evitar ações de expansão e expansão frequentes e desnecessárias definindo limites que fornecem uma diferença significativa no uso da CPU.

Use carimbos de implantação. Existem técnicas que facilitam o dimensionamento de uma carga de trabalho. Você pode usar o padrão Selos de Implantação para dimensionar facilmente uma carga de trabalho adicionando uma ou mais unidades de escala.

Risco: Embora o dimensionamento ajude a otimizar os custos, ajustando a capacidade para atender à demanda, ele pode resultar em um aumento geral do custo durante longos períodos de alta demanda.

Dimensionamento de teste

O teste de dimensionamento envolve a simulação de vários cenários de carga de trabalho em um ambiente controlado para avaliar como uma carga de trabalho responde a diferentes níveis de demanda. Ele ajuda a garantir que a carga de trabalho seja dimensionada de forma eficiente, maximizando a eficiência do desempenho durante cargas variadas.

Você precisa garantir que sua carga de trabalho seja dimensionada de forma eficiente em condições reais. É essencial realizar testes de carga e estresse em um ambiente que espelhe sua configuração de produção. Esses testes, conduzidos em ambientes que não são de produção, permitem avaliar estratégias de dimensionamento vertical e horizontal e determinar qual delas otimiza o desempenho de forma mais eficaz. Aqui está uma abordagem recomendada para testar o dimensionamento:

  • Defina cenários de carga de trabalho. Identifique os principais cenários de carga de trabalho que você precisa testar, como aumento do tráfego de usuários, solicitações simultâneas, volume de dados ou uso de recursos.

  • Use um ambiente de teste semelhante ao de produção. Crie um ambiente de teste separado que se assemelhe ao ambiente de produção em termos de infraestrutura, configuração e dados.

  • Defina métricas de desempenho. Defina as métricas de desempenho a serem medidas, como tempo de resposta, taxa de transferência, utilização da CPU e da memória e taxas de erro.

  • Desenvolver casos de teste. Desenvolver casos de teste que simulam diferentes cenários de carga de trabalho, aumentando gradualmente a carga para avaliar o desempenho em vários níveis.

  • Executar e monitorar testes. Execute os testes usando os casos de teste definidos e colete dados de desempenho em cada nível de carga. Monitore o comportamento da carga de trabalho, o consumo de recursos e a degradação do desempenho.

  • Analise e otimize o dimensionamento. Analise os resultados do teste para identificar gargalos de desempenho, limitações de escalabilidade ou áreas para melhoria. Otimize a configuração, a infraestrutura ou o código para melhorar a escalabilidade e o desempenho. Leva tempo para que o dimensionamento seja concluído, portanto, teste os efeitos dos atrasos de dimensionamento.

  • Dependências de endereço. Encontre possíveis problemas de dependência. Dimensionar ou particionar em uma área de uma carga de trabalho pode causar problemas de desempenho em uma dependência. As partes com estado de uma carga de trabalho, como bancos de dados, são a causa mais comum de problemas de desempenho de dependência. Os bancos de dados exigem um design cuidadoso para serem dimensionados horizontalmente. Você deve considerar medidas, como simultaneidade otimista ou particionamento de dados, para permitir mais taxa de transferência para o banco de dados.

  • Teste novamente após ajustes. Repita os testes de escalabilidade depois de implementar otimizações para validar as melhorias e ajudar a garantir que a carga de trabalho possa lidar com as cargas de trabalho esperadas de forma eficiente.

Compensação: considere as restrições orçamentárias e as metas de eficiência de custos da sua carga de trabalho. O dimensionamento vertical pode envolver custos mais elevados devido à necessidade de recursos maiores e mais poderosos. O dimensionamento horizontal oferece economia de custos usando instâncias menores que podem ser adicionadas ou removidas com base na demanda.

Carga de trabalho de partição

O particionamento é o processo de dividir um grande conjunto de dados ou carga de trabalho em partes menores e mais gerenciáveis chamadas partições. Cada partição contém um subconjunto dos dados ou da carga de trabalho e normalmente é armazenada ou processada separadamente. O particionamento permite o processamento paralelo e reduz a contenção. A divisão da carga de trabalho em unidades menores permite que o aplicativo processe cada unidade de forma independente. O resultado é uma melhor utilização dos recursos e tempos de processamento mais rápidos. O particionamento também ajuda a distribuir os dados entre vários dispositivos de armazenamento, reduzindo a carga em dispositivos individuais e melhorando o desempenho geral.

Compreender o particionamento

A abordagem de particionamento específica que você usa depende do tipo de dados ou carga de trabalho que você tem e da tecnologia que está usando. Algumas estratégias comuns para particionamento incluem:

  • Particionamento horizontal: nessa abordagem, o conjunto de dados ou a carga de trabalho é dividida com base em critérios específicos, como intervalos de valores ou atributos específicos. Cada partição contém um subconjunto dos dados que atende aos critérios definidos.

  • Particionamento vertical: nessa abordagem, o conjunto de dados ou a carga de trabalho é dividida com base em atributos ou colunas específicos. Cada partição contém um subconjunto das colunas ou atributos, permitindo um acesso mais eficiente aos dados necessários.

  • Particionamento funcional: Nesta abordagem, os dados ou a carga de trabalho são divididos com base nas funções ou operações específicas que precisam ser executadas. Cada partição contém os dados ou componentes necessários para uma função específica, permitindo um processamento e desempenho otimizados.

Planejar particionamento

É importante considerar fatores como distribuição de dados, padrões de consulta, crescimento de dados e requisitos de carga de trabalho ao particionar. O planejamento e o projeto adequados são essenciais para ajudar a garantir a eficácia do particionamento e maximizar a eficiência do desempenho. Se você abordar o particionamento como uma reflexão posterior, é mais desafiador porque você já tem uma carga de trabalho ativa para manter. Talvez seja necessário alterar a lógica de acesso a dados, distribuir grandes quantidades de dados entre partições e oferecer suporte ao uso contínuo durante a distribuição de dados.

Implementar particionamento

É importante analisar as características dos seus dados, padrões de acesso, requisitos de simultaneidade e metas de escalabilidade ao decidir qual tipo de particionamento usar. Cada tipo de particionamento tem suas próprias vantagens e considerações. Aqui estão alguns fatores a considerar para cada tipo de particionamento:

  • O particionamento horizontal é apropriado quando você deseja distribuir os dados entre vários recursos ou servidores para melhor escalabilidade e desempenho. É eficaz quando a carga de trabalho pode ser paralelizada e processada independentemente em cada partição. Considere o particionamento horizontal quando vários usuários ou processos precisarem ser capazes de acessar ou atualizar o conjunto de dados simultaneamente.

  • O particionamento vertical é apropriado quando certos atributos ou colunas são acessados com frequência, enquanto outros são acessados com menos frequência. O particionamento vertical permite um acesso eficiente aos dados necessários, minimizando a recuperação desnecessária de dados.

  • O particionamento funcional é apropriado quando diferentes funções requerem diferentes subconjuntos de dados e podem ser processados de forma independente. O particionamento funcional pode otimizar o desempenho, permitindo que cada partição concentre operações específicas.

Teste e otimize o particionamento

Teste o esquema de particionamento para verificar a eficácia e a eficiência da estratégia para que você possa fazer ajustes para melhorar o desempenho. Meça fatores como tempo de resposta, taxa de transferência e escalabilidade. Compare os resultados com as metas de desempenho e identifique quaisquer gargalos ou problemas. Com base na análise, identificar potenciais oportunidades de otimização. Talvez seja necessário redistribuir dados entre partições, ajustar tamanhos de partições ou alterar os critérios de particionamento.

Compensação: o particionamento adiciona complexidade ao design e desenvolvimento de uma carga de trabalho. O particionamento requer conversas e planejamento entre desenvolvedores e administradores de banco de dados.

Risco: O particionamento introduz alguns problemas potenciais que precisam ser considerados e resolvidos, incluindo:

  • Enviesamento de dados: O particionamento pode levar à distorção de dados, onde certas partições recebem uma quantidade desproporcional de dados ou carga de trabalho em comparação com outras. A distorção de dados pode resultar em desequilíbrios de desempenho e maior contenção em partições específicas.

  • Desempenho da consulta: esquemas de particionamento mal projetados podem afetar negativamente o desempenho da consulta. Se as consultas precisarem acessar dados em várias partições, isso pode exigir coordenação e comunicação extras entre partições, levando a um aumento da latência.

Gestão do Azure

Otimizando o dimensionamento. O Azure tem a capacidade de infraestrutura para dar suporte ao dimensionamento vertical e horizontal. Os serviços do Azure têm diferentes camadas de desempenho conhecidas como SKUs. Os SKUs permitem dimensionar verticalmente. Muitos dos recursos do Azure suportam dimensionamento automático ou outras opções de escala in-loco. Alguns recursos oferecem suporte a métricas avançadas ou entrada personalizada para dar suporte ao comportamento de dimensionamento de ajuste fino. A maioria das implementações de dimensionamento no Azure pode definir limites e dar suporte à observabilidade necessária para ser alertado sobre alterações.

O Azure Monitor permite que você monitore várias métricas e condições em seus aplicativos e infraestrutura. Você pode usar o Monitor para disparar ações de dimensionamento automatizado com base em regras predefinidas. Por exemplo, no Serviço Kubernetes do Azure (AKS), você pode usar o Monitor para habilitar o dimensionamento automático de pod horizontal (HPA) e o dimensionamento automático de cluster. Usando os recursos de monitoramento e alerta do Monitor, você pode facilitar efetivamente o dimensionamento no Azure e ajudar a garantir que seus aplicativos e infraestrutura possam ser ajustados dinamicamente para atender à demanda.

Você também pode criar dimensionamento automático personalizado no Azure. Você pode usar alertas no Monitor para recursos que não têm um recurso de dimensionamento automático. Esses alertas podem ser configurados para serem baseados em consulta ou métrica e podem executar ações usando a Automação do Azure. A automação fornece uma plataforma para hospedar e executar código PowerShell e Python no Azure, na nuvem e em ambientes locais. Ele oferece recursos como a implantação de runbooks sob demanda ou em um cronograma, histórico e registro em log de execução, armazenamento de segredos integrado e integração de controle do código-fonte.

Projetando aplicativos para escalar: aqui estão algumas maneiras pelas quais o Azure facilita o design de dimensionamento de aplicativos;

  • Eliminando o bloqueio de dados: no Banco de Dados SQL do Azure, você pode habilitar o bloqueio otimizado para melhorar o desempenho em bancos de dados que exigem consistência rigorosa.

  • Usando tarefas em segundo plano: o Azure oferece serviços e orientação para implementar trabalhos em segundo plano. Para obter mais informações, consulte Trabalhos em segundo plano.

  • Implementando o balanceamento de carga: o Azure fornece balanceadores de carga que não exigem afinidade de cliente. Esses balanceadores de carga incluem o Azure Front Door, o Azure Application Gateway e o Azure Load Balancer.

Particionando uma carga de trabalho: o Azure oferece várias estratégias de particionamento para diferentes armazenamentos de dados. Essas estratégias ajudam a melhorar o desempenho e a escalabilidade, distribuindo os dados em várias partições. Para obter mais informações, consulte Estratégias de partição de dados.

Lista de verificação de eficiência de desempenho

Consulte o conjunto completo de recomendações.