Si votre activité nécessite l'envoi simultané de requêtes OLAP et OLTP à la base de données via une même application, définissez le mode lecture/écriture de l'endpoint de cluster et activez la répartition automatique des requêtes. Une fois cette fonctionnalité activée, le proxy de base de données utilise le coût estimé des instructions SQL entrantes pour router automatiquement les requêtes et optimiser les performances. Lorsque le coût d'une requête dépasse un seuil défini, le proxy dirige automatiquement la demande vers un nœud de stockage en colonnes en lecture seule. Sinon, un nœud de stockage en lignes en lecture seule ou le nœud principal traite la requête.
Fonctionnement
Le proxy de base de données de PolarDB for MySQL s'appuie sur le query cost estimé d'une instruction SQL pour déterminer son routage. En comparant ce coût à un seuil configurable, le proxy oriente la requête vers un nœud de stockage en lignes ou en colonnes afin d'optimiser les performances pour les deux types de charge.
Règles de répartition des requêtes :
Service OLTP : concerne principalement les requêtes en lecture et en écriture. Le nœud principal traite toutes les requêtes d'écriture. Les nœuds de stockage en lignes en lecture seule ou le nœud principal traitent les requêtes en lecture.
Service OLAP : concerne essentiellement les requêtes en lecture. Les nœuds de stockage en colonnes en lecture seule traitent l'intégralité des requêtes en lecture.
Solution de répartition automatique des requêtes :
Répartition entre le nœud principal et les nœuds de stockage en colonnes en lecture seule : le nœud principal peut traiter les requêtes OLTP en lecture, car il fonctionne également en mode de stockage en lignes. Dans cette configuration, les requêtes d'écriture et les requêtes OLTP en lecture sont dirigées vers le nœud principal, tandis que les requêtes OLAP en lecture sont envoyées aux nœuds de stockage en colonnes en lecture seule.
Répartition entre les nœuds de stockage en lignes et les nœuds de stockage en colonnes en lecture seule : dans ce scénario, les requêtes d'écriture sont acheminées vers le nœud principal, les requêtes OLTP en lecture sont distribuées aux nœuds de stockage en lignes en lecture seule ou au nœud principal, et les requêtes OLAP en lecture sont traitées par les nœuds de stockage en colonnes en lecture seule.

Limites
Les nœuds de service doivent comprendre au moins un nœud de stockage en colonnes en lecture seule et un nœud de stockage en lignes (le nœud principal ou un nœud de stockage en lignes en lecture seule).
Étape 1 : Activer la répartition automatique des requêtes
Connectez-vous à la console PolarDB. Dans le volet de navigation de gauche, cliquez sur Clusters, sélectionnez la région où votre cluster est déployé, puis cliquez sur l'ID du cluster.
Sur la page Basic Information, dans la section PolarProxy, cliquez sur Modify en regard de l'endpoint de cluster cible.
-
Sélectionnez un mode Read/Write adapté à vos besoins.
Le mode lecture/écriture de l'endpoint de cluster est défini sur Read/Write (Automatic Read/Write Splitting).
Le mode lecture/écriture de l'endpoint de cluster est défini sur Read-only et la politique d'équilibrage de charge est réglée sur Active requests-based load balancing.
-
Dans les paramètres Node Settings, sélectionnez le nœud principal ainsi que les nœuds de stockage en lignes et en colonnes en lecture seule. Dans la section HTAP Optimization située à droite, activez l'option Transactional/Analytical Processing Splitting. Cliquez sur OK.
RemarqueVous devez sélectionner au moins un nœud de stockage en colonnes en lecture seule dans les paramètres Node Settings.
Après avoir activé l'option Transactional/Analytical Processing Splitting, vous devez également créer un IMCI pour que la fonctionnalité soit effective.
L'activation de l'option Transactional/Analytical Processing Splitting ne s'applique qu'aux nouvelles connexions. Les connexions existantes ne sont pas affectées ; pour appliquer la modification, déconnectez-vous puis reconnectez-vous.
Exemple 1 : outre le nœud principal, les nœuds de service comprennent un nœud de stockage en lignes en lecture seule et deux nœuds de stockage en colonnes en lecture seule. Si vous activez la répartition automatique des requêtes :
Les requêtes d'écriture sont routées vers le nœud principal.
Les requêtes OLAP en lecture sont dirigées vers les nœuds de stockage en colonnes en lecture seule.
Les requêtes OLTP en lecture sont acheminées vers le nœud de stockage en lignes en lecture seule. Si l'option Primary Node Accepts Read Requests est définie sur Yes dans les Load Balancing Settings, le proxy peut également router les requêtes vers le nœud principal.
Exemple 2 : les nœuds de service comprennent le nœud principal et un nœud de stockage en colonnes en lecture seule. Si vous activez la répartition automatique des requêtes, les requêtes d'écriture et les requêtes OLTP en lecture sont routées vers le nœud principal, tandis que les requêtes OLAP en lecture sont dirigées vers le nœud de stockage en colonnes en lecture seule.
RemarqueEn mode Read/Write (Automatic Read/Write Splitting), le proxy envoie toutes les requêtes d'écriture au nœud principal, même si celui-ci n'est pas sélectionné comme nœud de service.
Étape 2 : Configurer le seuil de répartition
Après avoir activé la répartition automatique des requêtes, définissez le seuil de query cost. Le proxy de base de données utilise ce seuil pour router les requêtes. Si le coût d'une requête dépasse ce seuil, le proxy la dirige vers un nœud de stockage en colonnes. Sinon, il la route vers un nœud de stockage en lignes.
Le seuil de coût de requête dépend des paramètres du tableau suivant. Modifiez ces valeurs sur la page Parameters de votre cluster pour affiner la répartition automatique des requêtes.
|
Paramètre |
Description |
|
loose_imci_ap_threshold |
Seuil de coût de requête pour le routage des instructions SQL vers les nœuds de stockage en colonnes. Valeur par défaut : 50000. Remarque
Une fois la répartition automatique des requêtes activée, le proxy route les instructions SQL dont le coût de requête est supérieur à 50000 vers les nœuds de stockage en colonnes. Important
Pour les versions 8.0.1.1.39, 8.0.2.2.23 et ultérieures de PolarDB for MySQL, ce paramètre est obsolète. Utilisez plutôt |
|
loose_cost_threshold_for_imci |
Seuil de coût de requête utilisé sur les nœuds de stockage en colonnes pour décider de l'utilisation d'un plan d'exécution en colonnes. Valeur par défaut : 50000. Remarque
Lorsque la répartition automatique des requêtes est activée, si le coût de requête d'une instruction SQL est supérieur à 50000, le système sélectionne un plan d'exécution en colonnes. Sinon, il opte pour un plan d'exécution en lignes. |
Exécutez la commande SHOW STATUS LIKE 'Last_query_cost_for_imci' pour vérifier le coût de requête de la dernière instruction SQL. Cette information vous aide à ajuster les valeurs des paramètres.
Si vous vous connectez à la base de données via un endpoint de cluster, ajoutez le hint /* ROUTE_TO_LAST_USED*/ avant la commande SHOW STATUS LIKE 'Last_query_cost_for_imci'. Cela garantit la récupération du coût de requête de l'instruction précédente depuis le bon nœud. Par exemple :
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost_for_imci';
Par exemple, exécutez l'instruction suivante pour consulter le coût de requête de l'instruction SQL précédente :
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost_for_imci';
Le résultat obtenu est le suivant :
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Last_query_cost_for_imci | 2 |
+--------------------------+-------+
1 row in set (0.01 sec)
Le coût de requête de l'instruction SQL est de 2.
Pour router cette requête SQL vers un nœud de stockage en colonnes afin d'utiliser une exécution en colonnes, définissez les paramètres comme suit :
-
Pour les versions 8.0.1.1.38, 8.0.2.2.22 et antérieures de PolarDB for MySQL
Définissez les paramètres loose_imci_ap_threshold et loose_cost_threshold_for_imci sur 1.
-
Pour les versions 8.0.1.1.39, 8.0.2.2.23 et ultérieures de PolarDB for MySQL
Définissez le paramètre loose_cost_threshold_for_imci sur 1.
Forcer les plans d'exécution avec des hints
Si la répartition automatique des requêtes ne répond pas à vos attentes, utilisez des hints pour imposer un plan d'exécution en lignes ou en colonnes.
Un
hints'applique uniquement à l'instruction SQL dans laquelle il est spécifié ; il n'affecte ni les autres instructions ni les autres connexions.Si vous utilisez un client MySQL antérieur à la version 5.7.7 pour exécuter des instructions contenant des
hints, ajoutez l'option--commentslors de la connexion au moteur de base de données. Exécutez la commandemysql --versionpour vérifier la version de votre client MySQL.
-
Imposer un plan d'exécution en colonnes.
-
Pour les versions 8.0.1.1.38, 8.0.2.2.22 et antérieures de PolarDB for MySQL
Lors de l'utilisation du proxy de base de données pour la répartition automatique des requêtes, un
hintpermet de forcer le proxy à router une instruction SQL vers un nœud de stockage en colonnes, indépendamment du paramètre loose_imci_ap_threshold. Ajoutez/* FORCE_IMCI_NODES */avant le mot-clé SQL. Par exemple :/*FORCE_IMCI_NODES*/EXPLAIN SELECT COUNT(*) FROM t1 WHERE t1.a > 1;Une instruction SQL routée vers un nœud de stockage en colonnes reste soumise au paramètre loose_cost_threshold_for_imci. Pour contraindre une instruction SQL à utiliser un plan d'exécution en colonnes, servez-vous d'un
hintafin de réduire la valeur de loose_cost_threshold_for_imci. Par exemple :/*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1; -
Pour les versions 8.0.1.1.39, 8.0.2.2.23 et ultérieures de PolarDB for MySQL
Utilisez un hint pour définir le paramètre loose_cost_threshold_for_imci sur 0.
EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
RemarqueLorsque vous utilisez
/*+SET_VAR()*/pour modifier un seuil, supprimez le préfixeloose_du nom du paramètre. Sinon, lehintne prendra pas effet. -
-
Imposer un plan d'exécution en lignes.
Un
hintpermet de définir la valeur deUSE_IMCI_ENGINEsur OFF. Cela force l'instruction SQL à utiliser un plan d'exécution en lignes. Par exemple :EXPLAIN SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;