小陆同学

python 中文名:蟒蛇,设计者:Guido van Rossum

导航

大数据利器分享--clickhouse

之前使用数据库较多的是mysql,其次是redis和mongo。应对数据量较大的情况时:对mysql做了分区存储。mysql在常规情况下的存储量级是:2000万。但是当数据量越来越大的情况下,效率也会相应降低。

场景:从es获取了应用日志,入库后分析。首先用开源框架“达芬奇”将入库后的数据进行展示,默认展示7天,一张表大概12万数据量,整表数据量大概60万。表结构不算复杂、大数据量导致慢sql,达芬奇页面加载极慢。

于是将数据库切换成了大数据利器clickhouse,至今的数据量大概是440万,通过达芬奇尝试了,一次性查询这440数据量,秒级加载,无比厉害

当时切换数据库时候主要的选型有clickhouse和tidb。主要的使用场景:大量插入、少量修改、join查询。于是查了两款的区别,在dba的推荐下使用了ck。什么是ClickHouse? | ClickHouse Docs

最近调研了两种数据库,TiDB和clickhouse。
tidb比mysql快100倍;
clickhouse比tidb又快100倍。

这是因为clickhouse是列式存储,特别擅长olap。
tidb和Mysql是行式存储,非常擅长oltp;
tidb最大的优点是兼容 100%的mysql oltp场景,可以做数据横向扩展,解决了单机容量扩展的问题。
另外,tidb能解决80%的olap场景,但剩下的20%场景是对超大表的join却没有太多的性能提升,需要借助tispark。

在目前数据分析领域,必须引入新的工具,才能解决分析慢的问题;
如果单从提升硬件资源,换SSD,优化慢sql、设计合适的索引等,都是无法解决MySQL做大数据分析慢的问题的。

数据分析也是非常重要的一个事项,关乎着公司高层对公司发展的决策和引导。

目前,在tidb和clickhouse对比上,就是clickhouse查询速度太快了。
但是,我现在比较纠结的是clickhouse是能和mysql保持增量同步的,但是只支持insert语句的同步,对于update和delete目前还不支持。

python中使用ck

from clickhouse_driver import Client
from clickhouse_driver import connect
def clickhouse_conn():
    client = Client(host='1.1.1.1',port='9300',database='nglog',user='xxxxxx',password='xxxxxx')
     return client


client = clickhouse_conn()
client.execute(sql)

ck的问题:id不自增,于是使用了uuid作为主键

建表语句:

CREATE TABLE xxx_record  ON CLUSTER cluster_1shards_1replicas
(
 id UUID,
 host_name String,
 host_name_counts String,
 create_time DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/nglog/tables/{shard}/xxx_record','{replica}')
PARTITION BY toYYYYMMDD(create_time)   # 以创建时间做分区
PRIMARY KEY id
ORDER BY id;

插入数据。获取uuid的sql语句是:select generateUUIDv4(),在插入数据时用函数generateUUIDv4()来生成uuid

sql ="insert into 表名 values (generateUUIDv4(),'{port}','{ip}','{pro_name}','{domain}','{create_time}')".format(
 port=damin_obj.get('port'),
 ip=damin_obj.get('ip'),
 pro_name=damin_obj.get('pro_name'),
 domain=damin_obj.get('domain'),
 create_time=current_time
 )

 

过程中遇到的问题:在建表时候报错如下,是因为还有个从库,主从同步出现了问题,正常情况下,作了主从同步后,主库ddl后,从库也会执行同样的ddl,且不会报错。

SQL 错误 [122] [07000]: Code: 122, e.displayText() = DB::Exception: Table columns structure in ZooKeeper is different from local table structure (version 21.7.3.14 (official build))
, server ClickHouseNode(addr=http:1.1.1.1:9301, db=default)@2121917372

 

posted on 2022-05-27 18:54  小陆同学  阅读(1030)  评论(0编辑  收藏  举报