介绍
ClickHouse 是俄罗斯的 Yandex 于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP)。
下面简单介绍行式存储和列式存储的区别:
行式数据库
列式数据库
列式数据库由于相同指标会存到一起, 所以可以很方便的针对 多条数据的相同指标
进行统计、分析, 而行式数据库由于基于行的存储, 需要将该行的数据都取出 ,再取出所需要的指标, 就会导致多取了很多不必要的指标, 可见行式存储的分析性能没有列式存储高.
安装
本文都是使用 docker 进行 Clickhouse 的安装.
# 使用docker启动 clickhouse # 如果要使用自定义配置文件需要进行额外的映射, 映射到容器内的/etc/clickhouse-server/地址 docker run -d --name clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server # 进入容器 docker exec -it clickhouse-server bash # 使用 clickhouse-client 客户端进入, 进入后就能进行数据库操作了. clickhouse-client
下面是结果图
数据测试
建表
创建测试的库和表, 由于创建几个表的sql太长,就不在这里粘贴, 详见 官方指引
# 创建 tutorial 库 # 使用 clickhouse-client 创建 clickhouse-client --query "CREATE DATABASE IF NOT EXISTS tutorial;" # 如果是已经使用 clickhouse-client 连接到server, 则只需下面 CREATE DATABASE IF NOT EXISTS tutorial; # 创建表1 hits_v # 创建表2 visits_v1
建表成功后:
use tutorial SHOW TABLES Query id: xxx ┌─name──────┐ │ hits_v1 │ │ visits_v1 │ └───────────┘
导入数据
# 接下来使用官方的示例文件进行测试 curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv curl https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv # 此处跳过一个小时 .... # 下面是导入 clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv clickhouse-client --query "INSERT INTO tutorial.visits_v1 FORMAT TSV" --max_insert_block_size=100000 < visits_v1.tsv
由于此处我们需要将文件映射到容器内, 所以把容器删掉, 启动一个新的, 添加路径映射, 此时到启动命令改为:
# 增加了两个文件的映射路径到容器内的 /data docker run -d --name clickhouse-server -v /data/demo/clickhouse/data:/data --ulimit nofile=262144:262144 clickhouse/clickhouse-server # 由于之前没有映射 clickhouse 的数据文件到外部, 所以新建容器需要再建一次表, 见上面的 "建表"--> "这次我们依旧没有映射Clickhouse的数据映射" # 数据导入 docker exec -it clickhouse-server bash cd /data # 建表 建表... # 导入数据, 导入的过程还是挺快的 clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv clickhouse-client --query "INSERT INTO tutorial.visits_v1 FORMAT TSV" --max_insert_block_size=100000 < visits_v1.tsv
查询
导入数据成功后, 执行一个查询, 查询结果还是相当的快的.
SELECT StartURL AS URL, AVG(Duration) AS AvgDuration FROM tutorial.visits_v1 WHERE StartDate BETWEEN '2014-03-23' AND '2014-03-30' GROUP BY URL ORDER BY AvgDuration DESC LIMIT 10
集群安装
集群安装跟单机类似, 但是有一个不同的地方, 就是 metrika.xml 的配置文件, 该配置文件需要映射到容器内的 /etc/metrika.xml
<!-- 这里目前使用3分片, 1数据副本的情况, 如果是多副本, 则要在同一个 shard 下面添加该分片的其他副本 --> <yandex> <clickhouse_remote_servers> <test_cluster_name> <shard> <internal_replication>true</internal_replication> <replica> <host>server01</host> <port>9000</port> </replica> </shard> <shard> <replica> <internal_replication>true</internal_replication> <host>server02</host> <port>9000</port> </replica> </shard> <shard> <internal_replication>true</internal_replication> <replica> <host>server03</host> <port>9000</port> </replica> </shard> </test_cluster_name> </clickhouse_remote_servers> <!--zookeeper相关配置--> <zookeeper-servers> <node index="1"> <host>zkServer01</host> <port>2181</port> </node> <node index="2"> <host>zkServer02</host> <port>2181</port> </node> <node index="3"> <host>zkServer03</host> <port>2181</port> </node> </zookeeper-servers> <!-- 以上的配置在多台服务器里面是一样的 --> <!-- macros 配置在每个服务器上都不一样, 一般 shard 为分片序号, replica 为副本名称 --> <!-- 因为这里是 3分片1副本, 所以其他两个的配置分别是 {shard=02, replica=server02}, {shard=03, replica=server03} --> <macros> <shard>01</shard> <replica>server01</replica> </macros> <networks> <ip>::/0</ip> </networks> <!-- 数据压缩 --> <clickhouse_compression> <case> <min_part_size>10000000000</min_part_size> <min_part_size_ratio>0.01</min_part_size_ratio> <method>lz4</method> </case> </clickhouse_compression> </yandex>
在使用 ReplcatedMergeTree 表的时候, 就会用到 macros 的这几个属性
-- 建表语句 ... ENGINE = ReplcatedMergeTree( '/clickhouse/tables/{shard}/hits', '{replica}' )
最后
本文是对 Clickhouse 入门的一个讲解, 还有其他的很多操作建议看 官方文档, 毕竟官方文档才是最权威的.
欢迎扫描下方二维码或搜索公众号 LemonCode , 一起交流!