一、clickhouse:日处理记录数:十亿级
1.开源的列式存储的数据管理系统
2.支持线性扩展
3.简单方便
4.高可靠性
5.容错(支持多主机异步复制,可以跨多个数据中心部署,
单个节点或整个数据中心的停机时间不会影响系统的读写性能)
二、关键功能-应用场景 特性:
深度存储 广告网络和RTB 采用列式存储
向量化查询执行 电信 数据压缩
数据压缩 电子商务 基于磁盘的存储,大部分列式存储数据库为了追求速度,会将数据直接写入内存,按时内存的空间往往很小
并行和分布式查询 信息安全 CPU 利用率高,在计算时会使用机器上的所有 CPU 资源
实时数据注入 监测和遥感 支持分片,并且同一个计算任务会在不同分片上并行执行,计算完成后会将结果汇总
跨数据中心备份 商业智能 支持SQL,SQL 几乎成了大数据的标准工具,使用门槛较低
磁盘上的数据访问局部性 网络游戏 支持联表查询
类sql支持 物联网 支持实时更新
局部和分布式的join 自动多副本同步
可插入的纬度表 支持索引
预估查询处理 分布式存储查询
支持IPV6存储格式
网站和应用分析
三、性能
低延迟:对于数据量(几千行,列不是很多)不是很大的短查询,如果数据已经被载入缓存,且使用主码,延迟在50MS左右。
并发量:虽然 ClickHouse 是一种在线分析型数据库,也可支持一定的并发。当单个查询比较短时,官方建议 100 Queries / second。
写入速度:在使用 MergeTree 引擎的情况下,写入速度大概是 50 - 200 M / s,如果按照 1 K 一条记录来算,
大约每秒可写入 50000 ~ 200000 条记录每秒。如果每条记录比较小的话写入速度会更快
四、接口
对外提供Http,JDBC两种接口方式
对内各模块间使用TCP连接通信。
五、与Hadoop区别
Hadoop 体系是一种离线系统,一般很难支持即席查询。ClickHouse 可以支持即席查询
Hadoop 体系一般不支持实时更新,都采用批量更新和写入。ClickHouse 支持实时数据更新
Hadoop 体系一般采用行记录存储,数据查询需要扫描所有列,当表很宽时会扫描很多用不到的列。ClickHouse 是列式存储,查询只需要加载相关的列。
六、引擎
Clickhouse 提供了丰富的存储引擎,存储引擎的类型决定了数据如何存放、如何做备份、如何被检索、是否使用索引。不同的存储引擎在数据写入/检索方面做平衡,以满足不同业务需求。
Clickhouse 提供了十多种引擎。
两种最重要的引擎:MergeTree、Distributed:
1.MergeTree
MergeTree 是 ClickHouse 中最先进的引擎,并由 MergeTree 衍生出了一系列的引擎,统称 MergeTree 系引擎。
特性:
支持主键索和日期索引。
可以提供实时的数据更新。
MergeTree 是 ClickHouse 数据库提供的最理想的引擎。
MergeTree 是 ClickHouse 数据库提供的最理想的引擎。
分区:
MergeTree 是 ClickHouse 数据库提供的最理想的引擎。
同一个分区的数据会被切割到不同的文件夹中。
当有新数据写入时,数据会被写入新的文件夹中,后台会有线程定时对这些文件夹进行合并。
每个文件夹中包含当前文件夹范围内的数据,数据按照主码排序,并且每个文件夹中有一个针对该文件夹中数据的索引文件。
分区新特性:
在老版本的 ClickHouse 中只支持按月分区。
在 1.1.54310 版之后,支持用户自定义分区。
可以通过 system.parts 表查看表的分区情况。
索引:
每个数据分区的子文件夹都有一个独立索引。
当 where 子句中在索引列及 Date 列上做了“等于、不等于、>=、<=、>、<、IN、bool 判断”操作,索引就会起作用。
Like 操作不会使用索引如下面的 SQL 将不会用到索引。
SELECT count()FROM table WHERE CounterID = 34 OR URL LIKE ‘%upyachka%’。
对于日期索引,查询仅仅在包含这些数据的分区上执行。
查询时最好指定主码,因为在一个子分区中,数据按照主码存储。所以,当定位到某天的数据文件夹时,如果这一天数据量很大,查询不带主码就会导致大量的数据扫描。
2.Distributed
Distributed 引擎并不存储真实数据,而是来做分布式写入和查询,与其他引擎配合使用。
比如:Distributed + MergeTree。
Distributed --> 写节点···写节点 读节点···读节点
MergeTree --> 数据节点数据节点数据节点数据节点.
Distributed 引擎可以认为是 Proxy,仅仅存有表结构
MergeTree 引擎可以认为是 DataNode,存储真实数据
Distributed 引擎需要指定如下参数:<集群名称,远程数据库名,远程表名,分片规则>
集群名:即当前集群名称。
远程数据库名:比如存储具体数据的MergeTree引擎的数据库名
远程表名:存储真实数据的表的名字。
分片规则:可选。
分片:一个 Distributed 表可以被切成多个分片(shard),分片之间没有数据重合。
副本:一个 Distributed 分片可以有多个副本,副本的数据完全相同。
数据读取过程:
查询被分发到远程 shards 上去并行执行。
当查询一个副本连接失败,会尝试其他副本。
查询会使用远程服务器上引擎的索引。
数据聚合之类的操作也会先在远程数据 Node 上进行,然后把中间结果发送到 Distributed 引擎所在服务器,做进一步聚合。
数据写入过程:
有两种数据写入方式:
直接将数据写入数据节点。这是最优的方式,因为数据是被分布式的并发写到每台数据节点上,效率会更高。
将数据写入distributed表。Distributed表再根据 shardingkey将数据分发到相应的shard上去。
七、不足
不支持事务。
聚合操作取决于单台机器的 RAM。
资料及文档较少、运维困难。
安装:
目前ClickHouse对ubuntu系统支持比较友好,对于centos就差一点。
Ubuntu有deb包可以直接安装。对于centos的则需要自己编译。
centos的yum安装方式:
1.添加yum源:
yum-config-manager --add-repo http://repo.red-soft.biz/repos/clickhouse/repo/clickhouse-el6.repo
2.安装:
yum install clickhouse-server clickhouse-client clickhouse-server-common clickhouse-compressor
3. 添加用户clickhouse
useradd clickhouse
4. 启动clickhouse
/etc/init.d/clickhouse-server start
5. 登录测试:
clickhouse-client
select 1
select now()
6.启动失败可以查看日志,日志的目录默认为
/var/log/clickhouse-server
交互模式
clickhouse-client
clickhouse-client --host=… --port=… --user=… --password=…
启用多行查询:
clickhouse-client -m
clickhouse-client --multiline
对于建表的时候就需要启用多行查询,否则会报错,比如建如下表:
CREATE TABLE `ontime` (
`Year` UInt16,
`Quarter` UInt8,
`Month` UInt8,
`DayofMonth` UInt8,
`DayOfWeek` UInt8,
`FlightDate` Date,
`UniqueCarrier` FixedString(7),
`AirlineID` Int32,
`Carrier` FixedString(2),
`TailNum` String,
`FlightNum` String,
`OriginAirportID` Int32,
`OriginAirportSeqID` Int32,
`OriginCityMarketID` Int32,
`Origin` FixedString(5),
`OriginCityName` String,
`OriginState` FixedString(2),
`OriginStateFips` String,
`OriginStateName` String,
`OriginWac` Int32,
`DestAirportID` Int32,
`DestAirportSeqID` Int32,
`CancellationCode` FixedString(1)
) ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192)
以批处理方式运行查询:
clickhouse-client --query=‘SELECT 1’
echo ‘SELECT 1’ | clickhouse-client
从指定格式的文件插入数据:
clickhouse-client --query=‘INSERT INTO table VALUES’ < data.txt
clickhouse-client --query=‘INSERT INTO table FORMAT TabSeparated’ < data.tsv
可以直接读取本地的文件进行查询,不用部署clickhouse-server
clickhouse-local -N test_table --file=‘a.txt’ --input-format=CSV -S “user String, age Int32” -q “SELECT * from test_table FORMAT Pretty”
-N 指定表名,如果不指定默认是table
–file 指定读取的文件
–input-format=CSV,指定读取文件的格式。这里是CSV格式
-S 定义表的字段以及类型
-q 指定查询语句。