Si su negocio requiere enviar consultas OLAP y OLTP a la base de datos mediante la misma aplicación, establezca el modo Read/Write del endpoint del clúster y habilite la distribución automática de solicitudes. Una vez habilitada, el proxy de la base de datos utiliza el costo estimado de las consultas de las sentencias SQL entrantes para enrutar automáticamente las solicitudes y maximizar el rendimiento de las consultas. Cuando el costo de una consulta supera un umbral especificado, el proxy de la base de datos enruta automáticamente la solicitud a un nodo de almacenamiento en columnas de solo lectura. De lo contrario, un nodo de almacenamiento en filas de solo lectura o el nodo principal se encarga de la solicitud.
Funcionamiento
El proxy de la base de datos en PolarDB for MySQL usa el query cost estimado de una sentencia SQL para decidir su ruta. Al comparar este costo con un umbral configurable, el proxy enruta la solicitud a un nodo de almacenamiento en filas o en columnas, lo que optimiza el rendimiento de ambos.
Reglas de distribución de solicitudes:
Servicio OLTP: incluye solicitudes de lectura y escritura en la mayoría de los casos. El nodo principal procesa todas las solicitudes de escritura. Los nodos de almacenamiento en filas de solo lectura o el nodo principal procesan las solicitudes de lectura.
Servicio OLAP: incluye únicamente solicitudes de lectura en la mayoría de los casos. Los nodos de almacenamiento en columnas de solo lectura procesan todas las solicitudes de lectura.
Solución de distribución automática de solicitudes:
Distribución de solicitudes entre el nodo principal y los nodos de almacenamiento en columnas de solo lectura: el nodo principal puede procesar solicitudes de lectura OLTP porque también opera en modo de almacenamiento en filas. En esta solución, las solicitudes de escritura y las de lectura OLTP se distribuyen al nodo principal. Las solicitudes de lectura OLAP se distribuyen a los nodos de almacenamiento en columnas de solo lectura.
Distribución de solicitudes entre los nodos de almacenamiento en filas de solo lectura y los nodos de almacenamiento en columnas de solo lectura: en esta solución, las solicitudes de escritura se distribuyen al nodo principal. Las solicitudes de lectura OLTP se distribuyen a los nodos de almacenamiento en filas de solo lectura o al nodo principal. Por último, las solicitudes de lectura OLAP se distribuyen a los nodos de almacenamiento en columnas de solo lectura.

Límites
Los nodos de servicio deben incluir como mínimo un nodo de almacenamiento en columnas de solo lectura y un nodo de almacenamiento en filas (ya sea el nodo principal o un nodo de almacenamiento en filas de solo lectura).
Paso 1: Habilitar la distribución automática de solicitudes
Inicie sesión en la consola de PolarDB. En el panel de navegación izquierdo, haga clic en Clusters, seleccione la región donde está desplegado su clúster y luego haga clic en el ID del clúster.
En la página Basic Information, dentro de la sección PolarProxy, haga clic en Modify junto al endpoint del clúster de destino.
-
Seleccione un modo Read/Write según sus necesidades.
El modo de lectura y escritura del endpoint del clúster está configurado como Read/Write (Automatic Read/Write Splitting).
El modo de lectura y escritura del endpoint del clúster está configurado como Read-only y la directiva de balanceo de carga está configurada como Active requests-based load balancing.
-
En la configuración Node Settings, seleccione el nodo principal y los nodos de almacenamiento en filas y columnas de solo lectura. En la sección HTAP Optimization del lado derecho, habilite Transactional/Analytical Processing Splitting. Haga clic en OK.
NotaDebe seleccionar como mínimo un nodo de almacenamiento en columnas de solo lectura en la configuración Node Settings.
Después de habilitar Transactional/Analytical Processing Splitting, también debe create an IMCI para que la función surta efecto.
Tras habilitar Transactional/Analytical Processing Splitting, el cambio aplica únicamente a las conexiones nuevas. Las conexiones existentes no se ven afectadas; para aplicar el cambio, debe desconectarse y volver a conectarse.
Ejemplo 1: además del nodo principal, los nodos de servicio incluyen un nodo de almacenamiento en filas de solo lectura y dos nodos de almacenamiento en columnas de solo lectura. Si habilita la distribución automática de solicitudes:
Las solicitudes de escritura se enrutan al nodo principal.
Las solicitudes de lectura OLAP se enrutan a los nodos de almacenamiento en columnas de solo lectura.
Las solicitudes de lectura OLTP se enrutan al nodo de almacenamiento en filas de solo lectura. Si Primary Node Accepts Read Requests está configurado como Yes en Load Balancing Settings, el proxy también podría enrutar solicitudes al nodo principal.
Ejemplo 2: los nodos de servicio incluyen el nodo principal y un nodo de almacenamiento en columnas de solo lectura. Si habilita la distribución automática de solicitudes, las solicitudes de escritura y las de lectura OLTP se enrutan al nodo principal, mientras que las de lectura OLAP se enrutan al nodo de almacenamiento en columnas de solo lectura.
NotaEn el modo Read/Write (Automatic Read/Write Splitting), el proxy envía todas las solicitudes de escritura al nodo principal, sin importar si este está seleccionado como nodo de servicio.
Paso 2: Configurar el umbral de distribución
Una vez habilitada la distribución automática de solicitudes, debe establecer el umbral de query cost. El proxy de la base de datos utiliza este umbral para enrutar las solicitudes. Si el costo de la consulta de una solicitud supera el umbral, el proxy la enruta a un nodo de almacenamiento en columnas. De lo contrario, la enruta a un nodo de almacenamiento en filas.
Los parámetros de la siguiente tabla controlan el umbral de costo de consulta. Modifique estos valores en la página Parameters de su clúster para hacer un fine-tune de la distribución automática de solicitudes.
|
Parámetro |
Descripción |
|
loose_imci_ap_threshold |
Umbral de costo de consulta para enrutar sentencias SQL a nodos de almacenamiento en columnas. Valor predeterminado: 50000. Nota
Cuando se habilita la distribución automática de solicitudes, el proxy enruta las sentencias SQL con un costo de consulta mayor a 50000 hacia los nodos de almacenamiento en columnas. Importante
En las versiones 8.0.1.1.39, 8.0.2.2.23 y posteriores de PolarDB for MySQL, este parámetro está obsoleto. Utilice |
|
loose_cost_threshold_for_imci |
Umbral de costo de consulta utilizado en los nodos de almacenamiento en columnas para decidir si se usa un plan de ejecución de almacenamiento en columnas. Valor predeterminado: 50000. Nota
Una vez habilitada la distribución automática de solicitudes, si el costo de consulta de una sentencia SQL es mayor a 50000, el sistema selecciona un plan de ejecución de almacenamiento en columnas. De lo contrario, selecciona un plan de ejecución de almacenamiento en filas. |
Ejecute el comando SHOW STATUS LIKE 'Last_query_cost_for_imci' para comprobar el costo de consulta de la última sentencia SQL. Esta información le ayuda a ajustar los valores de los parámetros.
Si se conecta a la base de datos mediante un endpoint de clúster, debe agregar el hint /* ROUTE_TO_LAST_USED*/ antes del comando SHOW STATUS LIKE 'Last_query_cost_for_imci'. Esto garantiza que recupere el costo de consulta de la sentencia anterior desde el nodo correcto. Por ejemplo:
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost_for_imci';
Por ejemplo, ejecute la siguiente sentencia para consultar el costo de consulta de la sentencia SQL anterior:
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost_for_imci';
La salida es la siguiente:
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Last_query_cost_for_imci | 2 |
+--------------------------+-------+
1 row in set (0.01 sec)
El costo de consulta de la sentencia SQL es 2.
Para enrutar esta consulta SQL a un nodo de almacenamiento en columnas y ejecutarla allí, configure los valores de los parámetros de la siguiente manera:
-
Para las versiones 8.0.1.1.38, 8.0.2.2.22 y anteriores de PolarDB for MySQL
Establezca los parámetros loose_imci_ap_threshold y loose_cost_threshold_for_imci en 1.
-
Para las versiones 8.0.1.1.39, 8.0.2.2.23 y posteriores de PolarDB for MySQL
Establezca el parámetro loose_cost_threshold_for_imci en 1.
Forzar planes de ejecución con hints
Si la distribución automática de solicitudes no cumple con sus expectativas, utilice hints para forzar un plan de ejecución de almacenamiento en filas o en columnas.
Un
hintaplica únicamente a la sentencia SQL en la que se especifica; no afecta a otras sentencias ni conexiones.Si utiliza un cliente MySQL anterior a la versión 5.7.7 para ejecutar sentencias con
hints, debe agregar la opción--commentscuando se conecte al motor de base de datos. Ejecute el comandomysql --versionpara comprobar la versión de su cliente MySQL.
-
Forzar un plan de ejecución de almacenamiento en columnas.
-
Para las versiones 8.0.1.1.38, 8.0.2.2.22 y anteriores de PolarDB for MySQL
Al usar el proxy de la base de datos para la distribución automática de solicitudes, utilice un
hintpara obligar al proxy a enrutar una sentencia SQL a un nodo de almacenamiento en columnas, independientemente de la configuración de loose_imci_ap_threshold. Agregue/* FORCE_IMCI_NODES */antes de la palabra clave SQL. Por ejemplo:/*FORCE_IMCI_NODES*/EXPLAIN SELECT COUNT(*) FROM t1 WHERE t1.a > 1;Una sentencia SQL enrutada a un nodo de almacenamiento en columnas sigue estando sujeta a la configuración de loose_cost_threshold_for_imci. Para forzar que una sentencia SQL use un plan de ejecución de almacenamiento en columnas, utilice un
hintque reduzca el valor de loose_cost_threshold_for_imci. Por ejemplo:/*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1; -
Para las versiones 8.0.1.1.39, 8.0.2.2.23 y posteriores de PolarDB for MySQL
Utilice un hint para establecer el parámetro loose_cost_threshold_for_imci en 0.
EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
NotaCuando utilice
/*+SET_VAR()*/para modificar un umbral, elimine el prefijoloose_del nombre del parámetro. De lo contrario, elhintno surtirá efecto. -
-
Forzar un plan de ejecución de almacenamiento en filas.
Utilice un
hintpara establecer el valor deUSE_IMCI_ENGINEen OFF. Esto obliga a la sentencia SQL a usar un plan de ejecución de almacenamiento en filas. Por ejemplo:EXPLAIN SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;