You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Ansible使用Liquibase操作Stolon集群的正确方式及疑问

Stolon集群中Liquibase变更的正确实践

核心执行方式

应用Liquibase变更的正确方式是通过Stolon代理(stolon-proxy)执行,无需手动定位主节点——代理会自动将写请求转发至当前集群的主节点,且只需执行一次变更。

是否必须选择主节点?

不需要手动指定主节点。直接通过代理端口连接是最稳妥的方案,能自动适配主节点切换的场景,避免因主节点变更导致的连接失效或操作失败。

选择副本节点执行会发生什么?

PostgreSQL副本节点默认处于只读模式,直接连接副本节点执行Liquibase变更(属于写操作)会触发报错,因为副本不接受任何写请求。

在所有节点都运行同一脚本会发生什么?

  • 第一个成功连接到主节点(或通过代理路由到主节点)的节点会正常执行变更;
  • 后续节点若连接到副本,会因只读限制报错;
  • 若后续节点也连接到主节点,Liquibase会检查自身的变更历史表,发现变更已执行,会自动跳过重复操作,但这种冗余操作完全没必要,还可能引发不必要的错误日志。

Ansible Playbook示例

- name: 执行Liquibase数据库变更
  hosts: stolon_nodes
  vars:
    postgres_database: your_target_db
    stolon_proxy_port: 5432  # 替换为你的Stolon代理实际端口
    liquibase_changelog: ./db/changelog.xml
    db_user: your_db_username
    db_password: your_db_password
  tasks:
    - name: 运行Liquibase更新
      command: >
        liquibase
        --changeLogFile={{ liquibase_changelog }}
        --url="jdbc:postgresql://{{ inventory_hostname }}:{{ stolon_proxy_port }}/{{ postgres_database }}"
        --username={{ db_user }}
        --password={{ db_password }}
        update
      run_once: true  # 确保仅在一个节点执行一次变更

关键说明:run_once: true参数保证脚本只执行一次,无需额外逻辑识别主节点,代理会自动完成路由。

正确的JDBC URL

选择选项2:

jdbc:postgresql://{{postgres_host}}:{{stolon_proxy_port}}/{{postgres_database}}

选项1直接连接Postgres端口存在风险:可能连接到副本节点导致写失败,或主节点切换后连接失效。而代理端口会始终路由到当前主节点,是集群环境下的标准选择。

资料查阅方向

  • Stolon官方文档:重点查看代理组件的请求路由、主节点自动发现机制
  • Liquibase官方文档:集群环境下的变更执行最佳实践
  • PostgreSQL官方文档:副本节点的只读特性与读写分离逻辑

内容的提问来源于stack exchange,提问作者Alexander Kolinchenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:10:19