taosdata/TDengine
在 GitHub 查看TDengine client connection high available with taos.cfg usage
Open
#33,056 创建于 2025年9月24日
help wantedquestion
描述
在做集群高可用检证时,参考#5614得知,最好使用taos.cfg配置的方式来实现客户端高可用。
前提:
客户端与服务端均采用 3.3.6.13 版本
我们是直接把应用后端以及TDEngine客户端打包到容器中,由K8S统一编排,这里的taos.cfg将通过字典文件的方式挂载到容器内,此时,这里挂载到了自定义路径下/usr/local/taos/taos.cfg
基于这种场景,使用jdbc JNI 连接时,从文档处得知cfgdir参数,因此采用以下代码检证参数的使用
public class TestTDEngineService {
public static void main(String[] args) throws SQLException {
String url = "jdbc:TAOS://:/log";
Properties props = new Properties();
props.setProperty(TSDBDriver.PROPERTY_KEY_USER, "root");
props.setProperty(TSDBDriver.PROPERTY_KEY_PASSWORD, "taosdata");
props.setProperty(TSDBDriver.PROPERTY_KEY_CONFIG_DIR, "C:\\TDengine\\cfg\\cfg");
try (Connection conn = DriverManager.getConnection(url, props);
Statement stmt = conn.createStatement();
) {
ResultSet sqlResult = stmt.executeQuery("SELECT * FROM adapter_status limit 3");
// 获取结果集的元数据(列信息)
ResultSetMetaData metaData = sqlResult.getMetaData();
int columnCount = metaData.getColumnCount();
// 打印表头(列名)
for (int i = 1; i <= columnCount; i++) {
System.out.print(metaData.getColumnName(i) + "\t");
}
System.out.println();
// 打印数据行
while (sqlResult.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(sqlResult.getString(i) + "\t");
}
System.out.println();
}
sqlResult.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
这里准备了一个taos.cfg文件,其中指定firstEp为宕机的节点,secondEp为可用节点 为了测试自定义路径,为cfgdir参数多加了一层cfg文件夹,并于该目录下放置了上述文件(默认路径下的配置文件已移除)
运行报错
java.sql.SQLException: JNI ERROR (0x2354): Unable to establish connection
at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:90)
at com.taosdata.jdbc.TSDBJNIConnector.connect(TSDBJNIConnector.java:192)
at com.taosdata.jdbc.TSDBConnection.connect(TSDBConnection.java:34)
at com.taosdata.jdbc.TSDBConnection.<init>(TSDBConnection.java:25)
at com.taosdata.jdbc.TSDBDriver.connect(TSDBDriver.java:184)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:190)
此时,我首先测试了在默认配置路径下放置同文件,并再次运行代码,结果正常连接,并输出了检索信息,说明配置文件没有问题
在更改了数次文件路径以及路径写法无果后,我尝试改用websocket连接的方式进行测试,原因是文档此处明确指出
仅 WebSocket 连接方式支持多个端点地址
测试代码如下:
public class TestTDEngineService {
public static void main(String[] args) throws SQLException {
String url = "jdbc:TAOS-WS://node1:6041,node2:6041/log";
Properties props = new Properties();
props.setProperty(TSDBDriver.PROPERTY_KEY_USER, "root");
props.setProperty(TSDBDriver.PROPERTY_KEY_PASSWORD, "taosdata");
try (Connection conn = DriverManager.getConnection(url, props);
Statement stmt = conn.createStatement();
) {
ResultSet sqlResult = stmt.executeQuery("SELECT * FROM adapter_status limit 3");
// 获取结果集的元数据(列信息)
ResultSetMetaData metaData = sqlResult.getMetaData();
int columnCount = metaData.getColumnCount();
// 打印表头(列名)
for (int i = 1; i <= columnCount; i++) {
System.out.print(metaData.getColumnName(i) + "\t");
}
System.out.println();
// 打印数据行
while (sqlResult.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(sqlResult.getString(i) + "\t");
}
System.out.println();
}
sqlResult.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
其中,node1为宕机节点,node2为可用节点 运行报错如下:
java.sql.SQLException: ERROR (0x231d): can't create connection with server within: 60000 milliseconds
at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:87)
at com.taosdata.jdbc.ws.Transport.checkConnection(Transport.java:403)
at com.taosdata.jdbc.AbstractDriver.getWSConnection(AbstractDriver.java:105)
at com.taosdata.jdbc.ws.WebSocketDriver.connect(WebSocketDriver.java:36)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:190)
实际并没有等待60s,而是一运行就立即报错
将url去掉node1,只保留node2,正常连接并输出检索结果
期望得到: 使用 JDBD JNI 连接,正确传递cfgdir参数的方式