👈👈👈 欢迎点赞收藏关注哟
首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164...
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca...
一. 前言
写了一些项目后,渐渐发现,常规的数据库本身具有极限,在一些特定的场景下,整体就显得很吃力了。
到了这个时候,就要考虑使用其他类型的数据库了,这里就来学习一下 ClickHouse 这个数据库。
二. ClickHouse 功能和作用
2.1 Clickhouse 是个什么
@ clickhouse.com/docs/zh/int...
总结下来就是 :
- ClickHouse 是一个
列式数据库管理系统
。 注意 , 它不仅仅只是一个数据库
,还是一个管理系统
- 它具有一些优异的特性,包括
数据压缩
, 可以在磁盘上运行(有的数据库只能在内存运行),可以多核心并行
- 支持多服务器
分布式
处理 - 支持
SQL 语句
(基本上可以和 MySQL基本语句兼容 ,DDL 略有不同) - 支持
向量引擎
(这可以提高查询的性能) - 可以实时更新数据 (
写入不会有锁
,不会产生锁竞争) - 支持
索引
(可以通过等值比对和范围查询)
在性能方面 ,Clickhose 很强 ,我们自己业务系统的参数不好给出,可以看官方文档里面的 @ 性能 | ClickHouse Docs
内容补充 - 什么是列式数据库 ?
通常我们用的 MySQL Inner DB 就是行式数据库,行式场景下,每一行即为一个数据单元。列式数据库不一样,它每一列为一个数据单元。 如果以一个 JSON 图展示 ,他们的区别如下 :
内容补充 - 列式数据库的查询
这里借用官网的Gif图 ,效果就很清楚了 :
以上分别是行式数据库的读取方式和列式的对比 :
- 在行式数据库中,哪怕我们只需要一个字段,在读取空间和扫描逻辑上都是
对整行数据进行处理
,哪怕最后通过SQL写法只返回了一个值
- 而在列式读取过程中,由于一列里面数据独立,所以可以直接读取我们需要范围的所有单列数据。
内容补充 : 为什么列式数据库看起来很快 ?
- IO 更少 : 由于每次读取的数据更少,只需要读取需要的列,每次 IO 扫描都会减少很多
- 压缩更简单 : 按列分别存储可以让压缩更简单,当然根源还是让IO变少
- 向量引擎 : 虽然我还没搞懂这东西的原理,但是通过这个引擎能提高CPU的性能。数据不仅按列存储,同时会按照向量进行处理
2.2 ClickHouse 里面的引擎
ClickHouse 里面的引擎是用于查询和存储数据的,相对的,分为表引擎和查询引擎两种 :
- 表引擎 :
- MergeTree 系列 : Clickhouse 里面最常见的表引擎,支持分区,主键,索引
- Log : 轻量级表引擎,但是他是一种行式存储引擎
- CollapsingMergeTree : 特殊表引擎,支持在线聚合数据
- Distributed : 分布式表引擎
- 查询引擎 :
- Vectorized : 向量化查询引擎,通过向量算法提高查询效率
- Scalar : 标量查询引擎,使用传统的查询算法
- Distributed : 分布式查询引擎,将查询分到多个节点上,从而提高效率
当然学习这一块的时候还会有很多疑惑,在 ClickHouse 里面还有数据库引擎 ,而在官网里面,数据库引擎看起来像对应很多不同的数据库 (例如 MySQL , Atomic ),这又是什么?
以其中的 MySQL 数据库引擎为例 ,MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换
。
MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中
@ clickhouse.com/docs/zh/eng...
总结 : 所以,数据库引擎在我看来主要是一层代理。
三. Docker 部署 ClickHouse
因为只是基础的使用,这里直接选择 Docker 部署 :
与其他的 DB Docker 相比, ClickHouse 的部署稍微有点麻烦,其核心点在于配置文件的问题,由于 Docker 部署的时候需要配置文件,所以需要
需要启动2次数据库,在此期间
java
// S1 : 拉取 Clickhouse 镜像
docker pull clickhouse/clickhouse-server
// S2 : 创建基本路径
mkdir -p /data/clickhouse/data /data/clickhouse/config /data/clickhouse/log
// S3 : 第一次启动容器 (用于生成配置文件)
docker run -d --name clickhouse-server --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 -p 9009:9009 clickhouse/clickhouse-server:latest
// S4 : 把 Clickhouse 容器中的配置文件拷贝出来
docker cp clickhouse-server:/etc/clickhouse-server/config.xml /data/clickhouse/config/config.xml
docker cp clickhouse-server:/etc/clickhouse-server/users.xml /data/clickhouse/config/users.xml
// S5 : 对拷贝的文件进行配置- 密码配置 (这里会得到一串密码)
PASSWORD=$(base64 < /dev/urandom | head -c14); echo "123456"; echo -n "123456" | sha256sum | tr -d '-'
vim /data/clickhouse/config/users.xml
?- 此处修改其中 <password></password> 部分,修改其为 password_sha256_hex ,再将上面拿到的密码配置进去
<password_sha256_hex>87c84143f4fad12664d0ad8915874f509a5b2e82d85957176a541905509d6755</password_sha256_hex>
- 如果要后续访问,需要修改 config
vim /data/clickhouse/config/config.xml
- <listen_host>::</listen_host> : 将这一配置注释打开
// S6 : 移除刚才的容器,后面重新部署
docker rm -f clickhouse-server
// S7 : 重新部署一个 ClickHouse
docker run -d --name clickhouse-server --ulimit nofile=262144:262144 \
-p 8123:8123 -p 9000:9000 -p 9009:9009 \
-v /data/clickhouse/data:/var/lib/clickhouse:rw \
-v /data/clickhouse/log:/var/log/clickhouse-server:rw \
-v /data/clickhouse/config/config.xml:/etc/clickhouse-server/config.xml \
-v /data/clickhouse/config/users.xml:/etc/clickhouse-server/users.xml \
clickhouse/clickhouse-server:latest
如何访问 :
- 端口号 : ClickHouse 上文中提到了3个端口 :
- 9000:TCP 端口,用于 Clickhouse 客户端连接。
- 8123:TCP 端口,用于 Clickhouse WebUI 连接。
- 8124:TCP 端口,用于 Clickhouse 的 HTTP API 连接。
- UI 访问界面 : zhuanlan.zhihu.com/p/355043330
- 上述文章里面推荐了5种方式,我本人不太熟,这里选择 tabix 进行访问
java
// S1 : 运行容器
docker run -d -p 8080:80 spoonest/clickhouse-tabix-web-client
- PS : 也可以设置用户密码连接
docker run -d -p 8080:80 -e USER='myuser' -e PASSWORD='mypass' spoonest/clickhouse-tabix-web-client
此处通过8080访问即可 :
Tabix 界面详情
四. 基础使用
这里我只展示我学习过程中记录的几个 SQL :
DDL 语句
SQL
-- 创建数据库
CREATE DATABASE IF NOT EXISTS test_database;
-- 删除数据库
DROP database test_database;'
-- 创建一张表
CREATE TABLE test_database.user (
id Int32,
name String,
age Int32
) ENGINE = MergeTree() PRIMARY KEY id ORDER BY id
-- 删除一张表
DROP table if exists test_database.user;
-- 添加字段
alter table test_database.user add column `remark` String DEFAULT '' COMMENT '备注';
-- 修改字段
alter table test_database.user modify column `remark` Nullable(String) DEFAULT NULL COMMENT '备注';
-- 删除字段
alter table test_database.user drop column `remark`;
到这里一个表就创建完成了。
增删改查
sql
-- 插入一条数据
INSERT INTO test_database.user (*) VALUES (1, '测试创建一条数据', 23) ;
-- 删除数据
ALTER TABLE test_database.user DELETE WHERE id = 1;
-- 修改数据
ALTER table test_database.user update name = '测试修改数据' where id = 1
-- 查询数据 (不深入了,按照文档基本上兼容大部分 SQL 语法)
select * from test_database.user
select * from test_database.user where id = 1
更详细的可以参考文档 :clickhouse.com/docs/zh/sql...
总结
对于列数据库,由于使用不算很深入,没办法说出太多的原理。
简单来说 ,其性能优异,根本原因在于处理的列更少了,而且可以借助压缩和向量算法来实现快速处理。
而在使用上, 既可以自己存储数据,又可以作为其他数据库的映射来使用。
最后,这一篇不涉及到 Java 的调用,下一篇会写出来,欢迎关注。