Com o read/write splitting ativado, as requisições de leitura são distribuídas para instâncias somente leitura que replicam dados de forma assíncrona a partir da instância primária. Isso significa que uma leitura imediatamente após uma escrita pode retornar dados desatualizados. Os níveis de consistência controlam como o database proxy equilibra a atualidade das leituras em relação ao desempenho.
O ApsaraDB RDS for MySQL oferece suporte a três níveis de consistência para endpoints de database proxy no modo de read/write splitting: consistência eventual, consistência de sessão e consistência global.
O nível de consistência padrão é a consistência eventual. Se sua aplicação exige garantias de leitura após escrita, defina explicitamente um nível de consistência mais alto.
Como funciona
O database proxy utiliza replicação via binary log (binlog) para manter as instâncias somente leitura sincronizadas com a instância primária. Cada transação confirmada gera um evento de binlog que as instâncias somente leitura aplicam. A posição dos dados em cada instância somente leitura é rastreada por meio de um identificador global de transação (GTID) — especificamente a variável Executed_Gtid_Set, que registra o conjunto de transações aplicadas naquela instância.
Para a consistência de sessão e a consistência global, o proxy utiliza o rastreamento de GTID para rotear leituras apenas para instâncias somente leitura que já aplicaram as transações necessárias. Se nenhuma instância somente leitura atender ao requisito de GTID dentro do período de timeout de consistência de leitura (padrão: 10 ms), a requisição é redirecionada para a instância primária.
Níveis de consistência
Eventual consistency (default)
As requisições de leitura são encaminhadas diretamente para instâncias somente leitura, desde que a replicação via binlog não seja interrompida. Como a replicação de binlog é assíncrona, uma instância somente leitura pode não refletir ainda as últimas escritas da instância primária.
Exemplo: Considere as seguintes instruções em uma sessão:
SET AUTOCOMMIT = 1;
INSERT INTO t1(id, price) VALUES (111, 96);
UPDATE t1 SET price = 100 WHERE id = 111;
SELECT price FROM t1;
O SELECT pode retornar 96 em vez de 100 se o atraso de replicação fizer com que a atualização ainda não seja visível na instância somente leitura. A consulta não aguarda.
Quando usar: sua carga de trabalho não é sensível à consistência de leitura após escrita e a prioridade é maximizar a efetividade do read/write splitting.
Session consistency
O database proxy registra o GTID da transação confirmada mais recentemente na sessão atual. Antes de rotear uma leitura, ele verifica se a instância somente leitura de destino já aplicou as transações até aquele GTID. Isso garante que, dentro de uma sessão, as leituras sempre reflitam as próprias escritas da sessão.
Exemplo: Com as mesmas instruções acima, o SELECT aguarda até que a instância somente leitura aplique o UPDATE e então retorna 100.
Quando usar: existem dependências de consistência dentro de uma sessão. Este nível tem impacto moderado no desempenho e é adequado para a maioria das cargas de trabalho em produção.
Global consistency
O database proxy registra o GTID da transação confirmada mais recentemente em todo o cluster antes de cada leitura. As leituras são roteadas apenas para instâncias somente leitura que já aplicaram todas as transações até aquele ponto, garantindo que todas as sessões vejam uma visão consistente do banco de dados.
Exemplo: Cada SELECT aguarda que as alterações de dados necessárias fiquem visíveis na instância somente leitura antes de ser executado. O tempo de espera varia conforme o atraso de replicação.
Se a replicação ficar para trás, mais leituras são redirecionadas para a instância primária, aumentando sua carga e latência.
Quando usar: existem dependências de consistência entre sessões e sua carga de trabalho tem significativamente mais leituras do que escritas.
Escolha um nível de consistência
Para a maioria das cargas de trabalho, use a consistência de sessão. Ela fornece consistência de leitura após escrita dentro da sessão com overhead mínimo.
|
Nível de consistência |
Impacto no desempenho do read/write splitting |
Força da consistência |
Escopo da consistência |
|
Consistência eventual |
Nenhum |
Baixa |
Consistência do resultado final |
|
Consistência de sessão |
Médio |
Média |
Dentro de uma sessão |
|
Consistência global |
Alto |
Alta |
Entre todas as sessões |
Use a consistência global apenas se sua aplicação exige garantias de leitura após escrita entre sessões e tem significativamente mais leituras do que escritas. A consistência global adiciona latência a cada operação de leitura.
Pré-requisitos
Antes de começar, verifique se:
O database proxy está ativado e executando a versão 2.25.1 ou posterior. Consulte Enable the database proxy feature e Release notes for the database proxy version.
O atributo do endpoint do database proxy esteja definido como Read/Write (Read/Write Splitting). Consulte Configure the read and write attributes and the read weight.
A instância RDS execute MySQL 5.7 (versão secundária do engine 20210630 ou posterior) ou MySQL 8.0 (versão secundária do engine 20210930 ou posterior).
Notas de uso
Para a consistência de sessão e a consistência global, o proxy aguarda as instâncias somente leitura alcançarem a posição de GTID necessária antes de rotear uma leitura. Isso aumenta a latência de leitura. O tempo máximo de espera equivale ao período de timeout de consistência de leitura (padrão: 10 ms).
Quando a consistência global está em uso e ocorre atraso de replicação, o proxy redireciona mais leituras para a instância primária, aumentando ainda mais sua carga e latência.
Configure o nível de consistência
Acesse a página Instances. Na barra de navegação superior, selecione a região onde sua instância RDS reside e clique em no ID da instância.
No painel de navegação à esquerda, clique em Database Proxy.
Na seção Connection Information, localize o endpoint do database proxy e clique em Modify Configuration na coluna Actions.
Selecione um nível de consistência.
Para a consistência eventual e a consistência de sessão, é possível definir um limiar de latência. O padrão é 30 segundos. Se uma instância somente leitura ultrapassar esse limiar, o proxy para de rotear leituras para ela.
Para a consistência de sessão e a consistência global, é possível definir um read consistency timeout period . O padrão é 10 ms.
Apêndice: implementação da consistência de sessão e da consistência global
Para implementar a consistência de sessão e a consistência global, o database proxy monitora o valor de Executed_Gtid_Set em cada instância somente leitura — o conjunto de transações que aquela instância já aplicou.
Antes de rotear cada leitura, o proxy determina o GTID necessário e seleciona uma instância somente leitura que já tenha atingido essa posição. Se nenhuma instância alcançar esse ponto dentro do período de timeout de consistência de leitura, a requisição é redirecionada para a instância primária.
O GTID necessário varia conforme o nível de consistência:
Consistência de sessão: o GTID da transação confirmada mais recentemente na sessão atual.
Consistência global: o GTID da transação confirmada mais recentemente em todo o cluster.
Referência de API
|
Operação |
Descrição |
|
Consulta as configurações detalhadas do database proxy de uma instância RDS. |
|
|
Consulta informações sobre um endpoint de database proxy. |
|
|
Modifica as configurações de conexão de um endpoint de database proxy. |