GCP Composer连接MySQL数据库失败(错误2003)求助
问题排查与解决方案
一、核心问题定位
错误(2003, "Can't connect to MySQL server on 'hostname:port' (110)")本质是TCP连接超时,优先解决网络连通性问题,再验证SSL配置有效性。
二、逐步排查步骤
1. 验证Composer到MySQL的网络通路
- 登录Composer所属的GKE集群节点(通过GCP控制台或
gcloud container clusters get-credentials命令),执行telnet测试连通性:
如果不通,说明网络层面存在阻断:telnet <mysql-hostname> <mysql-port>- 检查MySQL实例的防火墙规则,确认已开放Composer环境VPC IP段对3306端口的访问权限
- 若使用GCP Cloud SQL,确认已将Composer的VPC添加到Cloud SQL的授权网络列表,或启用了VPC peering
- 若MySQL部署在私有网络,排查NAT网关、路由表是否配置正确
2. 修正Airflow MySQL连接的SSL配置
Composer存储桶的data目录会被挂载到worker节点的/home/airflow/gcs/data/路径,需确保extras中的证书路径为绝对路径,正确配置格式如下:
{ "ssl": { "ca": "/home/airflow/gcs/data/ca.pem", "cert": "/home/airflow/gcs/data/client-cert.pem", "key": "/home/airflow/gcs/data/client-key.pem" } }
- 额外检查证书文件权限:确保上传时未设置过于严格的权限,Composer worker的airflow用户需拥有读取权限
3. 快速测试连接有效性
在Airflow UI的Admin > Connections页面,找到目标MySQL连接,点击Test按钮直接验证连通性,比触发DAG更高效定位问题。
三、替代方案
1. 使用Cloud SQL Proxy(针对GCP Cloud SQL)
配置Cloud SQL Proxy sidecar实现本地端口转发,无需手动管理SSL证书:
- 在Composer环境的
values.yaml中添加Cloud SQL Proxy配置(或通过GCP控制台编辑Composer环境) - Airflow连接的主机设为
127.0.0.1,端口设为代理本地端口(默认3306),extras无需SSL相关配置
2. 自定义PythonOperator执行SQL
若SQLExecuteQueryOperator的SSL适配存在问题,改用PythonOperator手动构建连接:
from airflow.decorators import task import mysql.connector from mysql.connector.constants import ClientFlag @task def run_mysql_query(): db_config = { 'user': '<你的用户名>', 'password': '<你的密码>', 'host': '<MySQL主机名>', 'database': '<目标schema>', 'client_flags': [ClientFlag.SSL], 'ssl_ca': '/home/airflow/gcs/data/ca.pem', 'ssl_cert': '/home/airflow/gcs/data/client-cert.pem', 'ssl_key': '/home/airflow/gcs/data/client-key.pem' } conn = mysql.connector.connect(**db_config) cursor = conn.cursor() cursor.execute("SELECT 1;") result = cursor.fetchall() cursor.close() conn.close() return result
在DAG中直接调用该task即可执行SQL操作。
内容的提问来源于stack exchange,提问作者burrito
相关产品推荐
相关产品推荐

