程序去连接clickhouse集群,要求当连接到故障节点时,可以自动去连接后面的可用节点,实现高可用。
-
新建ClickhouseDatasource,使用自定义的datasource
@Bean(name="clickHouseDataSource") public DataSource clickHouseDataSource() throws Exception { ClickHouseDataSourceWithFailover datasource = new ClickHouseDataSourceWithFailover(ConnectInfo.ckIPs, userName, password, 5000); return datasource; }
-
自定义ClickHouseDataSourceWithFailover,连接失败时自动连接下一个节点
public class ClickHouseDataSourceWithFailover extends ClickHouseDataSource {
private final List<String> nodes;
private final String username;
private final String password;
private final int timeout;public ClickHouseDataSourceWithFailover(List<String> nodes, String username, String password, int timeout) throws SQLException { super(String.format("jdbc:clickhouse://%s:8123/audit?connect_timeout=%d&socket_timeout=500000", nodes.get(0), timeout)); this.nodes = nodes; this.username = username; this.password = password; this.timeout = timeout; } @Override public ClickHouseConnection getConnection() throws SQLException { for (String node : nodes) { try { String url = String.format("jdbc:clickhouse://%s:8123/db?connect_timeout=%d&socket_timeout=500000", node, timeout); Properties properties = new Properties(); properties.put("username", username); properties.put("password", password); ClickHouseDataSource dataSource = new ClickHouseDataSource(url, properties); return dataSource.getConnection(); } catch (SQLException e) { log.error("Failed to connect to node: {}, ex:{}", node, e); } } throw new SQLException("Unable to connect to any ClickHouse node."); }
}