内容纲要
概要描述
workflow定时调度任务只执行了一次,后面两次均失败,在workflow日志中发现有如下报错:
Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
详细说明
workflow 的元数据在 TxSQL 中保存,workflow 跑任务的时候与元数据库 TxSQL 有交互,如果在交互过程中发生了主备切换,则会出现 read-only 的问题;
假设 TxSQL 的 jdbc 连接串配置为:
jdbc:mysql://node1:3306,node2:3306/manager?autoReconnect=true&createDatabaseIfNotExist=false&characterEncoding=UTF-8,
如果 node1 机器(即连接串上填写的第一台机器)上的TxSQL挂掉了,jdbc 连接切换到 node2 之后会变成 read-only,原因是 jdbc 有个默认参数 failOverReadOnly=true,就会出现切换之后将不能写TxSQL,只能read-only。
该问题最终修复版是 TDH 6.0,当前的解决方案是修改元数据库的连接串;
解决方案
去当前 TDH 版本的 metainfo 目录,比如我这里是 :/var/lib/transwarp-manager/master/content/meta/services/WORKFLOW/transwarp-5.1.1-final/templates
,修改目录下的 db.properties 里的连接,加上 failOverReadOnly=false 这个参数,然后重启 manager,然后配置 workflow 服务,最后重启 workflow 即可解决。
修改前连接串:
jdbc:mysql://node1:3306,node2:3306/manager?autoReconnect=true&createDatabaseIfNotExist=false&characterEncoding=UTF-8
修改后连接串:
jdbc:mysql://node1:3306,node2:3306/manager?failOverReadOnly=false&autoReconnect=true&createDatabaseIfNotExist=false&characterEncoding=UTF-8