PostgreSQL Cluster与Airflow:数据管道调度集成实践

PostgreSQL Cluster与Airflow:数据管道调度集成实践

【免费下载链接】postgresql_cluster PostgreSQL High-Availability Cluster (based on "Patroni" and DCS "etcd" or "consul"). Automating with Ansible. 【免费下载链接】postgresql_cluster 项目地址: https://gitcode.com/GitHub_Trending/po/postgresql_cluster

你是否在为数据管道的可靠性和调度效率而困扰?当PostgreSQL数据库集群遇上Airflow调度系统,会碰撞出怎样的火花?本文将带你一文掌握如何将高可用PostgreSQL集群与Airflow完美集成,解决数据流程中的痛点问题。读完本文,你将了解到如何搭建稳定的数据存储底座,配置高效的任务调度,以及实现两者之间的无缝协作,让你的数据处理流程更加顺畅高效。

项目概述

GitHub推荐项目精选 / po / postgresql_cluster是一个基于Patroni和DCS(etcd或consul)构建的PostgreSQL高可用集群解决方案,并通过Ansible实现自动化部署和管理。该项目作为开源替代方案,可与Amazon RDS、Google Cloud SQL等云托管数据库服务相媲美,能够帮助团队轻松创建和管理生产级别的PostgreSQL集群,降低运营成本,即使是没有专业数据库管理经验的团队也能轻松上手。

Autobase项目已积极开发超过5年(自2019年起),受到全球多家公司的信任,在高负载和高可靠性要求的生产环境中得到广泛应用。其使命是提供一个开源的DBaaS解决方案,实现可靠性、灵活性和成本效益的平衡。

PostgreSQL Cluster架构

PostgreSQL Cluster支持多种部署架构,以满足不同场景的需求。

PostgreSQL Cluster架构

1. 仅PostgreSQL高可用架构

这是一种简单的架构,不包含负载均衡。主要组件包括:

  • Patroni:用于自动化管理PostgreSQL实例和自动故障转移
  • etcd:分布式键值存储,用于存储集群状态和配置参数
  • vip-manager(可选):提供数据库访问的单一入口点(VIP)
  • PgBouncer(可选):PostgreSQL连接池器
2. 带负载均衡的PostgreSQL高可用架构

这种架构支持读操作的负载分布,并允许通过只读副本扩展集群。在AWS、GCP、Azure等云提供商部署时,默认会自动创建云负载均衡器(由cloud_load_balancer变量控制)。对于非云环境,可以使用HAProxy负载均衡器,只需设置with_haproxy_load_balancing: true变量。

HAProxy使用时的端口列表:

  • 5000端口(读写):主节点
  • 5001端口(只读):所有副本
  • 5002端口(只读):仅同步副本
  • 5003端口(只读):仅异步副本

HAProxy负载均衡的组件包括:

  • HAProxy:提供高可用、负载均衡和代理功能
  • confd:用于自动化HAProxy配置文件管理
  • Keepalived(可选):提供虚拟高可用IP地址(VIP)
3. 带Consul服务发现的PostgreSQL高可用架构

要使用此架构,需指定dcs_type: consul变量。该架构适用于仅主节点访问和通过DNS实现读操作在副本间的负载均衡。客户端访问点示例:

  • master.postgres-cluster.service.consul
  • replica.postgres-cluster.service.consul

部署与管理

Autobase提供了多种部署和管理PostgreSQL集群的方式,包括控制台(UI)、命令行和GitOps。

控制台(UI)部署

控制台是大多数用户推荐的方法,它设计友好,最大限度地减少错误风险,使设置PostgreSQL集群变得前所未有的简单。要运行autobase控制台,执行以下命令:

docker run -d --name autobase-console \
  --publish 80:80 \
  --env PG_CONSOLE_AUTHORIZATION_TOKEN=secret_token \
  --env PG_CONSOLE_DOCKER_IMAGE=autobase/automation:latest \
  --volume console_postgres:/var/lib/postgresql \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume /tmp/ansible:/tmp/ansible \
  --restart=unless-stopped \
  autobase/console:latest

或者,你也可以使用Docker Compose进行部署。打开控制台UI后,访问http://localhost:80(或你的服务器地址),使用secret_token进行授权。

集群创建演示

命令行部署

命令行模式适用于需要更大灵活性和控制力的高级用户。部署步骤如下:

  1. 准备 inventory:
curl -fsSL https://raw.githubusercontent.com/vitabaks/autobase/refs/heads/master/automation/inventory.example \
  --output ./inventory
  1. 准备变量:
mkdir -p ./group_vars
nano ./group_vars/all.yml
  1. 运行部署命令:
docker run --rm -it \
  -e ANSIBLE_SSH_ARGS="-F none" \
  -e ANSIBLE_INVENTORY=/project/inventory \
  -v $PWD:/project \
  -v $HOME/.ssh:/root/.ssh \
  autobase/automation:latest \
    ansible-playbook deploy_pgcluster.yml

与Airflow集成

Airflow作为一款强大的工作流编排工具,与PostgreSQL Cluster的集成可以构建可靠高效的数据管道。以下是集成的关键步骤:

1. 安装Airflow

首先,确保你已经安装了Airflow。可以通过官方文档或使用Docker Compose进行部署。

2. 配置PostgreSQL连接

在Airflow中配置与PostgreSQL Cluster的连接。使用以下连接字符串格式:

postgresql+psycopg2://username:password@host:port/database

对于高可用集群,建议使用VIP或负载均衡器地址作为主机名,以确保在主节点故障时自动切换到新的主节点。

3. 创建数据库操作任务

使用Airflow的PostgresOperator创建数据库操作任务。例如:

from airflow.providers.postgres.operators.postgres import PostgresOperator

with DAG(
    'postgres_cluster_demo',
    default_args=default_args,
    description='A simple DAG to demonstrate PostgreSQL Cluster integration',
    schedule_interval=timedelta(days=1),
    start_date=datetime(2023, 1, 1),
    catchup=False,
    tags=['example'],
) as dag:

    create_table_task = PostgresOperator(
        task_id='create_table',
        postgres_conn_id='postgres_cluster',
        sql="""
            CREATE TABLE IF NOT EXISTS demo_table (
                id SERIAL PRIMARY KEY,
                data VARCHAR(255),
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            );
        """,
    )

    insert_data_task = PostgresOperator(
        task_id='insert_data',
        postgres_conn_id='postgres_cluster',
        sql="""
            INSERT INTO demo_table (data) VALUES ('Sample data from Airflow');
        """,
    )

    create_table_task >> insert_data_task
4. 配置读写分离

如果你的PostgreSQL Cluster配置了负载均衡,可以在Airflow中配置读写分离。例如,将写操作发送到5000端口,读操作发送到5001端口:

write_conn = PostgresHook(postgres_conn_id='postgres_write')  # 连接到5000端口
read_conn = PostgresHook(postgres_conn_id='postgres_read')    # 连接到5001端口

def write_to_db():
    write_conn.run("INSERT INTO demo_table (data) VALUES ('Write operation')")

def read_from_db():
    result = read_conn.get_records("SELECT * FROM demo_table LIMIT 10")
    for row in result:
        print(row)

with DAG(
    'postgres_cluster_read_write_demo',
    default_args=default_args,
    schedule_interval=timedelta(days=1),
    start_date=datetime(2023, 1, 1),
    catchup=False,
) as dag:

    write_task = PythonOperator(
        task_id='write_to_database',
        python_callable=write_to_db,
    )

    read_task = PythonOperator(
        task_id='read_from_database',
        python_callable=read_from_db,
    )

    write_task >> read_task
5. 监控集群状态

利用Airflow的传感器功能监控PostgreSQL Cluster的状态。例如,使用SqlSensor检查集群健康状态:

from airflow.providers.postgres.sensors.postgres import SqlSensor

check_cluster_health = SqlSensor(
    task_id='check_cluster_health',
    conn_id='postgres_cluster',
    sql="SELECT 1 FROM pg_stat_activity WHERE datname = 'postgres'",
    timeout=60,
    poke_interval=5,
    mode='poke',
)

最佳实践与优化

1. 连接池配置

为提高性能,建议在Airflow和PostgreSQL Cluster之间使用连接池。可以使用PgBouncer,配置示例:

[databases]
postgres = host=vip-address port=5000 dbname=postgres

[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = session
max_client_conn = 100
default_pool_size = 20
2. 任务并行度设置

根据PostgreSQL Cluster的性能和负载情况,合理设置Airflow的任务并行度。可以在airflow.cfg中调整以下参数:

parallelism = 32
dag_concurrency = 16
max_active_runs_per_dag = 4
3. 数据备份策略

结合PostgreSQL Cluster的备份功能和Airflow的调度能力,实现自动化备份。例如,使用PgBackRest进行备份,并通过Airflow定期执行:

backup_task = BashOperator(
    task_id='postgres_backup',
    bash_command='pgbackrest --stanza=main backup',
)

总结与展望

PostgreSQL Cluster与Airflow的集成为构建可靠、高效的数据管道提供了强大的解决方案。通过本文介绍的方法,你可以轻松实现数据存储与任务调度的无缝协作,提升数据处理流程的稳定性和效率。

未来,随着数据量的不断增长和业务需求的变化,这种集成方案将继续发挥重要作用。建议持续关注项目文档社区动态,及时了解新功能和最佳实践,不断优化你的数据管道。

希望本文能帮助你更好地理解和应用PostgreSQL Cluster与Airflow的集成。如有任何问题或建议,欢迎参与项目讨论,让我们共同完善这个强大的数据解决方案。

【免费下载链接】postgresql_cluster PostgreSQL High-Availability Cluster (based on "Patroni" and DCS "etcd" or "consul"). Automating with Ansible. 【免费下载链接】postgresql_cluster 项目地址: https://gitcode.com/GitHub_Trending/po/postgresql_cluster

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值