一、先來說一下,ClickHouse為啥快
MySQL單條SQL是單線程的,只能跑滿一個core,ClickHouse相反,有多少CPU,吃多少資源,所以飛快;
ClickHouse不支持事務,不存在隔離級別。這里要額外說一下,有人覺得,你一個數據庫都不支持事務,不支持ACID還玩個毛。ClickHouse的定位是分析性數據庫,而不是嚴格的關系型數據庫。又有人要問了,數據都不一致,統計個毛。舉個例子,汽車的油表是100%準確么?為了獲得一個100%準確的值,難道每次測量你都要停車檢查么?統計數據的意義在于用大量的數據看規律,看趨勢,而不是100%準確。
IO方面,MySQL是行存儲,ClickHouse是列存儲,后者在count()這類操作天然有優勢,同時,在IO方面,MySQL需要大量隨機IO,ClickHouse基本是順序IO。
有人可能覺得上面的數據導入的時候,數據肯定緩存在內存里了,這個的確,但是ClickHouse基本上是順序IO,用過就知道了,對IO基本沒有太高要求,當然,磁盤越快,上層處理越快,但是99%的情況是,CPU先跑滿了(數據庫里太少見了,大多數都是IO不夠用)。
二、創建庫
CREATE/ATTACH DATABASE zabbix ENGINE = Ordinary;
ATTACH 也可以建庫,但是metadata目錄下不會生成.sql文件,一般用于metadata元數據sql文件被刪除后,恢復庫表結構使用
三、創建本地表
CREATE TABLE test02( id UInt16,col1 String,col2 String,create_date date ) ENGINE = MergeTree(create_date, (id), 8192);
ENGINE:是表的引擎類型,
MergeTree:最常用的,MergeTree要求有一個日期字段,還有主鍵。
Log引擎沒有這個限制,也是比較常用。
ReplicatedMergeTree:MergeTree的分支,表復制引擎。
Distributed:分布式引擎。
create_date:是表的日期字段,一個表必須要有一個日期字段。
id:是表的主鍵,主鍵可以有多個字段,每個字段用逗號分隔。
8192:是索引粒度,用默認值8192即可。
四、創建分布式表
CREATE TABLE distributed_table AS table ENGINE = Distributed(cluster, db, table, rand());
cluster:配置文件中的群集名稱。
db:庫名。
table:本地表名。
rand():分片方式:隨機。
intHash64():分片方式:指定字段做hash。
Distribute引擎會選擇每個分發到的Shard中的”健康的”副本執行SQL
五、DDL
如果想按集群操作,需要借助zookeeper,在config.xml中添加配置
<distributed_ddl>
<path>/clickhouse/task_queue/ddl</path>
</distributed_ddl>
一個節點創建表,會同步到各個節點
CREATE TABLE db.table [ON CLUSTER cluster] (...)
添加、刪除、修改列
ALTER TABLE [db].table [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...
rename 支持*MergeTree和Distributed
rename table db.table1 to db.table2 [ON CLUSTER cluster]
truncate table db.table;不支持Distributed引擎
六、delete/update 不支持Distributed引擎
ALTER TABLE [db.]table DELETE WHERE filter_expr...
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE ...
七、分區表
按時間分區:
toYYYYMM(EventDate):按月分區
toMonday(EventDate):按周分區
toDate(EventDate):按天分區
按指定列分區:
PARTITION BY cloumn_name
對分區的操作:
alter table test1 DROP PARTITION [partition] #刪除分區
alter table test1 DETACH PARTITION [partition]#下線分區
alter table test1 ATTACH PARTITION [partition]#恢復分區
alter table .test1 FREEZE PARTITION [partition]#備份分區
八、數據同步
- 采用remote函數
insert into db.table select * from remote('目標IP',db.table,'user','passwd')
- csv文件導入clickhouse
cat test.csv | clickhouse-client -u user --password password --query="INSERT INTO db.table FORMAT CSV"
- 同步mysql庫中表
CREATE TABLE tmp ENGINE = MergeTree ORDER BY id AS SELECT * FROM mysql('hostip:3306', 'db', 'table', 'user', 'passwd') ;
4) clickhouse-copier 工具
九、時間戳轉換
select toUnixTimestamp('2018-11-25 00:00:02');
select toDateTime(1543075202);
十、其他事項
clickhouse的cluster環境中,每臺server的地位是等價的,即不存在master-slave之說,是multi-master模式。
各replicated表的宿主server上要在hosts里配置其他replicated表宿主server的ip和hostname的映射。
上面描述的在不同的server上建立全新的replicated模式的表,如果在某臺server上已經存在一張replicated表,并且表中已經有數據,這時在另外的server上執行完replicated建表語句后,已有數據會自動同步到其他server上面。
如果zookeeper掛掉,replicated表會切換成read-only模式,不再進行數據同步,系統會周期性的嘗試與zk重新建立連接。
如果在向一張replicated表insert數據的時候zookeeper掛掉,這時候會拋一個異常,等到與zk重新建立連接以后,系統(其他replicated表所在server)會檢查本地文件與預期文件(保存在zk上)的差別,如果是輕微的差別,直接同步覆蓋,如果發現有數據塊損壞或者識別不了,則將這些數據文件移動到“detached”子目錄,然后重新根據zk所記錄的文件信息進行副本的同步。
drop掉某一臺server上的replicated表,不會對其他server上面的replicated表造成影響。