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

Pgpool+Aurora配置后Jira启动报错:无法在只读事务执行UPDATE

问题分析与解决方案

核心问题

Jira启动时执行的UPDATE public.clusternode写操作被Pgpool错误路由到了Aurora只读实例,触发cannot execute UPDATE in a read-only transaction错误,导致启动失败。根源在于Pgpool的主从状态检测与路由规则配置不完善,无法正确区分读写操作的目标节点。


解决方案步骤

1. 修正Pgpool核心配置

修改pgpool.conf参数,确保主从节点状态检测正常、路由逻辑准确:

listen_addresses = '*'
port = 5432

backend_hostname0 = 'writerinstanceclusterendpoint'
backend_port0 = 5432
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'

backend_hostname1 = 'readerinstanceclusterendpoint'
backend_port1 = 5432
backend_flag1 = 'DISALLOW_TO_FAILOVER'
backend_clustering_mode = 'streaming_replication'

enable_pool_hba = On
pool_passwd = 'pool_passwd'
Ssl = On
replication_mode = Off
load_balance_mode = On
master_slave_mode = On
master_slave_sub_mode = Stream

# 开启主从状态检测,周期5秒(可按需调整)
sr_check_period = 5
# 指定用于状态检测的数据库用户(需具备主从查询权限)
sr_check_user = 'postgres'
sr_check_password = 'your_sr_check_password'

# 开启节点健康检查,周期10秒
health_check_period = 10

max_pool = 350
# 开启故障自动切换,避免节点异常时路由错误
failover_on_backend_error = On

2. 验证Pgpool节点状态

重启Pgpool后,执行以下命令确认主从节点识别正确:

pgpool -c show pool_nodes

输出需满足:

  • backend0状态为up,角色为primary
  • backend1状态为up,角色为standby

3. 调整Jira数据库连接配置

在dbconfig.xml中明确指定连接为非只读,避免Pgpool误判:

<jira-database-config>
  <name>defaultDS</name>
  <delegator-name>default</delegator-name>
  <database-type>postgres72</database-type>
  <schema-name>public</schema-name>
  <jdbc-datasource>
    <url>jdbc:postgresql://pgpoolIP:5432/jiradb</url>
    <driver-class>org.postgresql.Driver</driver-class>
    <username>jira</username>
    <password>mypass</password>
    <pool-min-size>20</pool-min-size>
    <pool-max-size>300</pool-max-size>
    <pool-max-wait>30000</pool-max-wait>
    <pool-max-idle>20</pool-max-idle>
    <pool-remove-abandoned>true</pool-remove-abandoned>
    <pool-remove-abandoned-timeout>300</pool-remove-abandoned-timeout>
    <!-- 添加readOnly=false明确非只读连接 -->
    <connection-properties>tcpKeepAlive=true;socketTimeout=240;readOnly=false</connection-properties>
    <validation-query>select version();</validation-query>
    <min-evictable-idle-time-millis>60000</min-evictable-idle-time-millis>
    <time-between-eviction-runs-millis>300000</time-between-eviction-runs-millis>

    <pool-test-while-idle>true</pool-test-while-idle>
    <pool-test-on-borrow>false</pool-test-on-borrow>
    <validation-query-timeout>3</validation-query-timeout>
  </jdbc-datasource>
</jira-database-config>

4. 验证流量路由

  • 重启Pgpool与Jira,确认启动日志无只读事务错误
  • 执行只读操作(如浏览项目),查看Pgpool日志确认流量路由到只读实例
  • 执行写操作(如创建Issue),确认流量路由到主实例

内容的提问来源于stack exchange,提问作者Sahil Gulati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:45:13