O atributo de leitura/gravação e o peso de leitura de um endpoint de proxy de banco de dados para ApsaraDB RDS for MySQL determinam como as requisições são processadas. Ajuste essas configurações para atender às necessidades do seu negócio. Este tópico explica a lógica de processamento dos atributos de leitura/gravação e fornece instruções sobre como configure-los e seus respectivos pesos de leitura, usando o console do ApsaraDB RDS e chamando operações de API.
Pré-requisitos
-
Sua instância deve ser da edição High-availability Edition ou Cluster Edition.
NotaHigh-availability Edition: Crie instâncias somente leitura do ApsaraDB RDS for MySQL para implementar a separação de leitura/gravação.
Cluster Edition: Use diretamente os nós primário e secundário da instância para implementar a separação de leitura/gravação.
Atributos de leitura/gravação
O atributo de leitura/gravação pode ser definido como Read/Write ou Read-only.
-
Read/Write: Use este modo para ative a separação de leitura/gravação e dimensionar seus serviços de forma linear.
Neste modo, a política de acesso do endpoint do proxy de banco de dados (anteriormente conhecido como terminal de proxy) deve incluir pelo menos uma instância primária e uma instância somente leitura. Todas as requisições de gravação são enviadas à instância primária. Este modo oferece suporte a recursos de separação de leitura/gravação, como divisão de transações e pool de conexões.
-
Read-only: Indicado para cargas de trabalho somente leitura, como geração de relatórios.
Neste modo, a política de acesso do endpoint do proxy de banco de dados deve incluir pelo menos uma instância somente leitura. A instância primária não participa do roteamento de requisições e a divisão de transações não é compatível.
Quando o atributo de leitura/gravação de uma política de acesso de endpoint do proxy de banco de dados é definido como Read-only, o ApsaraDB RDS distribui as conexões em round-robin entre as instâncias somente leitura especificadas na política de acesso do endpoint. Cada conexão de cliente é mapeada para uma conexão em uma única instância somente leitura. A instância primária não participa dessa distribuição. O número total de conexões disponíveis é a soma das conexões de todas as instâncias somente leitura configuradas.
Para uma instância ApsaraDB RDS for MySQL Cluster Edition, se o atributo de leitura/gravação for definido como Read/Write, as requisições de gravação serão enviadas somente ao nó primário. Se o atributo for definido como Read-only, o nó primário não participa do roteamento, e o ApsaraDB RDS distribui as conexões em round-robin para os nós secundários especificados na política de acesso do endpoint.
A lista de permissões de IP do proxy de banco de dados é sincronizada com a lista de permissões de IP da instância primária.
Para evitar um ponto único de falha, crie pelo menos duas instâncias somente leitura para uma instância primária e distribua-as em diferentes zonas de disponibilidade. Para reduzir a latência de rede causada por acesso entre zonas, ative o recurso de acesso mais próximo. Para mais informações, consulte Configure o acesso mais próximo.
Lógica de processamento dos atributos de leitura/gravação
|
Atributo de leitura/gravação |
Método de distribuição de peso |
Peso de leitura da instância primária |
Operação normal |
Última instância somente leitura excluída |
Todas as instâncias somente leitura com falha |
|
Read-only |
distribuição automática ou personalizada |
O peso de leitura da instância primária não pode ser definido. |
|
|
|
|
Read/Write |
distribuição automática |
Igual a 0 Para mais informações, consulte Regras padrão de distribuição de peso de leitura. |
|
|
|
|
personalizado |
Maior que 0 |
|
|
|
|
|
Igual a 0 |
|
|
|
Sem encaminhamento: no modo Read-only, a instância primária não participa do encaminhamento de requisições de leitura.
Erro de conexão: no modo Read-only, se a política de acesso ao proxy não permitir leitura nem gravação, as conexões falham com erro.
No modo Read/Write, quando o peso de leitura da instância primária é definido como 0, as requisições de leitura não são encaminhadas à instância primária por padrão. Contudo, serão encaminhadas à instância primária se todas as instâncias somente leitura ficarem indisponíveis, se um hint forçar o roteamento ou se a divisão de transações estiver ativada.
Impacto das alterações de peso nas operações
Para visualize a versão secundária do motor do proxy de banco de dados, consulte Visualizar a versão secundária do motor do proxy de banco de dados. Para atualizar a versão secundária do motor, consulte Atualizar a versão secundária do motor do proxy de banco de dados.
|
Ação |
Versão do motor 2.8.41 ou posterior |
Versão do motor anterior à 2.8.41 |
|
Ao iniciar uma nova sessão, ela se conecta a um nó com peso de leitura igual a 0? |
Não |
Não |
|
Se o peso de leitura de um nó for alterado de um valor diferente de zero para 0, o nó é removido das sessões existentes? |
Não |
Não |
|
Se o peso de leitura de um nó for alterado de um valor diferente de zero para 0, as requisições nas sessões existentes são roteadas com base no novo peso? |
Não |
|
|
Se o peso de leitura de um nó for alterado de 0 para um valor diferente de zero, o nó é adicionado às sessões existentes? |
Não |
Sim |
|
Se o peso de leitura de um nó for alterado de 0 para um valor diferente de zero, as requisições nas sessões existentes são roteadas com base no novo peso? |
Não |
|
|
Remover um nó somente leitura com peso de leitura diferente de zero causa uma conexão transitória nas sessões existentes? |
Não Nota
Embora as versões do proxy de banco de dados da série 2.x ofereçam o mecanismo |
Sim |
|
Remover um nó somente leitura com peso de leitura igual a 0 causa uma conexão transitória nas sessões existentes? |
Não |
Uma conexão transitória ocorre somente se o nó estiver processando requisições ativas. |
|
Ao encerrar uma conexão em um nó somente leitura com peso de leitura igual a 0, a conexão é terminada? |
Sim |
Para versões do proxy de banco de dados da série 1.x, a conexão é terminada se o número de sessões ativas (active_session) não cair para 0. Caso contrário, a conexão não é terminada e a conexão encerrada é reestabelecida automaticamente. |
|
Ao encerrar uma conexão em um nó somente leitura com peso de leitura diferente de zero, a conexão é terminada? |
Algoritmos de balanceamento de carga
Versões anteriores à 2.25.4: apenas o balanceamento de carga baseado em peso é compatível.
As versões 2.25.4 e posteriores adicionam suporte ao balanceamento de carga baseado no número de requisições ativas. As duas políticas de roteamento a seguir são compatíveis:
Balanceamento de carga baseado no número de requisições ativas (versão 2.25.4 e posteriores)
Balanceamento de carga baseado em peso (todas as versões)
Recomendamos o balanceamento de carga baseado no número de requisições ativas, pois oferece melhor desempenho em picos e reduz o impacto de uma falha em um único nó sobre todo o cluster.
Balanceamento de carga baseado em peso
As requisições de leitura são distribuídas com base na proporção de peso dos nós. Este método utiliza um algoritmo de round-robin ponderado suave e o valor current_weight de cada nó para distribuir as requisições de leitura conforme seus pesos. O processo é o seguinte:
Regra de seleção: em cada rodada de agendamento, o nó com o maior valor de
current_weighté selecionado. Se vários nós tiverem o mesmo peso mais alto, o nó que aparece primeiro na lista de configuração tem prioridade.Acumulação de peso: após cada rodada de agendamento, o valor de
current_weightde cada nó aumenta pelo seu próprio peso atribuído.Redefinição de peso: se um nó for selecionado, seu
current_weighté reduzido pela soma dos pesos de todos os nós.
Exemplo:
O peso de leitura do nó primário é 100, o peso de leitura do nó somente leitura 1 é 200 e o peso de leitura do nó somente leitura 2 é 200.
|
Rodada |
current_weight do nó primário |
current_weight do nó somente leitura 1 |
current_weight do nó somente leitura 2 |
Nó roteado |
|
1 |
0 |
0 |
0 |
Primary node |
|
2 |
-400 |
200 |
200 |
Read-only node 1 |
|
3 |
-300 |
-100 |
400 |
Read-only node 2 |
|
4 |
-200 |
100 |
100 |
Read-only node 1 |
|
5 |
-100 |
-200 |
300 |
Read-only node 2 |
|
6 |
0 |
0 |
0 |
Primary node |
Balanceamento de carga baseado no número de requisições ativas
As requisições são priorizadas para os nós com menor carga. A regra é rotear requisições para o nó com o menor valor de (Number of active requests / Node weight).
Exemplo:
O peso de leitura do nó primário é 100, o peso de leitura do nó somente leitura 1 é 200 e o peso de leitura do nó somente leitura 2 é 200.
|
Rodada |
Requisições ativas no nó primário |
Requisições ativas no nó somente leitura 1 |
Requisições ativas no nó somente leitura 2 |
Nó roteado |
|
1 |
1
|
5
|
6
|
Primary node |
|
2 |
2 |
4 |
6 |
Read-only node 1 |
|
3 |
2 |
5 |
3 |
Read-only node 2 |
|
4 |
1 |
2 |
3 |
Read-only node 1 |
|
5 |
1 |
2 |
1 |
Read-only node 2 |
|
6 |
0 |
3 |
3 |
Primary node |
Procedimento
Acesse a página RDS Instances, selecione uma região na barra de navegação superior e clique em no ID da instância de destino.
No painel de navegação à esquerda, clique em Database Proxy.
Na seção Connection Information, localize o endpoint do proxy de banco de dados de destino e clique em Modify Configuration na coluna Actions.
Na caixa de diálogo exibida, ao lado de Read/Write Attributes, selecione Read/Write (Read/Write Splitting) ou Read-only (Primary Instance Not Connected to Receive Write Requests).
-
Na seção Read Weight Allocation, selecione Automatic ou Custom.
Automatic: O sistema distribui automaticamente um peso de leitura para cada instância com base em suas especificações. Novas instâncias somente leitura adicionadas à instância primária recebem automaticamente um peso de leitura conforme a regra de distribuição do sistema e são incluídas na configuração de separação de leitura/gravação.
Custom: Defina manualmente um peso de leitura para cada instância. O valor deve estar no intervalo de 0 a 10.000. Novas instâncias somente leitura têm peso de leitura padrão igual a 0 e precisam ser configuradas manualmente.
O recurso de acesso mais próximo garante que as requisições sejam encaminhadas do aplicativo ao proxy de banco de dados. A configuração de peso de leitura garante que as requisições sejam encaminhadas do proxy de banco de dados aos bancos de dados de backend, sem interferência do recurso de acesso mais próximo. Use os dois recursos em conjunto para minimizar a latência de acesso.
Quanto maior o peso de leitura de uma instância, mais requisições de leitura ela processa. Por exemplo, considere uma instância primária com três instâncias somente leitura cujos pesos de leitura são 0, 100, 200 e 200, respectivamente. Isso indica que a instância primária não processa requisições de leitura (as requisições de gravação ainda são enviadas automaticamente à instância primária). As três instâncias somente leitura processam requisições de leitura na proporção de 1:2:2.
Ao excluir uma instância somente leitura, seu peso de leitura é removido automaticamente, enquanto os pesos das demais instâncias permanecem inalterados.
Não é possível defina um peso de leitura para uma instância que tenha um atraso de replicação configurado.
A alteração entra em vigor imediatamente e não causa interrupções de serviço. O impacto dos novos pesos nas conexões existentes, porém, depende da versão do motor do proxy de banco de dados. Para mais detalhes, consulte a seção "Impacto das alterações de peso nas operações".
APIs relacionadas
|
API |
Descrição |
|
Consulta os detalhes do proxy de banco de dados de uma instância rds. |
|
|
Consulta a configuração de um endpoint do proxy de banco de dados de uma instância ApsaraDB RDS. |
|
|
Modifique a configuração de um endpoint do proxy de banco de dados de uma instância ApsaraDB RDS. |
Apêndice 1: Rotear instruções SQL com hints
Além de usar o sistema de distribuição de peso de separação de leitura/gravação, você pode usar hints de SQL para rotear instruções SQL específicas para as instâncias primária e somente leitura de uma instância High-availability Edition, ou para os nós primário e secundário de uma instância Cluster Edition.
Os seguintes formatos de hint são compatíveis com a separação de leitura/gravação do ApsaraDB RDS:
Para instâncias ApsaraDB RDS for MySQL High-availability Edition:
/*FORCE_MASTER*/: Roteia a instrução SQL subsequente para a instância primária./*FORCE_SLAVE*/: Roteia a instrução SQL subsequente para uma instância somente leitura.
Para instâncias ApsaraDB RDS for MySQL Cluster Edition:
/*FORCE_MASTER*/: Roteia a instrução SQL subsequente para o nó primário./*FORCE_SLAVE*/: Roteia a instrução SQL subsequente para um nó secundário.
Para uma instância ApsaraDB RDS for MySQL High-availability Edition, ao usar o hint /FORCE_MASTER/, a instrução SQL é roteada para a instância primária mesmo que o peso de leitura da instância primária seja 0.
Para uma instância ApsaraDB RDS for MySQL Cluster Edition, ao usar o hint /FORCE_MASTER/, a instrução SQL é roteada para o nó primário mesmo que o peso de leitura do nó primário seja 0.
Por exemplo, para uma instância ApsaraDB RDS for MySQL High-availability Edition, ao adicionar o hint no início da instrução a seguir, ela é roteada para a instância primária independentemente das configurações de peso de leitura.
/*FORCE_MASTER*/ SELECT * FROM table_name;
Apêndice 2: Retirar uma instância somente leitura do ar sem interrupção
Suponha que você tenha um ambiente de separação de leitura/gravação composto por uma instância primária A e duas instâncias somente leitura B e C. Para retirar a instância somente leitura C do ar sem interrupção de serviço, siga estas etapas:
Acesse a página RDS Instances, selecione uma região e clique em no ID da instância A.
No painel de navegação à esquerda, clique em Database Proxy. Na seção Connection Topology Management, clique em Modify Configuration.
-
Na caixa de diálogo Modify Proxy Endpoint (Terminal) Configuration, defina o peso de leitura da instância somente leitura C como 0.
Selecione Custom para o método de distribuição de peso de leitura e defina o peso de leitura da instância somente leitura C como
0. -
Na página Monitoring and Alerts da instância somente leitura C, monitore o gráfico Session Connection e aguarde a métrica
active_sessioncair para 0.NotaVerifique apenas se
active_sessioné igual a 0. Se o valor não cair para 0 após um longo período, encerre as sessões manualmente. Na guia Database Proxy da instância primária A, remova a instância somente leitura C do endpoint do proxy de banco de dados.