请教一些分库分表的问题

2023-09-06 15:02:20 +08:00
 jiobanma

目前线上数据库中一个大表大概有 2k 万条数据。 这 2 千万数据大概是 1 年的量。之后业务量变大,可能会更高一点。 准备对这个表进行分表,有两点问题想咨询一下大佬们。

  1. 大概分多少个表,能够支持未来几年的业务量。
  2. 分表后,旧表的数据如何迁移到新表内(可停服,不用考虑过渡阶段数据)。 写代码/canal/LogStatsh/flink-cdc
3610 次点击
所在节点    程序员
40 条回复
jiobanma
2023-09-06 17:00:31 +08:00
@wqhui #19 你说的这个应该类似于分两个表,id 按照奇偶数分布,然后关联其他表查询的时候,条件中的 id 即使是单数,但也会把两个拆分出来的表都去关联另一个表然后聚合是吧。我记得文档里好像可以配置绑定键来解决笛卡尔积。不知道我说的是不是你说的第一点。第二点确实,文档有点怪,不过一个版本没问题的话,后续应该也不会更换了。
token10086
2023-09-06 18:28:51 +08:00
花点钱上分布式数据库吧,DRDS 什么的
kanepan19
2023-09-06 18:34:26 +08:00
分表分库是解决插入问题的。 插入到瓶颈了?
seth19960929
2023-09-06 18:49:09 +08:00
直接使用 MySQL 分区, 别分表了
sadfQED2
2023-09-06 19:10:06 +08:00
你们有 dba 吗?有 dba 让 dba 搞 dbproxy ,对业务透明,没 dba 就让公司加钱升配置,2000 万数据算个屁啊,我司评论表 20 多个字段的宽表,20 亿+数据,照样单表跑。
wyx119911
2023-09-06 20:10:08 +08:00
这种用户之间隔离的数据,按用户 id hash 分表就可以(比如预先分 1000 张表),将用户 id 编码到任务 id 中,无论是根据 id 查询,还是用户查历史报表都是没问题的。
xyening
2023-09-06 20:21:57 +08:00
2000w 数据不多,应该没有一点点压力
dw2693734d
2023-09-06 20:31:18 +08:00
不得不吹一波 Postgres, 配合 Citus 分表分库, 无缝扩展, 操作极其简单
dw2693734d
2023-09-06 20:45:18 +08:00
@dw2693734d

两句即可完成操作

create extension citus;
SELECT create_distributed_table('table', 'shard_column', shard_count := 256);
dw2693734d
2023-09-06 20:53:59 +08:00
添加新的机器节点:

SELECT * FROM citus_add_node('worker_node_address', '192.168.0.2');

rebalance:

SELECT rebalance_table_shards();
dw2693734d
2023-09-06 20:55:51 +08:00


我的服务器,1.2TB 的数据,2000 个分表,单机节点
kuituosi
2023-09-06 21:39:28 +08:00
分区表如果不小心跨表也是头疼。你对分库分表不熟悉的话有 2 个成熟方案,1 旧数据很少访问就移走大部分都是访问最近一个月的数据。2 用云上分布式数据库,完全兼容单节点数据库平滑迁移,几乎不用改动业务代码。如果这 2 个成熟方案条件不满足,那只能考虑自己实现分库分表,但是坑也比较多最好找人技术咨询。本人资深架构师,只要报酬丰富就能提供优质服务
happy32199
2023-09-06 21:52:09 +08:00
tidb 自动分区 有人用过吗? 免费版的能用吗
v2eb
2023-09-06 23:12:43 +08:00
数据也不多吧, sql 慢的话要不贴下表结构?
历史数据提前统计好, 按年分表也可以吧
512357301
2023-09-06 23:22:01 +08:00
搞个 clickhouse ,用来读,MySQL 专门写
lovelylain
2023-09-06 23:34:05 +08:00
“2. 大部分的查询场景是根据 id (雪花算法生成的),同时 id 也是任务号
3. 因为每个用户可能会查看历史的数据报告
我能想到的是根据 id 取模分表”
你直接按 id 取模分表就没法实现你的第 3 点了。你这个按用户或者按时间分表都行,
按用户的话,uid 取模分表,任务 id 里加上这个模数,这样既能通过 uid 找到表,也能通过任务 id 找到表,方便查询,需要预先分好足够表和确定好 id 规则,不然后面再调整就比较麻烦;
按时间分表的话,每年一个表,用户查找历史数据时问题也不大,方便扩充新表和淘汰旧数据。
报表的话,看你需求了,一般都是离线做吧,不在乎速度。
历史数据的话,如果你没有根据旧 id 查询的场景或者有但影响不大,可以按新表规则生成新 id 迁移到新表,不能迁移的话就在查询上做兼容。
PendingOni
2023-09-07 06:55:18 +08:00
试试用 MyCat 做读写分离 读的表加上索引
lvxiaomao
2023-09-07 10:41:19 +08:00
1. 首先明确查询场景吧,如果是根据 userId 查询的,那就根据 userId 分表。但是需要考虑是否有 过热的 userId 的问题,即某个分表数据远超于其他分表,但是这种情况感觉不会存在

2. 每张表数据不建议超 1000w 吧;每年 2000w 的增量,用 8 张表或者 16 张表就可以了;能支持好几年呢。反正分表数要是 2 的 N 次幂

3. 是否可以考虑不分表,你们 2000w 数据是否有一部分可以归档处理呢?
dailiha01sy
2023-09-07 15:07:35 +08:00
现在的机器单表塞个几个亿轻轻松松, 没必要分
crazyweeds
288 天前
@dailiha01sy 1 亿左右确实没必要,但是 10 亿的话,分区都不太够看,估计还得配合分表。当然,分布式数据库可能是更好的选择。不过,没实际调研过分布式数据库。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/971425

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX