Recomendações para otimizar o dimensionamento e o particionamento

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

PE:05 Otimizar 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. O dimensionamento é a capacidade de aumentar ou diminuir os recursos alocados para uma carga de trabalho com base na demanda. O particionamento envolve dividir a carga de trabalho em unidades menores e gerenciáveis para distribuir dados e processamento entre vários recursos. Uma carga de trabalho que não é dimensionada ou partição pode apresentar baixo desempenho em períodos de alta demanda e capacidade subutilizada em períodos de baixa demanda.

Definições

Termo Definição
Autoscale Um recurso que ajusta automaticamente os limites de capacidade de um serviço com base em configurações predefinidas, permitindo que ele seja escalado ou reduzido verticalmente conforme necessário.
Capacity O limite superior ou a capacidade máxima de um determinado serviço ou recurso.
Afinidade de 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 dos dados em vários nós em um banco de dados distribuído, garantindo que todas as réplicas tenham os mesmos dados em um determinado ponto no tempo.
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 para os mesmos dados.
Dimensionamento horizontal Uma abordagem de dimensionamento que adiciona instâncias de um determinado tipo de recurso.
Simultaneidade otimista Uma abordagem para atualizar bancos de dados que usam instantâneos para fazer atualizações em vez de mecanismos de bloqueio tradicionais.
Particionamento O processo de divisão física de dados em armazenamentos de dados separados.
Escalabilidade A capacidade de uma carga de trabalho de alterar dinamicamente seus limites de capacidade para acomodar diferentes níveis de demanda.
Unidades da escala Um grupo de recursos que são dimensionados proporcionalmente juntos.
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.

Principais estratégias de design

O dimensionamento e o particionamento contribuem para a eficiência do desempenho, garantindo que os recursos sejam usados com eficiência e que a carga de trabalho possa lidar com cargas variadas. Essas práticas são especialmente importantes em ambientes de nuvem em que 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 com eficiência para lidar com essas necessidades crescentes. A base desses dois processos é o design da unidade de escala da carga de trabalho. Ele determina 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 de carga de trabalho.

Otimizar 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 enfrentar degradação de desempenho ou tempo de inatividade.

Escolher uma estratégia de dimensionamento

Escolher uma estratégia de dimensionamento envolve decidir entre métodos verticais ou horizontais para aprimorar 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 com eficiência 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 da 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 maior ou tamanho de instância. O dimensionamento vertical é útil quando a carga de trabalho pode se beneficiar do aumento do poder 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 dá suporte ao dimensionamento horizontal.

Entender 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 capacidade de lidar com o aumento do tráfego ou das demandas de carga de trabalho. Ele é eficaz para aplicativos nativos de nuvem projetados para serem executados 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 de desempenho regulares nas seguintes áreas podem ajudar a otimizar a estratégia de dimensionamento ao longo do tempo:

  • Requisitos: entenda 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 devem ser 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 independentemente todos os componentes que experimentam flutuação de uso da capacidade.

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

Projetar infraestrutura para dimensionar

Projetar infraestrutura para dimensionar é o processo de criação de uma arquitetura que pode lidar com demandas crescentes e carga de trabalho adicionando ou ajustando recursos conforme necessário. Ele 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 desassociar componentes do aplicativo para garantir a escalabilidade independente. Quando você cria uma carga de trabalho para ser escalonável, ela pode distribuir efetivamente a carga de trabalho entre vários recursos, o que impede 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 entre vários recursos para melhorar a escalabilidade, a tolerância a falhas e o 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 execução longa em tarefas menores que podem ser dimensionadas melhor para distribuir a carga de trabalho entre vários recursos e aproveitar o paralelismo.

  • Padrões de design: padrões de design como Fan-out/Fan-in ou Pipes e Filtros 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. A desacoplamento dos componentes do aplicativo é um aspecto importante do design para escalabilidade. Isso envolve dividir o aplicativo em componentes menores e independentes que podem operar e dimensionar de forma independente com base em requisitos específicos de carga de trabalho. Por exemplo, se um componente exigir mais recursos devido ao aumento da demanda, você poderá dimensionar esse componente sem afetar os outros. Essa flexibilidade garante a alocação eficiente de recursos e impede gargalos. Ao desacoplar componentes, você pode isolar falhas e minimizar o efeito no aplicativo geral. Se um componente falhar, os outros componentes poderão continuar funcionando de forma independente.

Componentes desacoplados são mais fáceis de manter e atualizar. Alterações ou atualizações em um componente podem ser feitas sem afetar as outras porque elas são independentes. Siga estas diretrizes para desacoplar os componentes do aplicativo para escalabilidade:

  • Separação de preocupações: identifique as responsabilidades e funcionalidades do seu aplicativo. 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 por meio de interfaces e protocolos bem definidos. Esse 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 desacoplar 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 de negócios específicas. Cada microsserviço pode ser desenvolvido, implantado e dimensionado de forma independente, proporcionando maior flexibilidade e escalabilidade.

Projetar aplicativo para dimensionar

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 da infraestrutura não significa que seu aplicativo possa usar as réplicas. Projetar um aplicativo para dimensionar é estruturar um aplicativo para que ele possa lidar com o aumento das demandas distribuindo sua carga de trabalho entre recursos. Evite soluções que exijam afinidade do 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:

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

  • Avalie seus requisitos de sessão. Entenda os dados de 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 se alinhe às 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.

  • Configurar 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.

Eliminar a afinidade do cliente. A afinidade do cliente também é conhecida como afinidade de sessão ou sessões autoadesivas. Ao eliminar a afinidade do cliente, você distribui as solicitações de cliente uniformemente entre várias réplicas ou servidores, sem rotear todas as solicitações de um cliente para o mesmo 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.

Examine o algoritmo de balanceamento de carga. Um algoritmo de balanceamento de carga pode causar fixação de cliente não intencional e artificial em que muitas solicitações são enviadas para uma instância de back-end. A fixação poderá ocorrer se o algoritmo estiver configurado para sempre enviar solicitações do mesmo usuário para a mesma instância. Isso também pode acontecer se as solicitações forem muito semelhantes umas às outras.

Eliminar o bloqueio de dados. O bloqueio de dados garante a consistência, mas tem desvantagens de desempenho. Isso 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 a simultaneidade otimista. Os bancos de dados não relacionais devem usar o controle de simultaneidade otimista e ter o nível de consistência certo. Sua estratégia de particionamento de dados também deve dar suporte às suas necessidades de simultaneidade.

Use a descoberta dinâmica do serviço. A descoberta dinâmica de serviço é o processo de detectar e registrar automaticamente serviços em um sistema distribuído. Ele permite que os clientes descubram os serviços disponíveis sem serem firmemente acoplados a instâncias específicas. Os clientes não devem ser capazes de assumir uma dependência direta em 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. Descarregar tarefas intensivas como tarefas em segundo plano permite que o aplicativo main lidar com solicitações de usuário sem que as operações com uso intensivo de 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 normalmente envolvem cálculos pesados ou interações com recursos externos, como bancos de dados ou operações de rede.

  2. Crie seu aplicativo para dar suporte a tarefas em segundo plano. Desacoplar as tarefas intensivas da lógica do aplicativo main e fornecer 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 por 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 ver uma solução possível, confira Padrão de clientes concorrentes.

Configurar a colocação em escala

Configurar o dimensionamento é o processo de configuração e ajuste de parâmetros para alocar dinamicamente recursos com base nas demandas de carga de trabalho. Ele abrange estratégias como o uso de recursos de dimensionamento automático, a compreensão dos limites de dimensionamento de serviços e a implementação de métricas de carga significativas. A configuração adequada garante que um aplicativo possa responder a demandas variadas e maximizar 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 PaaS (plataforma como serviço) com recursos internos de dimensionamento automático. A facilidade de dimensionamento no 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áticos para minimizar o excesso de dimensionamento que pode resultar em custos desnecessários. Às vezes, você não pode definir limites de dimensionamento. Nesses casos, você deve definir alertas para notificá-lo quando o componente atingir o limite máximo de escala e escala excessiva.

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 com eficiência e atender aos requisitos de desempenho do aplicativo. Os limites de dimensionamento a serem considerados incluem:

  • Limites de dimensionamento: os limites de dimensionamento são a capacidade máxima que um local ou serviço pode lidar. É 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 oscilação de recursos.

  • Restrições de dimensionamento: alguns serviços permitem que você expanda ou reduza verticalmente, mas limita sua capacidade de reverter automaticamente o dimensionamento. Você é forçado a dimensionar manualmente ou talvez precise reimplantar um novo recurso. Essas limitações geralmente são para proteger a carga de trabalho. Reduzir ou reduzir verticalmente pode ter implicações sobre a disponibilidade e o desempenho da carga de trabalho. Um serviço pode impor determinadas limitações ou restrições para ajudar a garantir que a carga de trabalho tenha recursos suficientes para operar com eficiência. 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 em vigor para lidar com a replicação de dados e a consistência durante a escala vertical ou horizontal, mas pode não fornecer o mesmo nível de suporte para reduzir ou reduzir verticalmente.

Use métricas de carga significativas. O dimensionamento deve usar métricas de carga significativas como gatilhos de dimensionamento. Métricas de carga significativas incluem métricas simples, como CPU ou memória. Elas 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 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 oscilar. Flapping é uma condição de loop que ocorre quando um evento de escala dispara um evento de escala oposta, criando uma ação contínua de dimensionamento de ida e volta. Por exemplo, se o dimensionamento em reduzir o número de instâncias, isso poderá fazer com que o uso da CPU aumente nas instâncias restantes, disparando um evento de expansão. O evento de expansão, por sua vez, faz com que o uso da CPU seja descartado, repetindo o processo.

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

Use Selos de Implantação. Há 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, isso pode resultar em um aumento geral do custo durante longos períodos de alta demanda.

Dimensionamento de teste

O dimensionamento de testes envolve simular 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 com eficiência, maximizando a eficiência de desempenho durante cargas variadas.

Você precisa garantir que sua carga de trabalho seja dimensionada com eficiência em condições reais. É essencial executar testes de carga e estresse em um ambiente que espelha sua configuração de produção. Esses testes, realizados em ambientes de não produção, permitem avaliar estratégias de dimensionamento vertical e horizontal e determinar qual otimiza o desempenho com mais eficiência. Aqui está uma abordagem recomendada para testar o dimensionamento:

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

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

  • Definir 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 memória e taxas de erro.

  • Desenvolver casos de teste. Desenvolva 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.

  • Analisar e otimizar o dimensionamento. Analise os resultados do teste para identificar gargalos de desempenho, limitações de escalabilidade ou áreas para aprimoramento. Otimize a configuração, a infraestrutura ou o código para aprimorar 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. O dimensionamento ou particionamento 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 habilitar mais taxa de transferência para o banco de dados.

  • Retestá-los 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 com eficiência.

Compensação: considere as restrições de orçamento e as metas de custo-eficiência de sua carga de trabalho. O dimensionamento vertical pode envolver custos mais altos devido à necessidade de recursos maiores e mais avançados. 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

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 carga de trabalho e normalmente é armazenada ou processada separadamente. O particionamento permite o processamento paralelo e reduz a contenção. Dividir a carga de trabalho em unidades menores permite que o aplicativo processe cada unidade de forma independente. O resultado é o melhor uso de recursos e tempos de processamento mais rápidos. O particionamento também ajuda a distribuir os dados em vários dispositivos de armazenamento, reduzindo a carga em dispositivos individuais e melhorando o desempenho geral.

Entender o particionamento

A abordagem de particionamento específica usada 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 é dividido 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 é dividido 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: nessa 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, habilitando o processamento e o 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 design adequados são essenciais para ajudar a garantir a eficácia do particionamento e maximizar a eficiência do desempenho. Se você tratar o particionamento como uma reflexão posterior, será 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 dar suporte ao uso contínuo durante a distribuição de dados.

Implementar o particionamento

É importante analisar as características de 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 serem considerados para cada tipo de particionamento:

  • O particionamento horizontal é apropriado quando você deseja distribuir os dados entre vários recursos ou servidores para melhorar a escalabilidade e o desempenho. Ele é 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 determinados atributos ou colunas são acessados com frequência, enquanto outros são acessados com menos frequência. O particionamento vertical permite acesso eficiente aos dados necessários minimizando a recuperação de dados desnecessária.

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

Testar e otimizar 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. Fatores de medida, 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, identifique possíveis oportunidades de otimização. Talvez seja necessário redistribuir dados entre partições, ajustar tamanhos de partição ou alterar os critérios de particionamento.

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

Risco: o particionamento apresenta alguns problemas potenciais que precisam ser considerados e resolvidos, incluindo:

  • Distorção de dados: o particionamento pode levar à distorção de dados, em que determinadas 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 poderá exigir coordenação extra e comunicação entre partições, levando a uma latência maior.

Facilitaçã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 dão suporte ao dimensionamento automático ou a outras opções de escala in-loco. Alguns recursos dão 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 a ser alertada para alterações.

O Azure Monitor permite monitorar 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, em Serviço de Kubernetes do Azure (AKS), você pode usar o Monitor para habilitar o HPA (dimensionamento automático de pod horizontal) e o dimensionamento automático do 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 se ajustar dinamicamente para atender à demanda.

Você também pode criar o 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 em métrica e podem executar ações usando Automação do Azure. A automação fornece uma plataforma para hospedar e executar o código do PowerShell e do Python no Azure, na nuvem e nos ambientes locais. Ele oferece recursos como a implantação de runbooks sob demanda ou em um agendamento, histórico de execução e registro em log, armazenamento integrado de segredos e integração de controle do código-fonte.

Projetando aplicativo para dimensionar: 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 estrita.

  • Usando tarefas em segundo plano: o Azure oferece serviços e diretrizes 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, Gateway de Aplicativo do Azure e Azure Load Balancer.

Particionamento de 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 entre 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.