zoukankan      html  css  js  c++  java
  • ClickHouse集群方案测评

    本文首发于:行者AI

    回合对战数据指标计算,耗时过长,甚至因为单机内存不足无法满足需求,故考虑将原本单节点的单机ClickHouse改为集群 , 采用分布式表来进行相关计算。

    1. 环境搭建

    1.1 单机方案

    ClickHouse实例 CPU 内存 磁盘
    ClickHouse 16C 64G 4T , 高IO

    1.2 集群方案 3分片1复本

    ClickHouse实例 CPU 内存 磁盘
    ClickHouse1 16C 64G 4T , 高IO
    ClickHouse2 8C 32G 1T , 超高IO
    ClickHouse3 8C 32G 1T , 超高IO

    2. 方案对比

    2.1 写入速度对比

    数据量 : 26910101 Rows

    方案一 : 单机方案( 全量数据插入单机表 )

    ClickHouse实例 写入速度
    ClickHouse 26.009 sec ;1.03 million rows/s , 504.78 MB/s

    方案二 : 集群方案( 数据写入物理表,分别并行向3台机器物理表写入数据 )

    ClickHouse实例 写入速度
    ClickHouse1 13.640 sec; 1.97 million rows/s., 320.96 MB/s
    ClickHouse2 9.166 sec ; 2.94 million rows/s, 982.03 MB/s
    ClickHouse3 9.632 sec; 2.79 million rows/s., 931.00 MB/s

    结论 : 写入数据速度和磁盘IO有关 , 集群方案数据写入相比单机方案有显著优势。

    2.2 查询对比(主要针对分组查询和关联查询操作)

    (1)分布式建表方法

    --物理表
    
    CREATE table rd_physical.rd_baseinfo_physical on cluster cluster_3shards_1replicas
    (
    `appId` String,
    `pvpId` String,
    `accountId` String,
    `userName` String,
    `round` Nullable(Int32),
    `event` String,
    `mode` Nullable(Int32),
    `win` Int32,
    `country` String,
    `timeStamp` String,
    `ts` DateTime,
    `ds` Date
    )
    ENGINE = ReplicatedMergeTree('/clickhouse/rd_physical/tables/{shard}/rd_baseinfo_physical', '{replica}')
    PARTITION BY (ds)
    ORDER BY (appId, accountId, pvpId)
    SETTINGS index_granularity = 8192
    
    --逻辑表
    
    CREATE table rd_data.rd_baseinfo on cluster cluster_3shards_1replicas
    (
    `appId` String,
    `pvpId` String,
    `accountId` String,
    `userName` String,
    `round` Nullable(Int32),
    `event` String,
    `mode` Nullable(Int32),
    `win` Int32,
    `country` String,
    `timeStamp` String,
    `ts` DateTime,
    `ds` Date
    )
    ENGINE =Distributed(cluster_3shards_1replicas, rd_physical, rd_baseinfo_physical, cityHash64(accountId))
    

    (2)分组查询

    SQL语句 : select count(*) , accountId,pvpId from rd.rd_baseinfo where ds>='2019-12-01' and ds<'2020-01-01' group by accountId ,pvpId ;

    单机方案 集群方案
    10.177 sec ; 78.81 million rows/s., 2.66 GB/s 6.264 sec ;104.32 million rows/s., 3.46 GB/s

    结论 : 集群方案对数据分类查询效率比单机高出25%左右。

    (3)关联查询

    关联方式 单机方案 集群方案
    500万 join 100万 0.946 sec; 0.86 million rows/s., 53.29 MB/s 0.920 sec; 1.09 million rows/s., 75.70 MB/s
    1000万 join 100万 0.880 sec; 0.94 million rows/s., 58.80 MB/s 0.921 sec; 1.09 million rows/s., 75.59 MB/s
    2000万 join 100万 0.938 sec; 0.87 million rows/s., 53.96 MB/s 0.923 sec; 1.08 million rows/s., 75.41 MB/s
    5000万 join 100万 0.940 sec; 0.86 million rows/s., 53.81 MB/s 0.960 sec; 1.04 million rows/s., 72.53 MB/s
    1亿 join 100万 1.906 sec; 0.90 million rows/s., 56.56 MB/s 1.135 sec; 880.95 thousand rows/s., 61.34 MB/s.
    500万 join 500万 5.141 sec; 1.01 million rows/s., 74.07 MB/s 3.791 sec; 1.32 million rows/s., 91.46 MB/s
    1000万 join 500万 5.149 sec; 1.01 million rows/s., 73.92 MB/s 4.127 sec; 1.21 million rows/s., 84.00 MB/s
    2000万 join 500万 5.172 sec; 1.00 million rows/s., 73.46 MB/s 4.110 sec; 1.22 million rows/s., 84.36 MB/s
    5000万 join 500万 5.096 sec; 1.02 million rows/s., 75.00 MB/s 4.342 sec; 1.15 million rows/s., 79.84 MB/s
    1亿 join 500万 6.108 sec; 1.02 million rows/s., 74.75 MB/s 4.362 sec; 1.15 million rows/s., 79.49 MB/s
    500万 join 1000万 12.341 sec; 1.16 million rows/s., 85.39 MB/s 7.885 sec; 1.27 million rows/s., 87.61 MB/s
    1000万 join 1000万 12.337 sec; 1.16 million rows/s., 85.44 MB/s 7.916 sec; 1.26 million rows/s., 87.27 MB/s
    2000万 join 1000万 12.324 sec; 1.17 million rows/s., 85.61 MB/s 7.777 sec; 1.29 million rows/s., 88.84 MB/s
    5000万 join 1000万 13.039 sec; 1.14 million rows/s., 87.10 MB/s 8.083 sec; 1.24 million rows/s., 85.46 MB/s
    1亿 join 1000万 13.101 sec; 1.13 million rows/s., 86.43 MB/s 8.578 sec; 1.17 million rows/s., 80.53 MB/s

    结论 : 小数据量join操作 , 单机方案和集群方案差异很小 ; 大数据量单机方案不如集群方案 , 单机方案还可能会存在内存不足等问题。

    3. 其他方面

    ClickHouse并发较小 , 官网查询建议100 Queries / second , 单机ClickHouse不适合做业务型高并发查询。ClickHouse集群可以通过chproxy 将并发的查询代理到集群上各分片上去作查询 , 可以极大提高了并发量。

    4. 性能测试总结

    单机方案写数据的性能上远不如集群方案。

    查询方面, 数据量小时的查询单机方案和集群方案相差不明显, 数据量大时集群方案不会存在内存,cup不足等问题,同时查询的效率也高于单机方案。

    集群方案相较于单机方案 , 建表略有繁琐 , 分布式表写数据无法实时写入各个分片物理表 , 而会先写入内存然后同步到各个分片,故我们需要向每个分片的物理表同时写入数据。

    综上, 目前round和roundData数据量越来越大 ,搭建集群分布式存储数据方案是可行的。


    PS:更多技术干货,快关注【公众号 | xingzhe_ai】,与行者一起讨论吧!

  • 相关阅读:
    java web开发中会遇到的异步执行方案
    MySQL中进行树状所有子节点的查询
    node.js ----NPM使用介绍
    Node.js--学习笔记
    node.js介绍及Win7环境安装测试(转)
    Jmeter中Websocket协议支持包的使用(转)
    jmeter---将回应数据写入到文件
    JMeter 插件 Json Path 解析 HTTP 响应 JSON 数据(转)
    python + Pyglet ---播放视频
    转 RTSP客户端模拟器(TCP方式,Python实现)
  • 原文地址:https://www.cnblogs.com/xingzheai/p/14250288.html
Copyright © 2011-2022 走看看