taosdata/TDengine

TDengine client connection high available with taos.cfg usage

Open

#33.056 aperta il 24 set 2025

Vedi su GitHub
 (3 commenti) (0 reazioni) (1 assegnatario)C (5002 fork)batch import
help wantedquestion

Metriche repository

Star
 (24.849 star)
Metriche merge PR
 (Merge medio 1g 1h) (4 PR mergiate in 30 g)

Descrizione

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

Guida contributor