分库分表,可能真的要退出历史舞台了
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
我的手上有一个 2019 年的订单项目,库分了 16 个,路由代码中那句 前几天按照这套查询逻辑在 TiDB 上重新构建了一番,代码中那个“%”一个都没有了 因此本文不谈趋势,只讲分片这件事是如何从应用层面迁移到数据库内核之中的,每一个步骤都伴随着 SQL 以及配置 很多人以为贵的就是"拆表"那一瞬间,其实贵的是拆完之后,在应用层自己维护一个分布式系统 分片键要出现在所有的查询条件中,少了任何一个就会变成全分片扇出 深度分页最典型的例子就是 扩容方案在第一天就因为分片算法而被锁定。取模分 16 个库想扩到 32 个,就是全量数据重分布,一致性哈希可以少迁点,但是也必须迁 跨分片事务、全局唯一 ID、跨库 JOIN,在单机上数据库免费送给你,拆开来全部要自己造一遍 如果只是单表太大、还用不上分布式数据库的话,那么 MySQL 自带的分区表就能撑一段时间 它的原理就是逻辑上一张表、物理上多个 ibd 文件,SQL 语法一个字不用改,路由由内核按分区表达式计算 有一个很容易出问题的硬性规定:分区表达式所用到的列,在这张表的所有唯一索引中都必须出现,主键也包括 你要是把主键只写成 其实道理并不复杂,在物理层面上已经把不同分区隔离开来了,所以跨分区就无法进行唯一性校验了,因此它干脆就不让你创建这样的表 代价也要交代清楚, 裁剪的验证方法很简单,在 再加上 但是它的天花板也十分明显,机器依旧是那一台,IO 和连接数该顶还是顶,这就是分区表和分布式数据库之间的分水岭 TiDB 的答案就是 Region。按照 key range 的方式把数据切成了默认的 96MB 一个 Region,写满之后会自动分裂,PD 负责把 Region 调度到不同的 TiKV 节点上。同时把全局递增的 TSO 分发出去 应用只需要连一个 MySQL 协议地址,跨 Region 的事务走 Percolator 两阶段提交,这些都是对业务代码完全隐形的 但是有一个坑,这个坑很具体 这是从 MySQL 迁移过来最常出现的翻车点,表建好、数据也导入进去之后,压测一跑就发现只有一个 TiKV 在扛 OceanBase 的路子更加接近传统的 DBA 直觉,原生分区表加上分区键由用户自己来指定,副本之间通过 Paxos 同步,RPO 等于 0,RTO 压在 8 秒以内 PolarDB MySQL 的多主集群(Limitless)是另外一种思路,它做的就是库表级别的写入点下移 文档写得很实在:跨 RW 节点的查询不支持,跨节点的 DDL 直接报错 其实它并没有消灭分片,而是把分片藏到了数据库里面,代价就是换了一个地方支付 迁移的时候最忌讳的就是拍脑袋了,TiDB 那套 DM 工具已经把分库分表合并做成了配置 全部拉取完毕之后,DM 会自动切换到 binlog 增量同步模式,在这个切换的过程中,业务不需要停止 决定成败的是校验这一环节,这一步不要偷懒 行数对一遍只能算第一层,往上还有表级 checksum,最后用 sync-diff-inspector 做全字段逐行比对,在配置中将 有一个限制我必须提前说清楚:从 MySQL 到 TiDB 之间不支持在线校验,在校验范围内数据要保证不再变动,因此灰度窗口要提前划定好,不能边写边校 分两种情况说 单表大但是还在单机范围内的话,就老老实实上分区表吧,先把 ERROR 1503 那个唯一键约束想清楚了,能省下一整层中间件 分片键已经不能再修改了,跨库 JOIN 把接口拖到了几百毫秒,扩容要停服做数据迁移的,那么就不要硬撑下去了,这笔钱花的是把复杂度从开发身上挪走 至于“退出历史舞台”的说法,我认为应该这样修:退出的是应用层手写哈希、手动拼跨库查询这个阶段,分片本身不会消失,它只是从你的 阅读原文:点击这里 该文章在 2026/10/17 15:53:54 编辑过 |
关键字查询
相关文章
正在查询... |