clickhouse 实时数据更新方案求助 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
KJH
V2EX    程序员

clickhouse 实时数据更新方案求助

  •  
  •   KJH 190 天前 4398 次点击
    这是一个创建于 190 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬架构师们,紧急求助

    我们有个报表类的需求,目前架构设计如下

    数据量:1TB 左右 数据流转流程 业务数据->( kafka 、flink )->数据仓库( MySQL)->通过 ETL 抽取->Clickhouse->报表呈现

    由于我们报表对实时性要求比较高,而且在生成报表的时候涉及到的表多、逻辑也复杂,不得已我们将数据仓库的数据原封不动的同步到了 clickhouse ,后面在进行报表生成计算的时候,全部查 clickhouse 的数据最后生成大宽表。

    我知道 clickhouse 是列式存储,对数据得删除和更新都是重量级操作,而我们的数据都是业务数据,更新比较频繁,所以我们采用了先删后插的策略,alter table delete (同步删非异步)。

    这就导致我们的数据更新周期最低也要 1 个小时

    之前考虑个几种方案

    1. 使用 ReplacingMergeTree 引擎,只追加数据,不删除,然后查询通过 final 或这 argMax 取最新数据,但是这有两个问题,一:final 没办法进行表关联查询, 二:argMax 对我们改动太大太大,表字段页表字段也比非常多( 100+)
    2. 对于实时性要求高的报表 不再去查 clickhouse , 直接查数据仓库

    我比较中意第二种,因为我是在想不出更好的方案了,想请教下各位架构师们有没有比较好的方案

    在此拜谢

    第 1 条附言    190 天前
    谢谢各位架构师大佬

    总结一下

    clickhouse 不是和数据频繁更新的场景,所以针对我的这个场景需求,就不用再去折腾 clickhouse ,无论是表分区还是更改表引擎,终究满足不了实时或接近实时的效果。如果是那种日志、埋点类的数据使用 clickhouse 还是非常不错的

    针对数据频繁更新的场景,大佬们推荐使用 doris 和 starrocks

    我也简单的了解了下,这两个库确实对数据频繁更新的场景比较友好,而且我只需要设置主键,然后不断的往里插数据就行了,还不用写 update 语句,很符合我们的业务场景。

    接下来我尝试测试 doris 库,没问题就正常应用了。

    再次拜谢各位大佬
    41 条回复    2025-04-26 11:31:02 +08:00
    hongye
        1
    hongye  
       190 天前   1
    可以看下 物化视图 是不是能够解决,我们当时是 通过物化视图生成 聚合表。
    skymei
        2
    skymei  
       190 天前   1
    最近再调研数据库,原先也准备用 clickhouse ,后面发现 doris 更适合,数据更新上支持也更好
    KJH
        3
    KJH  
    OP
       190 天前
    @hongye 之前了解过物化视图,只能监听到源表新增的数据,如果数据变更 是不会触发物化视图的,不太适合我们的场景 T.T
    KJH
        4
    KJH  
    OP
       190 天前
    @skymei 我看看
    hongye
        5
    hongye  
       190 天前   1
    @KJH #3 如果实时性要求没那么高,可以手动触发
    KJH
        6
    KJH  
    OP
       190 天前
    @hongye 我们对实时性要求很高,想数据发生变化后 立刻就能看到报表的变化,最少也得 5-10 分,但这个数据量要同步更新到 clickhouse 以及跑宽表 ,这么短时间确实不太好做到
    ranxy
        7
    ranxy  
       190 天前 via iPhone   1
    1T 数据不多啊,可以试试把 mysql-etl-clickhouse 换成 tidb+tiflash 看看?
    suixn
        8
    suixn  
       190 天前   2
    换 starrocks 或者 doris, clickhouse 不适合这个场景
    xiaolongorigino
        9
    xiaolongorigino  
       190 天前   1
    简单,打宽放到计算引擎去做,状态过大就把维表数据放 Hbase ,CK 提供对外查询。这点数据,优化都不用做,建好主键随便查
    Desdemor
        10
    Desdemor  
       190 天前   1
    我们是用 final 查出来 然后在代码里处理的,clickhouse 并发好像不太行的
    KJH
        11
    KJH  
    OP
       190 天前
    @ranxy 我们比较依赖云服务商,他们没 tidb 这个产品 [捂脸]

    @suixn 好 ,刚刚有位大佬也让我看了看 doris ,我看了下这两个确实比较适合数据频繁更新的场景,我再深入研究研究

    @xiaolongorigino 宽表确实是在计算引擎中生成的,报表查询的时候通过 ck 查宽表,hbase 我了解下

    @Desdemor 确实,我们更新的时候,并发一多,处理的任务就堆积下来了
    jon202107
        12
    jon202107  
       190 天前   1
    数据加上版本号,有一个地方记录最新的版本号,查询时带上版本号,这样感觉可行
    JRay
        13
    JRay  
       190 天前   1
    之前我们也遇到需要实时更新的,几种方案试过之后放弃了,换成了 doris
    vacuitym
        14
    vacuitym  
       190 天前   1
    有实时的建议不要用 ck ,或者每次查询用 final 做个强制同步(很占 cpu 和内存)
    glacer
        15
    glacer  
       190 天前   1
    跟我前司架构比较像(物联网行业)。我们当时的架构方案:
    使用 VersionedCollapsingMergeTree ,可以在表数据只追加的情况下,通过查询取得最新状态的数据。然后定时 optimize 表就行。
    NotLongNil
        16
    NotLongNil  
       190 天前   1
    ReplacingMergeTree 在查询时会降低性能,物化视图也有严重的性能问题。如果你们的 clickhouse 版本比较新,可以试试一个轻量删除( https://clickhouse.com/docs/zh/guides/developer/lightweight-delete )的特性。doris 的资源占用和性能,没有 clickhouse 那么优秀,相等的查询速度需要的资源至少是 clickhouse 的三四倍。没有万金油,如果你们的数据频繁更新其实不大适合 clickhouse
    KJH
        17
    KJH  
    OP
       190 天前
    @jon202107 这个方案我们也考虑过,查询的时候带版本号意味着也要做去重的那种操作,我们改动比较大,所以后面放弃了


    @JRay 我上午 了解了下,StarRocks 或者 doris 确实是比较合适的方案,我再深入研究研究

    @vacuitym final 相当于合并了,而且没办法表关联查,后来我们就 pass 掉这个方案了

    @glacer 通过查询指的还是 final 或者 argMax 这些近些处理吧

    @NotLongNil 是的,有考虑个轻量级删除,不过还没实际测试,我想的是 如果每 5 分钟删一次,会不会有其他潜在问题,后面我测试下
    v2day
        18
    v2day  
       190 天前   1
    看场景有 2 个问题,需要在新方案上注意下(之前遇见过
    1. 实时性要求比较高 ,这是要从 1 小时缩短到 小于 5 分钟 么?
    - 这个在上述提到的软件上都能搞;业务新鲜度延迟取决 op 提到的 数仓时效性了
    2. OLTP 数据 ETL 同步到 OLAP ,原文说更新比较频繁;这部分包含 add/drop/ 么?
    - 如果只是 DML 的 insert / update / delete ,用 starrocks 这类 Primary key 这种表能实现原地更新和删除;目前公司环境很稳定; DDL 的话需要根据 case by case 设计了
    3. ETL (同步、加工)
    - 「数据源 / MySQL 」 --> Flink -- > StarRocks PK table ;直接ods 1:1 复制到底层,方便做数据质量校验;避免业务组说 ETL 后数据对不上的现象
    - 数仓加工( dwd dws )都在 starrocks 上跑;配合 bi 产品目前无计算压力(聚合/metrics )
    KJH
        19
    KJH  
    OP
       190 天前
    @v2day 看来只能是从 StarRocks 和 doris 这里面入手了,整体架构还得在调整下,但我们目前已经有了 MYSQL 做数据仓,不太可能替换为 StarRocks ,只能考虑 数据仓 到 StarRocks 这步。
    nedqqcc
        20
    nedqqcc  
       190 天前   1
    doris 或者试试 pinot ,目前在用 pinot
    之前调研过,胆子大的话可以看看 time-plus ,就是一套 realtime db+clickhouse
    pulutom40
        21
    pulutom40  
       190 天前 via iPhone   1
    我有个跟你类似的需求,用的是 Starrocks ,sr 使用聚合索引表,需要经常更新的值设置成 replace 聚合,每次新插入就更新了。

    目前 4T+数据
    superliy
        22
    superliy  
       190 天前   1
    StarRocks 感觉使用场景很多啊,用过的人都说好。。
    yh7gdiaYW
        23
    yh7gdiaYW  
       190 天前   1
    doris 或 starrocks ,这俩本质上差不多,没有二次开发能力不要碰 clickhouse
    KJH
        24
    KJH  
    OP
       190 天前
    @nedqqcc @yh7gdiaYW 好的,目前在尝试 doris


    @pulutom40 @superliy 云服务商不支持 starrocks [捂脸] 只能考试 doris 了
    NotLongNil
        25
    NotLongNil  
      &nbp;190 天前   1
    @KJH #17 如果使用轻量删除,控制好时间和每次删除的数量,性能还是很可观的
    bitmin
        26
    bitmin  
       190 天前   1
    我数据量还很少,买的阿里云的 selectdb ,也就是 doris ,自己布了个 Apache SeaTunnel 在同步数据,希望你们多用用帮我多踩踩坑
    KJH
        27
    KJH  
    OP
       190 天前
    @NotLongNil ok 我们也考虑试试 ,谢谢

    @bitmin 你的 doris 是哪个版本呀
    NoString
        28
    NoString  
       189 天前   1
    如果必须是 Ck 我可以提供一个思路,就是分区 REPLACE ,每次更新就建一个复制表 写入之后就 REPLACE 分区,这样基本都是平滑且是 O1 ,然后更新频次就看写入速度了
    NoString
        29
    NoString  
       189 天前   1
    可以小小参考一下: https://kelovp.tech/nostring/blog/1712/
    bitmin
        30
    bitmin  
       189 天前   1
    @KJH selectdb 内核版本 4.0.4 。合入了 Apache Doris v3.0.3 版本的所有功能、改进优化和问题修复。
    ForMrFang
        31
    ForMrFang  
       189 天前   1
    同碰到这个问题,但使用 final 跟用 mysql 差别也不太(指性能很慢). 用 argmax 有拿不准的时候, 最后用了阿里的 ADB.
    1996wang
        32
    1996wang  
       189 天前   1
    doris 和 sr 已经开始有功能上的差异了,更推荐 doris.
    比如加列,doris 快速加列功能很好用.而 sr 加列很慢
    如果是阿里云,推荐阿里云的 hologres
    ChenKeLiang
        33
    ChenKeLiang  
       189 天前   1
    hologres 不错。
    haimianbihdata
        34
    haimianbihdata  
       189 天前   1
    去看一下 doris 跟 starrocks ,而且你都有 flink 了。链路打通不难的
    KJH
        35
    KJH  
    OP
       189 天前
    @NoString 是有考虑过轻量级删除,但是后面想要长久的稳定运行,总觉得不是最终方案,可以作为临时方案过度一下,我们也考虑考虑

    @bitmin 那还挺新的

    @ForMrFang 阿里可选择的东西确实比较多

    @1996wang 哈哈 正在写方案了,后面就测试下性能

    @ChenKeLiang 我了解下

    @haimianbihdata 我们 flink 只对接了数据仓库,想要再对接其他的涉及到服务器成本和开发成本,现在都在降本增效 T.T
    haimianbihdata
        36
    haimianbihdata  
       188 天前   1
    @KJH 可以这样的。业务库要用到的表直接同步过来,然后整个计算回到 doris ,starrocks 库上,配个海豚调度做好分层。flink cdc 可以实时抽数据。
    KJH
        37
    KJH  
    OP
       188 天前
    @haimianbihdata 感觉这个方法可以哦,我尝试尝试,感谢感谢,
    haimianbihdata
        38
    haimianbihdata  
       188 天前   1
    @KJH 而且可去试试。物化视图,分钟级别数据,其实也可以跑批实现伪实时
    KJH
        39
    KJH  
    OP
       171 天前
    @v2day 大佬 请教个问题,目前 doris 作为 ods 层,mysql-> doris 已经验证都 ok 了 没啥问题,但目前由于产品在云上,可选择的工具很少,这就导致了 dwd dws 层的数据不太好生成,
    如果使用数据库自带的 insert into select 不太好监控执行情况以及后续的运维,

    想请教下,目前生成 dwd dws 大宽表 比较好的方案是什么
    v2day
        40
    v2day  
       171 天前   1
    部署个 DolphinScheduler 调度工具( Apache 开源),只需要 SQL 调度的话,有个 4c4g 的资源部署下即可
    - 创建 jdbc 数据源
    - 创建 ETL 调度任务
    - 任务支持 动态传参、失败重试( SQL 上设计好幂等性,重试不影响数据结果)、任务编排
    - 配置任务状态告警(如果失败发送告警)
    - 有可视化状态监控

    ---
    同类产品如还有 青龙面板、N8N 这两个定时、任务编排的 工具
    KJH
        41
    KJH  
    OP
       171 天前
    @v2day 好的,谢谢大佬,我了解下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5403 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 09:07 PVG 17:07 LAX 02:07 JFK 05:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86