Cada endpoint del proxy de base de datos de ApsaraDB RDS for MySQL cuenta con dos ajustes que controlan el enrutamiento del tráfico SQL: un read/write attribute (qué nodos procesan las escrituras frente a las lecturas) y un peso de lectura (cómo se distribuye el tráfico de lectura entre esos nodos). Una configuración correcta le permite escalar el throughput de lectura, aislar cargas de trabajo de reportes y ejecutar mantenimientos de forma segura sin interrumpir el servicio.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Enabled the database proxy para su instancia de RDS
-
Una instancia que ejecute High-availability Edition o Cluster Edition
High-availability Edition: Create at least one read-only instance para habilitar la división de lectura y escritura
Cluster Edition: los nodos primario y secundario gestionan la división de lectura y escritura de forma nativa
Atributos de lectura y escritura
Elegir un modo
|
Mode |
Best for |
Write requests |
Read requests |
|
Read/Write |
Escalar el throughput de lectura entre instancias primarias y de solo lectura |
Siempre se enruta a la instancia primaria |
Se distribuye entre los nodos configurados según el peso |
|
Read-only |
Aislar cargas de trabajo de solo lectura, como los reportes |
No se aceptan; los clientes reciben un error de conexión |
Se distribuye entre las instancias de solo lectura mediante round-robin |
El modo Read/Write requiere como mínimo una instancia primaria y una de solo lectura en la directiva de acceso del proxy. Es compatible con transaction splitting y connection pools.
El modo Read-only requiere como mínimo una instancia de solo lectura. La instancia primaria no participa en el enrutamiento y no se admite la división de transacciones. Cada conexión de cliente se asigna a una única conexión en una instancia de solo lectura. La capacidad total de conexiones equivale a la suma de las conexiones de todas las instancias de solo lectura configuradas.
En las instancias de Cluster Edition, el modo Read/Write envía las escrituras únicamente al nodo primario, mientras que el modo Read-only enruta las lecturas a los nodos secundarios mediante round-robin. La lista de permitidos de IP del proxy de base de datos se sincroniza automáticamente con la lista de permitidos de la instancia primaria.
Comportamiento de enrutamiento en casos extremos
La tabla a continuación muestra qué ocurre en el modo Read/Write cuando las instancias de solo lectura no están disponibles, así como en el modo Read-only bajo todos los escenarios de peso.
|
Mode |
Weight method |
Primary weight |
Normal operation |
Last read-only instance deleted |
All read-only instances fail |
|
Read-only |
Asignado por el sistema o Custom |
No se puede establecer |
Primaria: sin lecturas ni escrituras (sin reenvío). Proxy: legible, no escribible |
Primaria: sin lecturas ni escrituras. Proxy: error de conexión |
Primaria: sin lecturas ni escrituras. Proxy: error de conexión |
|
Read/Write |
Asignado por el sistema |
0 (predeterminado) |
Primaria: solo escrituras, sin lecturas. Proxy: lecturas y escrituras |
Primaria: lecturas y escrituras. Proxy: lecturas y escrituras |
Primaria: lecturas y escrituras. Proxy: lecturas y escrituras |
|
Read/Write |
Custom |
Mayor que 0 |
Primaria: lecturas y escrituras. Proxy: lecturas y escrituras |
Primaria: lecturas y escrituras. Proxy: lecturas y escrituras |
Primaria: lecturas y escrituras. Proxy: lecturas y escrituras |
|
Read/Write |
Custom |
0 |
Primaria: solo escrituras, sin lecturas. Proxy: lecturas y escrituras |
Primaria: lecturas y escrituras. Proxy: lecturas y escrituras |
Primaria: lecturas y escrituras. Proxy: lecturas y escrituras |
En el modo Read-only, "sin reenvío" significa que la instancia primaria no acepta solicitudes de lectura. Si el proxy no cuenta con instancias legibles, los clientes reciben un error de conexión.
En el modo Read/Write con el peso de la instancia primaria establecido en 0, las lecturas no se envían a dicha instancia de manera predeterminada. Solo se enrutan ahí si un nodo de solo lectura presenta errores, si un hint fuerza el enrutamiento hacia él o si la división de transacciones está habilitada.
Algoritmos de balanceo de carga
El proxy es compatible con dos algoritmos para distribuir las solicitudes de lectura entre los nodos.
Versiones anteriores a la 2.25.4: solo está disponible el balanceo de carga basado en pesos.
Versiones 2.25.4 y posteriores: ambos algoritmos están disponibles. Utilice el balanceo de carga basado en solicitudes activas, a menos que tenga un motivo específico para preferir la distribución estricta por pesos. Este método ofrece un mejor rendimiento máximo en los clústeres y reduce el impacto ante el fallo de un solo nodo.
Balanceo de carga basado en solicitudes activas (recomendado)
Enruta cada solicitud al nodo con la proporción (Active Requests / Node Weight) más baja. Se adapta en tiempo real a cargas desiguales y resulta menos afectado por los nodos lentos.
Ejemplo con un peso de 100 para la instancia primaria, 200 para el nodo de solo lectura 1 y 200 para el nodo de solo lectura 2:
|
Round |
Primary active requests |
Read-only node 1 active requests |
Read-only node 2 active requests |
Routed to |
|
1 |
1 (proporción: 0.01) |
5 (proporción: 0.025) |
6 (proporción: 0.03) |
Nodo primario |
|
2 |
2 |
4 |
6 |
Nodo de solo lectura 1 |
|
3 |
2 |
5 |
3 |
Nodo de solo lectura 2 |
|
4 |
1 |
2 |
3 |
Nodo de solo lectura 1 |
|
5 |
1 |
2 |
1 |
Nodo de solo lectura 2 |
|
6 |
0 |
3 |
3 |
Nodo primario |
Balanceo de carga basado en pesos
Distribuye las solicitudes de lectura de forma estricta según la proporción de pesos mediante un algoritmo round-robin. En cada ronda de programación se selecciona el nodo con el valor current_weight más alto y luego se ajustan los pesos de la siguiente manera:
Selección: se elige el nodo con el valor
current_weightmás alto. Los empates se resuelven según la posición en la lista de configuración.Acumulación: después de cada ronda, el valor
current_weightde cada nodo aumenta según su propio peso.Restablecimiento: el valor
current_weightdel nodo seleccionado se reduce en la suma de los pesos de todos los nodos.
Ejemplo con un peso de 100 para la instancia primaria, 200 para el nodo de solo lectura 1 y 200 para el nodo de solo lectura 2:
|
Round |
Primary |
Read-only node 1 |
Read-only node 2 |
Routed to |
|
1 |
0 |
0 |
0 |
Nodo primario |
|
2 |
−400 |
200 |
200 |
Nodo de solo lectura 1 |
|
3 |
−300 |
−100 |
400 |
Nodo de solo lectura 2 |
|
4 |
−200 |
100 |
100 |
Nodo de solo lectura 1 |
|
5 |
−100 |
−200 |
300 |
Nodo de solo lectura 2 |
|
6 |
0 |
0 |
0 |
Nodo primario |
Configurar los atributos de lectura/escritura y los pesos de lectura
Vaya a la página RDS Instances. En la barra de navegación superior, seleccione una región y haga clic en el ID de la instancia de destino.
En el panel de navegación izquierdo, haga clic en Database Proxy.
En la sección Connection Information, busque el endpoint del proxy de destino y haga clic en Modify Configuration dentro de la columna Actions.
-
En el cuadro de diálogo, establezca Read/Write Attributes en una de las opciones siguientes:
Read/Write (Read/Write Splitting)
Read-only (Primary Instance Not Connected to Receive Write Requests)
-
En la sección Read Weight Allocation, elija un método de ponderación:
Method
Behavior
When to use
Automatic Distribution
El sistema asigna los pesos según el tipo de instancia. Las nuevas instancias de solo lectura se incluyen automáticamente con system-assigned weights, por lo que no se requiere ninguna actualización manual.
Clústeres homogéneos donde la capacidad de las instancias es similar
Custom
Establezca un peso explícito (de 0 a 10,000) para cada instancia. Las nuevas instancias de solo lectura adoptan 0 de forma predeterminada y deben configurarse manualmente.
Clústeres heterogéneos donde necesita un control preciso sobre la distribución del tráfico
Cómo funcionan los pesos: un peso mayor implica más solicitudes de lectura. Por ejemplo, si la instancia primaria tiene un peso de 0 y tres instancias de solo lectura tienen pesos de 100, 200 y 200, las lecturas se distribuyen en una proporción de 1:2:2. La instancia primaria sigue recibiendo todas las escrituras.
El peso de lectura controla cómo el proxy distribuye las lecturas hacia las bases de datos del backend y es independiente de la función nearest access. Utilice ambas en conjunto para minimizar la latencia.
No se puede establecer el peso de las instancias que tengan un replication delay configurado.
Al eliminar una instancia de solo lectura, se quita su peso automáticamente. Los pesos de las demás instancias permanecen sin cambios.
Los cambios de peso surten efecto de inmediato sin interrumpir el servicio. Las conexiones existentes no se desconectan; tanto las nuevas como las actuales se enrutan según los pesos actualizados.
Antes de quitar una instancia de solo lectura del proxy: primero establezca su peso en 0, espere a que finalicen las sesiones activas y luego elimínela. Consulte Dar de baja una instancia de solo lectura sin interrumpir el servicio para conocer el procedimiento completo.
Efecto de los cambios de peso en las sesiones existentes
El comportamiento de los cambios de peso sobre las sesiones activas depende de la versión del motor del proxy de base de datos. Para comprobar o actualizar su versión, consulte View the minor engine version of a database proxy y Upgrade the minor engine version of a database proxy.
|
Scenario |
Engine version 2.8.41 and later |
Earlier than 2.8.41 |
|
¿Una nueva sesión se conecta a un nodo con peso 0? |
No |
No |
|
Peso cambiado de distinto de cero a 0: ¿se elimina el nodo de las sesiones existentes? |
No |
No |
|
Peso cambiado de distinto de cero a 0: ¿las sesiones existentes se enrutan con el nuevo peso? |
No |
Protocolo PS (Prepared Statement): No. Protocolo basado en texto: Sí |
|
Peso cambiado de 0 a distinto de cero: ¿se añade el nodo a las sesiones existentes? |
No |
Sí |
|
Peso cambiado de 0 a distinto de cero: ¿las sesiones existentes se enrutan con el nuevo peso? |
No |
Protocolo PS: No. Protocolo basado en texto: Sí |
|
¿Quitar un nodo de solo lectura con peso distinto de cero genera conexiones transitorias? |
No. El proxy cuenta con un mecanismo |
Sí |
|
¿Quitar un nodo de solo lectura con peso 0 genera conexiones transitorias? |
No |
Sí, si hay solicitudes ejecutándose en ese nodo al momento de quitarlo; de lo contrario, No |
|
Al finalizar una conexión en un nodo de solo lectura con peso 0: ¿se termina la conexión? |
Sí |
Proxy 1.x: se termina solo si existen sesiones activas; de lo contrario, la conexión no se finaliza y se restablece automáticamente |
|
Al finalizar una conexión en un nodo de solo lectura con peso distinto de cero: ¿se termina la conexión? |
— |
— |
Mejores prácticas
Dar de baja una instancia de solo lectura sin interrumpir el servicio
Para quitar una instancia de solo lectura (por ejemplo, la instancia C en un clúster con la instancia primaria A y las instancias de solo lectura B y C) sin afectar el tráfico, siga estos pasos:
Vaya a la página RDS Instances, seleccione la región y haga clic en el ID de la instancia primaria A.
En el panel de navegación izquierdo, haga clic en Database Proxy. Dentro de la sección Connection Topology Management, haga clic en Modify Configuration.
En el cuadro de diálogo Modify Proxy Endpoint (Terminal) Configuration, establezca el peso de lectura del nodo de solo lectura C en 0.
-
Vaya a la página Monitoring and Alerts de la instancia de solo lectura C. En la sección Session Connection, supervise la métrica
active_sessiony espere a que disminuya hasta 0.Si
active_sessionno llega a 0 después de un tiempo de espera razonable, finalice las sesiones restantes de forma manual. En la pestaña Database Proxy de la instancia primaria A, quite la instancia de solo lectura C del endpoint del proxy.
Enrutar instrucciones SQL específicas con hints
Utilice hints de SQL para forzar la ejecución de una instrucción en un nodo específico. Esto resulta útil para escrituras dentro de una sentencia SELECT o para consultas que siempre deben usar una instancia de solo lectura.
Instancias de High-availability Edition:
/*FORCE_MASTER*/: enruta la instrucción a la instancia primaria, incluso si su peso de lectura es 0/*FORCE_SLAVE*/: enruta la instrucción a una instancia de solo lectura
Instancias de Cluster Edition:
/*FORCE_MASTER*/: enruta la instrucción al nodo primario, incluso si su peso de lectura es 0/*FORCE_SLAVE*/: enruta la instrucción a un nodo secundario
Agregue el hint al inicio de la instrucción:
/*FORCE_MASTER*/ SELECT * FROM table_name;
Reducir la latencia entre zonas
Para evitar un punto único de fallo, cree como mínimo dos instancias de solo lectura para una instancia primaria y despliéguelas en distintas zonas. Habilite la función nearest access para minimizar la latencia de red generada por el tráfico entre zonas. La función de acceso más cercano controla cómo su aplicación se conecta al proxy, mientras que los pesos de lectura determinan cómo el proxy enruta las solicitudes a las bases de datos del backend. Configure ambas en conjunto para obtener un rendimiento óptimo.
Preguntas frecuentes
¿La instancia primaria sigue siendo legible después de agregar instancias de solo lectura?
Después de agregar instancias de solo lectura, la instancia primaria permanece disponible para lectura y escritura en todo momento. Esta acción no afecta su capacidad de lectura ni de escritura.
La instancia primaria cuenta con su propio endpoint de conexión directa. Dicho endpoint se conecta directamente a la instancia primaria sin pasar por el proxy de base de datos, por lo que esta siempre es legible y escribible a través de él, independientemente de la configuración de los pesos de lectura.
El endpoint del proxy de base de datos se utiliza para la división de lectura y escritura. Cuando se establece la conexión mediante este endpoint, las solicitudes de lectura y escritura se enrutan según los pesos de lectura configurados. Si el peso de lectura de la instancia primaria se establece en 0, el proxy no reenvía las solicitudes de lectura a dicha instancia de manera predeterminada. Sin embargo, la instancia primaria en sí sigue siendo legible y escribible a través de su endpoint de conexión directa. Cuando todas las instancias de solo lectura experimentan una latencia que supera el umbral o dejan de estar disponibles, las solicitudes de lectura se enrutan automáticamente de vuelta a la instancia primaria para garantizar la continuidad del negocio.
Para controlar el enrutamiento de lectura y escritura a través del endpoint del proxy, ajuste los pesos de lectura en la configuración de Database Proxy.
Referencia de API
|
API operation |
Description |
|
Consultar los detalles del proxy de base de datos de una instancia de RDS |
|
|
Consultar la directiva de acceso de un endpoint del proxy de base de datos |
|
|
Modificar la directiva de acceso de un endpoint del proxy de base de datos |
Pasos siguientes
Configure nearest access: reduzca la latencia al enrutar las conexiones de la aplicación al nodo de proxy más cercano
Use the transaction splitting feature: mejore el throughput de lectura en transacciones mixtas de lectura y escritura
Set the connection pool type: reduzca la sobrecarga de conexiones en cargas de trabajo de alta concurrencia
Default read weight allocation rules: comprenda cómo el sistema asigna los pesos en el modo Automatic Distribution