• 大数据利器分享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
  • 相关阅读:
    mysqlp批量替换的sql语句
    Paypal 支付功能的 C# .NET / JS 实现
    Layui table 组件的使用:初始化加载数据、数据刷新表格、传参数
    WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决
    entity framework codefirst 用户代码未处理DataException,InnerException基础提供程序在open上失败,数据库生成失败
    《设计模式》一书中的23种设计模式
    C++程序实例唯一方案,窗口只打开一次,程序只打开一次
    重构——与设计模式的恋情
    重构——一个小例子
    C#通过调用WinApi打印PDF文档类,服务器PDF打印、IIS PDF打印
  • 原文地址:https://www.cnblogs.com/lutt/p/16318791.html
Copyright © 2020-2023  润新知