Clikchouse底层支持HTTP和TCP两种协议。其中HTTP的端口为8123,它拥有更好的兼容性。TCP协议则拥有更好的性能,默认端口为9000。一般都是通过CLI和JDBC这两些封装接口去访问,因为它们更加简单和方便。
1、CLI
CLI(Command line Interface)即命令行接口。它的底层是基于TCP协议的。相信用过数据库的人都很熟悉这类方式。它分为两种,一种为交互式执行,一种则为非交互式执行。
交互式执行是登录客户端,然后使用SQL进行有来有回,一问一答的形式。二非交互式执行则一般用于批处理,比如批量数据导入,批量数据导出等等。
交互式执行
# 登录操作
clickhouse-client
非交互式执行
# 执行批量数据的导入
clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv
clickhouse-client的参数简介
这里只介绍一些常用,其余的参数可以执行clickhouse-client --help查看,有着非常多的参数。
- -h [ --host ] arg (=localhost):指定服务器地址,默认为localhost
- –port arg (=9000) :指定服务器的TCP端口,默认为9000
- -u [ --user ] arg (=default) :指定客户端登录账号
- –password arg:指定客户端登录密码
- -C [ --config-file ] arg:指定配置文件的路径
- -c [ --config ] arg:同上,两者功能一致
- -q [ --query ] arg:用于指定SQL语句
- -d [ --database ] arg:用于指定数据库
2、JDBC
Clickhouse支持标准的JDBC协议。Clickhouse的驱动分为两种:
1)官方驱动
2)第三方驱动
- ClickHouse-Native-JDBC
- clickhouse4j
第三方驱动产生的原因是不满足官方驱动的性能或者使用场景而基于官方驱动产生的。这边主要介绍官方驱动,第三方驱动的使用方式可浏览github的手册。
- ClickHouse-Native-JDBC:https://github.com/housepower/ClickHouse-Native-JDBC
- clickhouse4j:https://github.com/blynkkk/clickhouse4j
- 官方驱动:https://github.com/ClickHouse/clickhouse-jdbc
官方驱动包的maven依赖:
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.2.5</version>
</dependency>
它的使用方式也非常的简单,举个🌰:
package com.yzx.ch.demo;
import java.sql.*;
public class ClickHouseDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 初始化驱动,CH的驱动驱动Class为:ru.yandex.clickhouse.ClickHouseDriver
Class.forName("ru.yandex.clickhouse.ClickHouseDriver");
// URL syntax: jdbc:clickhouse://<host>:<port>[/<database>], e.g. jdbc:clickhouse://localhost:8123/test
String url = "jdbc:clickhouse://192.168.188.178:8123/system";
// 用户名和密码
String user = "default";
String password = "123456";
// 创建连接
Connection con = DriverManager.getConnection(url, user, password);
// 创建Statement对象
Statement statement = con.createStatement();
// 执行查询操作(查询ch中有哪些库)
ResultSet rs = statement.executeQuery("select name from `system`.databases d ");
while (rs.next()){
System.out.println(rs.getString(1));
}
con.close();
}
}
Clickhouse还支持高可用模式,这种一般用于Clickhouse集群。它可以设置多个host地址,每次都会从可用的地址中随机选择一个进行连接。
package com.yzx.ch.demo;
import ru.yandex.clickhouse.BalancedClickhouseDataSource;
import ru.yandex.clickhouse.settings.ClickHouseProperties;
import java.sql.*;
public class ClickHouseDemo2 {
public static void main(String[] args) throws SQLException {
// URL syntax: jdbc:clickhouse://<host1>:<port1>,<host2>:<port2>,...[/<database>]
String url = "jdbc:clickhouse://192.168.198.163:8123,192.168.198.164:8123/system";
ClickHouseProperties chp = new ClickHouseProperties();
// 用户名和密码
chp.setUser("default");
chp.setPassword("6lYaUiFi");
// 声明数据源
BalancedClickhouseDataSource bcd = new BalancedClickhouseDataSource(url, chp);
// 创建连接
Connection con = bcd.getConnection();
// 创建Statement对象
Statement statement = con.createStatement();
// 执行查询操作(查询ch中有哪些库)
ResultSet rs = statement.executeQuery("select name from `system`.databases d ");
while (rs.next()){
System.out.println(rs.getString(1));
}
con.close();
}
}
但是,BalancedClickhouseDataSource拥有一个很大的缺陷,即connection是以http方式与服务端建立请求链接,每一次调用getConnection 都会建立一次新的链接,并且是以随机的方式与集群中的一台服务建立链接,如果其中一个服务挂掉,BalancedClickhouseDataSource在默认情况下是无法检测出来的。
就算以定期的方式检查集群中每一台服务是否正常可用,将可用的服务加入到待请求列表。也无法避免发生检查周期之间服务发生故障,而产生链接的情况。
因此,我们会用别的方式来代替BalancedClickhouseDataSource。一种是用nginx,另一种是用F5。