V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
v50Tks
V2EX  ›  程序员

数据统计场景存储选型,大佬们帮帮忙

  •  
  •   v50Tks · 2023-04-02 12:25:47 +08:00 · 1077 次点击
    这是一个创建于 602 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景是一个账务系统,对外提供入账、查询和收支统计功能。收支统计指的是可以查询用户纬度指定时间窗口内的入账金额总和。

    老系统入账和查询是 mysql ,有三张表,分别是明细表、账户表、统计表,每次入账行为是先 insert 明细表,然后 update 账户表和统计表,后来优化入账流程,避免长事务,重构后统计表变成了通过明细表 binlog 异步去做。具体做法是把统计信息根据用户+日期维度存一个 kv 存储,每次消费入账明细去更新 value 。这个统计行为是半幂等的,value 里面存一个数组,只保留近 10 条明细的唯一键,每次更新这个数组 fifo 用来做幂等。

    现在新需求场景是希望统计个性化场景的数据,比如入账行为分为工资、转账、退款等,那么只想统计某段时间的转账总和。

    按照现在的 kv 做法,那么这种个性化场景就要做成单独的 key ,每次根据规则写到不同的 key ,这存在写放大问题,可能一条明细被统计到多个 kv 上去,而且需要考虑写多个 key 的一致性问题。

    数据总量每天新增百亿行,用的是大分片库。 可能的做法:

    1. 继续用 kv ,存一个大 json ,每一种统计场景对应一个 json 一级域的 key ,每次更新多个 key ,这样可以解决写放大问题,但是 value 会不断增长,要考虑是不是会大 key 。
    2. mongoDB ,也相当于是存一个大 json ,好处是对于统计场景可以更个性化,不受限于结构;且 mongo 可以做事务,可以做全幂等(一次统计行为拆成两个 key ,第一个 key 做幂等,第二个 key 更新统计值)
    3. clickhouse ,相当于明细表全量备份到 clickhouse ,每次查询是特定列的范围查询。但是 clickhouse 不适用于读多的场景,官方文档表示单机超过 100qps 会有问题,好像不适合这种在线读场景
    4. mysql ,明细表搞一个从库专门用作统计,建好索引。但是单分片数据能有上亿行,读写 qps 大几百,可能会有问题。

    大致就是这些,大佬们帮帮忙指点一下,感激不尽

    5 条回复    2023-04-03 13:26:49 +08:00
    Alias4ck
        1
    Alias4ck  
       2023-04-02 13:39:21 +08:00
    why not ask gpt-4? https://gpt.best/J2pwM2Yw
    totoro52
        2
    totoro52  
       2023-04-02 19:27:36 +08:00 via iPhone
    es: 那我走?
    Red998
        3
    Red998  
       2023-04-03 09:38:14 +08:00
    这个应该同步到大数据比较好吧 、查询也只是冷数据。大数据统计比较好
    house600
        4
    house600  
       2023-04-03 10:14:49 +08:00
    这个统计行为是半幂等的,value 里面存一个数组,只保留近 10 条明细的唯一键,每次更新这个数组 fifo 用来做幂等。
    请问下,这个是怎么做幂等的
    WLYsYs
        5
    WLYsYs  
       2023-04-03 13:26:49 +08:00
    体量这么大,指定时间,还是得用大数据
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2777 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 09:51 · PVG 17:51 · LAX 01:51 · JFK 04:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.