taosdata/TDengine

TDengine client connection high available with taos.cfg usage

Open

#33056 opened on Sep 24, 2025

View on GitHub
 (3 comments) (0 reactions) (1 assignee)C (24,849 stars) (5,002 forks)batch import
help wantedquestion

Description

在做集群高可用检证时,参考#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参数的方式

Contributor guide