Optimiza el rendimiento de las cargas de trabajo de MySQL en GKE

En este documento, se describe cómo mejorar el rendimiento de tus cargas de trabajo de MySQL en Google Kubernetes Engine (GKE) generando configuraciones optimizadas a nivel de la aplicación y del nodo. Para obtener más detalles, consulta Optimiza las cargas de trabajo en GKE.

Las optimizaciones para MySQL se determinaron para una instancia de MySQL 8 que se usa como una base de datos de procesamiento de transacciones en línea de un solo nodo ("OLTP de lectura y escritura") con SSL, con el rendimiento medido con Sysbench 1.1.0. Considera cómo se usa la carga de trabajo de MySQL en tu clúster en comparación con este caso de uso. Si tu caso de uso es diferente, es posible que las optimizaciones recomendadas deban ajustarse a tu contexto.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de GKE Recommender y la API de Google Kubernetes Engine.
  • Habilita las APIs
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando gcloud components update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se indican en este documento.

Requisitos

Usa la versión 1.31.1-gke.12000 de GKE o una posterior.

Optimiza las cargas de trabajo de MySQL

Te recomendamos que uses un grupo de nodos dedicado para tu carga de trabajo de MySQL. De forma predeterminada, se crea un grupo de nodos nuevo cuando completas los siguientes pasos.

Para optimizar el rendimiento de una carga de trabajo de MySQL, haz lo siguiente:

  1. Crea los manifiestos con optimizaciones para la carga de trabajo de MySQL:

    1. Ejecuta el siguiente comando para generar manifiestos con optimizaciones recomendadas:

      gcloud container workload profiles manifests create \
         --workload=mysql-8-oltp
         --cluster-version=CLUSTER_VERSION
         --options=machineType=MACHINE_TYPE \
         --output-path=/tmp/manifests.yaml
      

      Reemplaza lo siguiente:

      • CLUSTER_VERSION: Es la versión de GKE. Se recomienda la versión 1.31.1-gke.12000 o posterior de GKE.
      • MACHINE_TYPE: Es el tipo de máquina deseado.

      La marca --output-path=/tmp/manifests.yaml es opcional. Si no se especifica, los manifiestos se imprimen en la terminal, pero no se guardan en un archivo.

      Este comando genera un solo archivo YAML que contiene dos recursos de Kubernetes:

      • Un ConfigMap que especifica una configuración de MySQL llamada default-auth.cnf.
      • Un objeto ComputeClass. Esto especifica las máquinas en las que se ejecutará MySQL, lo cual es opcional. Para obtener detalles sobre cómo se especifican los tipos de máquinas, consulta Acerca de las ComputeClasses personalizadas.
    2. Revisa las recomendaciones y modifica los manifiestos para que incluyan las optimizaciones que prefieras. Para evaluar las recomendaciones, puedes hacer lo siguiente:

      • Revisa la documentación de MySQL para evaluar la configuración recomendada para tu contexto.
      • Considera cómo se usa la carga de trabajo de MySQL en tu clúster en comparación con el siguiente caso de uso. Si tu caso de uso es diferente, es posible que debas ajustar las optimizaciones recomendadas para tu contexto.

      Las optimizaciones para MySQL se determinaron para una instancia de MySQL 8 que se usa como una base de datos de procesamiento de transacciones en línea de un solo nodo ("OLTP de lectura y escritura") con SSL, con el rendimiento medido con Sysbench 1.1.0.

    3. Edita el archivo de manifiesto si deseas modificar la configuración o agregarle elementos.

    4. Aplica los manifiestos al clúster con el siguiente comando:

      kubectl create -f /tmp/manifests.yaml
      
  2. Implementa un Pod que haga referencia a las optimizaciones. Por ejemplo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8
          volumeMounts:
            - name: gke-optimized-workload-config
              subPath: default-auth.cnf
              mountPath: /etc/mysql/conf.d/gke-optimized.cnf
              readOnly: true
      volumes:
        - name: gke-optimized-workload-config
          configMap:
            name: mysql-config
      nodeSelector:
        cloud.google.com/compute-class: optimized-gke-mysql-8-oltp-abc123
    

    Modifica el nombre de ComputeClass para que coincida con el generado. Luego, aplica el manifiesto del Pod al clúster:

    kubectl apply -f pod.yaml
    
  3. Confirma que MySQL esté usando la configuración optimizada. Para ello, puedes ejecutar el siguiente comando para asegurarte de que MySQL use la configuración optimizada:

    kubectl exec mysql -- mysql -e "SELECT DISTINCT VARIABLE_PATH FROM performance_schema.variables_info WHERE VARIABLE_PATH != '';"
    

    Deberías ver un resultado similar al siguiente:

    VARIABLE_PATH
    /etc/mysql/conf.d/gke-optimized.cnf
    /etc/my.cnf
    

    También puedes usar el comando mysql para consultar las directivas individuales que se establecen en la configuración optimizada, como max_connections.

Cuando implementas la carga de trabajo, el clúster crea un nuevo grupo de nodos que se ajusta a la configuración optimizada y asigna tus Pods a esos grupos de nodos.

No se modifican los Pods que ya existen. Solo se optimizan los Pods que hacen referencia a las configuraciones optimizadas. Si ya implementaste cargas de trabajo de MySQL en tu clúster, debes volver a implementarlas para ejecutarlas con las configuraciones optimizadas.

¿Qué sigue?