1.Transaction
ClickHouse不支持事务,也就不存在隔离级别。这里要额外说一下,有人觉得,一个数据库都不支持事务,不支持ACID还玩个毛。ClickHouse的定位是分析性数据库(OLAP系列),而不是严格的关系型数据库。又有人要问了,数据都不一致,统计个毛。举个例子,汽车的油表是100%准确么?为了获得一个100%准确的值,难道每次测量你都要停车检查么?统计数据的意义在于用大量的数据看规律,看趋势,而不是100%准确。
2.IO
在IO方面,以MySQL为例,MySQL为行存储,ClickHouse为列存储,后者在count()这类操作天然有优势,同时,在IO方面,MySQL需要大量随机IO,ClickHouse基本是顺序IO。有人可能觉得上面的数据导入的时候,数据肯定缓存在内存里了,这个的确,但是ClickHouse基本上是顺序IO,用过就知道了,对IO基本没有太高要求,当然,磁盘越快,上层处理越快,但是99%的情况是,CPU先跑满了(数据库里太少见了,大多数都是IO不够用)。
3.Mutation 查询
ClickHouse 提供了 Delete 和 Update 的能力,这类操作被称为 Mutation 查询,它可以看做 Alter 的一种。
虽然可以实现修改和删除,但是和一般OLTP 数据库不一样,Mutation 语句是一种很“重”的操作,而且不支持事务。
“重”的原因主要是每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区。所以尽量做批量的变更,不要进行频繁小数据的操作。
➢ 删除操作
alter table t_order_smt delete where sku_id ='sku_001';
➢ 修改操作
alter table t_order_smt update total_amount=toDecimal32(2000.00,2) where id =102;
由于操作比较“重”,所以 Mutation 语句分两步执行,同步执行的部分其实只是进行新增数据新增分区和并把旧分区打上逻辑上的失效标记。直到触发分区合并的时候,才会删除旧数据释放磁盘空间,一般不会开放这样的功能给用户,由管理员完成。
4.数据同步
a. 采用remote函数
适用小表,操作方便;大表速度较慢。
insert into db.table select * from remote('目标IP',db.table,'user','passwd')
b. csv文件导入clickhouse
cat test.csv | clickhouse-client -u user --password password --query="INSERT INTO db.table FORMAT CSV"
c. 同步MySQL
同步MySQL详情信息请点击:ClickHouse王炸功能来袭之同步Binlog
CREATE TABLE tmp ENGINE = MergeTree ORDER BY id AS SELECT * FROM mysql('hostip:3306', 'db', 'table', 'user', 'passwd') ;
d. clickhouse-copier 工具
这个工具是标准发布的clickhouse server的一部分,它可以在完全并行的模式下工作, 并以最有效的方式分发数据。
并行操作,可以变更表名主键,可以变更分区;但是配置繁琐,需要借助zookeeper使用。
clickhouse-copier配置文件:一个是zk的zookeeper.xml配置,一个是迁移任务的task.xml配置。
补充
clickhouse_copier为了能保证任务失败可以继续执行,会在zk上保留一些状态信息。
[zk: localhost:2181(CONNECTED) 0] ls /clickhouse/copytasks/test/
description tables task_active_workers task_active_workers_version
在zk上除了刚刚自行创建的description,还自动生成了其余三个。
tables记录了表的同步任务,如下:
[zk: localhost:2181(CONNECTED) 0] ls /clickhouse/copytasks/test/tables/dst_cluster.default.test_copy
dst_cluster.default.test_copy
task_active_workers记录了有哪些正在执行任务的worker
task_active_workers_version记录了任务执行到哪个阶段,如下:
[zk: localhost:2181(CONNECTED) 1] get /clickhouse/copytasks/test/task_active_workers_version
/clickhouse/copytasks/test/tables/dst_cluster.default.test_copy/1992/piece_4/shards/1
官方文档:https://clickhouse.tech/docs/en/operations/utilities/clickhouse-copier/
5.其他盲区事项
a. clickhouse的cluster环境中,每台server的地位是等价的,即不存在master-slave之说,是multi-master模式。
b. 各replicated表的宿主server上要在hosts里配置其他replicated表宿主server的ip和hostname的映射。
c. 上面描述的在不同的server上建立全新的replicated模式的表,如果在某台server上已经存在一张replicated表,并且表中已经有数据,这时在另外的server上执行完replicated建表语句后,已有数据会自动同步到其他server上面。
d. 如果zookeeper挂掉,replicated表会切换成read-only模式,不再进行数据同步,系统会周期性的尝试与zk重新建立连接。
e. 如果在向一张replicated表insert数据的时候zookeeper挂掉,这时候会抛一个异常,等到与zk重新建立连接以后,系统(其他replicated表所在server)会检查本地文件与预期文件(保存在zk上)的差别,如果是轻微的差别,直接同步覆盖,如果发现有数据块损坏或者识别不了,则将这些数据文件移动到“detached”子目录,然后重新根据zk所记录的文件信息进行副本的同步。
f. drop掉某一台server上的replicated表,不会对其他server上面的replicated表造成影响。
更多精彩内容欢迎关注公众号