- 介绍
ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP)
适合单条sql的查询 多表join能力较差
- 特点
列式储存
对应列的聚合,计算,求和速度优于行式储存
又于列的数据类型相同 可以使用更加高效的压缩方式
数据压缩的更好 一方面节约磁盘空间 另一方面对cache(高速缓存器)有更大 的发挥空间
吞吐量高、性能强,一致性、事务性较弱
数据易维护,当我们更新数据时,历史数据会有版本号,不会被改变或者消失。
缺点也很明显。列式存储在表关联上不方便 适合数据分析 不适合复杂业务
DBMS功能
完成了标准的SQL语法 DDL ,DML含有大量函数(不支持自定义函数) 用户管理好权限管理,含有数据备份和恢复
多样化引擎
多种引擎 适应不同的业务场景 20多种 合并树,日志 ,接口,等等
高吞吐写入
ClickHouse采用类LSM Tree的结构,数据写入后定期在后台Compaction。
ckHouse在数据导入时全部是顺序append写 compaction时也是多个段merge sort后顺序写回磁盘
官方公开benchmark测试显示能够达到50MB-200MB/s的写入吞吐能力,按照每行100Byte估算,大约相当于50W-200W条/s的写入速度。
#### 数据分区与线程级并行
单条Query就能利用整机所有CPU ,分区建索引 ,并行查询
有一个弊端就是对于单条查询使用多cpu,就不利于同时并发多条查询
- Clickhouse安装
- 1 关闭防火墙
systemctl status firewalld.service systemctl stop firewalld.service systemctl start firewalld.service
- 2 安装依赖
每个节点执行 sudo yum install -y libtool sudo yum install -y *unixODBC*
- 3 CentOS打开文件数数限制 取消 SELINUX
$ sudo vim /etc/security/limits.conf #添加以下内容 * soft nofile 65536 * hard nofile 65536 * soft nproc 131072 * hard nproc 131072 $ sudo vim /etc/security/limits.d/20-nproc.conf #添加以下内容 * soft nofile 65536 * hard nofile 65536 * soft nproc 131072 * hard nproc 131072 sudo vim /etc/selinux/config SELINUX=disabled
节点同步文件
重启服务器
- 4 在线安装 每台都需要
sudo yum install yum-utils sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64 sudo yum install clickhouse-server clickhouse-client
或者通离线安装 sudo rpm -ivh *.rpm
- 5 修改配置文件
sudo vim /etc/clickhouse-server/config.xml 把:: 的注释打开,这样的话才能让ClickHouse被除本机![image.png](/img/bVcU1T3) 分发配置文件
- 6 启动clickhouse
sudo systemctl start clickhouse-server` 连接测试 clickhouse-client -m 或者: TZ=Asia/Shanghai clickhouse-client -m -m是可以换行输入命令分片集群的部署
注意:ClickHouse的集群是表级别的,实际企业中,大部分做了高可用,但是没有用分片,避免降低查询性能以及操作集群的复杂性。
* 配置6节点的集群和副本 三分片二副本
创建/etc/clickhouse-server/config.d/metrika-shard.xml 文件
修改文件
true hadoop101 9000 hadoop102 9000 true hadoop103 9000 hadoop104 9000 true hadoop105 9000 hadoop106 9000
同步分发,重启服务
- 创建集群表
会自动同步 但每个节点上只可以查自己的数据
create table st_order_mt on cluster gmall_cluster ( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime ) engine =ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt_0108','{replica}') partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id);
创建总表(可以查看所有节点分片数据)
create table st_order_mt_all on cluster gmall_cluster ( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime )engine = Distributed(gmall_cluster,default, st_order_mt,hiveHash(sku_id));