Cuando el tráfico de lectura aumenta, un solo nodo principal se convierte en un cuello de botella. Los clústeres de PolarDB for PostgreSQL incluyen separación de lectura y escritura integrada mediante PolarProxy. Si se conecta a través de un endpoint de clúster configurado en el modo Read and Write (Automatic Read-write Splitting), el clúster dirige automáticamente las solicitudes de escritura al nodo principal y las de lectura a los nodos de solo lectura. No es necesario modificar la aplicación.
Casos de uso
Alto volumen de lectura: descargue las consultas analíticas, los trabajos de informes y las operaciones de búsqueda en los nodos de solo lectura. De esta forma, el nodo principal queda libre para las escrituras.
Escalado elástico: agregue nodos de solo lectura para aumentar el throughput de lectura sin modificar la aplicación ni las cadenas de conexión.
Lecturas consistentes dentro de una sesión: garantice que las lecturas de una misma sesión reflejen las escrituras más recientes, incluso cuando las solicitudes se distribuyen entre varios nodos.
Funcionamiento del enrutamiento
PolarProxy intercepta todo el tráfico que pasa por el endpoint de clúster y enruta cada solicitud según su tipo:
|
Tipo de solicitud |
Se enruta a |
|
Instrucciones de escritura (INSERT, UPDATE, DELETE, DDL) |
Nodo principal |
|
Instrucciones de lectura (SELECT) |
Nodo de solo lectura |
|
Instrucciones dentro de una transacción |
Nodo principal |
|
Funciones con operaciones de escritura o mixtas |
Nodo principal |
|
Funciones de solo lectura, incluidas las personalizadas |
Nodo de solo lectura |
|
Instrucciones PREPARE con operaciones de escritura y sus EXECUTE relacionados |
Solo al nodo principal |
|
Instrucciones PREPARE con operaciones de solo lectura |
Se transmiten a todos los nodos; EXECUTE se enruta según la carga |
PolarProxy se ejecuta como un componente nativo del clúster, no como un proxy externo. Por lo tanto, agrega menos latencia que las soluciones de middleware de terceros.
Consistencia de lectura en la sesión
Dentro de una sesión, PolarProxy selecciona un nodo según el progreso de sincronización de datos de cada uno. Así garantiza que las lecturas siempre reflejen las últimas escrituras confirmadas. El balanceo de carga entre nodos se reanuda conforme avanza la sesión.
Comprobaciones de estado de los nodos
PolarProxy supervisa continuamente todos los nodos. Si un nodo falla o su latencia supera el umbral configurado, PolarProxy deja de enviarle solicitudes de lectura. Luego redistribuye las solicitudes de escritura y lectura entre los nodos sanos. El clúster sigue accesible aunque un nodo de solo lectura deje de funcionar. Cuando el nodo se recupera, PolarProxy lo vuelve a agregar automáticamente al pool de enrutamiento.
Anulación del enrutamiento con sugerencias SQL
Agregue /*FORCE_MASTER*/ o /*FORCE_SLAVE*/ justo antes de una instrucción SQL para anular el enrutamiento predeterminado:
-- Default: routed to a read-only node
SELECT * FROM test;
-- Force to primary node
/*FORCE_MASTER*/ SELECT * FROM test;
-- Force to a read-only node
/*FORCE_SLAVE*/ SELECT * FROM test;
Limitaciones
Método de conexión no compatible:
No se admite la conexión mediante el método de modo de replicación a través del endpoint de clúster. Para configurar un clúster de dos nodos basado en una arquitectura de replicación principal/secundaria, use directamente el endpoint del nodo principal.
Recursos temporales creados por funciones:
Consultar una tabla temporal creada dentro de una función puede devolver un error que indica que la tabla no existe.
Si una función contiene una instrucción PREPARE, ejecutar la instrucción EXECUTE relacionada puede devolver un error que indica que el nombre de la instrucción PREPARE no existe.
Sintaxis no compatible:
No se admite usar el nombre de una tabla temporal para declarar el atributo %ROWTYPE. Por ejemplo:
CREATE TEMP TABLE fullname (first text, last text);
SELECT '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname;
Enrutamiento de transacciones:
Todas las instrucciones dentro de una transacción se enrutan al nodo principal. El balanceo de carga se reanuda cuando termina la transacción.
Configuración de un endpoint de clúster
Para crear un endpoint de clúster personalizado, consulte Configure PolarProxy.
Para modificar un endpoint de clúster existente, consulte Configure PolarProxy.
Una vez creado el endpoint de clúster, configúrelo en su aplicación para habilitar la separación automática de lectura y escritura. No se requieren más cambios en la aplicación.
Siguientes pasos
Transaction splitting: controle cómo se distribuyen las transacciones entre los nodos.
Consistency levels: configure la garantía de consistencia para su carga de trabajo.
Referencia de API
|
API |
Descripción |
|
Crea un endpoint público para un clúster de PolarDB |
|
|
Consulta la información de los endpoints de un clúster de PolarDB |
|
|
Modifica la configuración de un endpoint de clúster |
|
|
Modifica un endpoint de un clúster de PolarDB |
|
|
Libera el endpoint público del endpoint principal, del endpoint de clúster predeterminado o de un endpoint de clúster personalizado de un clúster de PolarDB |