[TOC]

DDL

创建DB

CREATE DATABASE flow_snmp ON CLUSTER clickhouse_remote_servers  ENGINE = Ordinary;

创建数据库表

CREATE TABLE lxl_test_flow_snmp.rename_test ON CLUSTER clickhouse_remote_servers
(
    `pipe_id` UUID,
    `time` DateTime,
    `in_flow` Float64,
    `out_flow` Float64,
    `in_bps` Float64,
    `out_bps` Float64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/rename_test', '{replica}')
PARTITION BY toYYYYMM(time)
ORDER BY (pipe_id, time)
SETTINGS index_granularity = 8192

修改数据库表名

1
RENAME TABLE flow_snmp.flow_data_first_local TO flow_snmp.flow_data_first_local_v1 ON CLUSTER cluster_1shards_3replicas

添加字段

alter table slb_monitor.slb_monitor_data_local add column vm_id UUID 

DML

删除分区数据

client.execute("ALTER TABLE flow_snmp.flow_data_second_local DROP PARTITION '202107'")

查询数据(防注入)

1
2
3
4
5
6
7
8
9
10
11
query_sql = "select time, all_conn, all_in_pkts, all_out_pkts, all_in_bytes, all_out_bytes from slb_monitor_data_all where vm_id = %(slb_vm_id)s and listen_id = %(listen_id)s order by time desc limit 1;"
params = {
'slb_vm_id': slb_vm_id,
'listen_id': listen_id,
}
res = ck_client.execute(query_sql, params)


# in查询语法,假设查询列名为 column1
query = 'SELECT * FROM your_table WHERE column1 IN (%(values)s)'
params = {'values': ['value1', 'value2', 'value3']}

批量插入

1

修改数据

  • ck中数据的修改和删除都很困难,一开始ck直接是不支持这两个操作的
  • 在集群中修改数据,修改命令只能面向本地表,不能面向分布式表进行操作,问题在于比如有两个分片,1-10号数据均匀分布在两个分片中
    • 首先直接向某一个分片的本地表进行修改是可以成功的,且修改会自动被同步到分片的复制节点上
    • 但是我们不能写个循环对每个分片进行修改,这样的方式显得蠢笨,ck提供了一个命令向集群中所有分片的本地表进行修改
      ALTER TABLE flow_snmp.flow_data_first_local ON CLUSTER clickhouse_remote_servers UPDATE in_bps = 5555,out_bps = 2222 WHERE pipe_id = ‘4b9ed63c-ae84-11ec-87f3-1200cba86117’ and time > ‘2022-04-11 16:05:00’;
    • 上面的命令看起来很美,实际上执行的时候会超时(30s),但是呢数据又确实被修改成功了,体现出了一种不确定性
    • 所幸目前线上库是1个分片三个复制,所以我不用加集群,直接对某个复制的本地表进行修改,改动就能成功的被同步到剩下的两个复制节点上,但问题没有完全解决
      ALTER TABLE flow_snmp.flow_data_first_local UPDATE in_bps = 5555,out_bps = 2222 WHERE pipe_id = ‘4b9ed63c-ae84-11ec-87f3-1200cba86117’ and time > ‘2022-04-11 16:05:00’;
  • 总结ck的修改是不稳定的,据说是异步进行的没有原子性,但效率其实还可以,面向一个7000w规模的分区进行修改,改动数据量小不超过100条时还是可以立马修改完成的

删除数据

和修改数据情况类似,给出命令ALTER TABLE flow_snmp.flow_data_first_local ON CLUSTER clickhouse_remote_servers DELETE WHERE pipe_id = '4b9ed63c-ae84-11ec-87f3-1200cba86117' and time = '2022-04-11 16:00:00';