- 业务层面尽量限制in查询数量 , 避免流量过于放大;
- 容量评估时 , 需要考虑这部分放大因素 , 做适当冗余 , 另外 , 后续会提到业务改造上线分批进行 , 保证可以及时扩容;
- 分64、128还是256张表有个合理预估 , 拆得越多 , 理论上会放大越多 , 因此不要无谓地分过多的表 , 根据业务规模做适当估计;
- 对于映射表的查询 , 由于存在明显的冷热数据 , 所以我们又在中间加了一层缓存 , 减少数据库的压力
这里需要注意 , 删除和添加操作的事务原子性 。当然 , 简单处理也可以通过日志的方式 , 进行告警和校准 。
3.4.3 数据同步一致性问题
我们都知道 , 数据同步中一个关键点就是(消息)数据的顺序性 , 如果不能保证接受的数据和产生的数据的顺序严格一致 , 就有可能因为(消息)数据乱序带来数据覆盖 , 最终带来不一致问题 。
我们自研的数据同步工具底层使用的消息队列是kakfa , , kafka对于消息的存储 , 只能做到局部有序性(具体来说是每一个partition的有序) 。我们可以把同一主键的消息路由至同一分区 , 这样一致性一般可以保证 。但是 , 如果存在一对多的关系 , 就无法保证每一行变更有序 , 见如下例子 。
文章插图
那么需要通过反查数据源获取最新数据保证一致性 。
但是 , 反查也不是“银弹“ , 需要考虑两个问题 。
1)如果消息变更来源于读写实例 , 而反查 数据库是查只读实例 , 那就会存在读写实例延迟导致的数据不一致问题 。因此 , 需要保证 消息变更来源 和 反查数据库 的实例是同一个 。
2)反查对数据库会带来额外性能开销 , 需要仔细评估全量时候的影响 。
3.4.4 数据实时性问题延迟主要需要注意几方面的问题 , 并根据业务实际情况做评估和衡量 。
1)数据同步平台的秒级延迟
2)如果消息订阅和反查数据库都是落在只读实例上 , 那么除了上述数据同步平台的秒级延迟 , 还会有数据库主从同步的延迟
3)宽表到搜索平台的秒级延迟
只有能够满足业务场景的方案 , 才是合适的方案 。
3.4.5 分表后存储容量优化由于数据同步过程中 , 对于单表而言 , 不是严格按照递增插入的 , 因此会产生很多”存储空洞“ , 使得同步完后的存储总量远大于预估的容量 。
因此 , 在新库申请的时候 , 存储容量多申请50% 。
具体原因可以参考我的这篇文章 为什么MySQL分库分表后总存储大小变大了?
3.5 本章小结至此 , 分库分表的第二阶段告一段落 。
这一阶段踩了非常多的坑 。
一方面是设计高可用、易扩展的存储架构 。在项目进展过程中 , 也做了多次的修改与讨论 , 包括mysql数据冗余数量、搜索平台的索引设计、流量放大、分表键修改等问题 。
另一方面是“数据同步”本身是一个非常复杂的操作 , 正如本章最佳实践中提及的实时性、一致性、一对多等问题 , 需要引起高度重视 。
因此 , 更加依赖于数据校验对最终业务逻辑正确、数据同步正确的检验!
在完成这一阶段后 , 可以正式进入业务切换的阶段 。需要注意的是 , 数据校验仍然会在下一阶段发挥关键性作用 。
推荐阅读
- 分库分表的 9种分布式主键ID 生成方案,挺全乎的
- 亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行
- MySQL8.0大表秒加字段,是真的吗?
- 优雅的drop掉mysql库中1TB大表
- 淘宝技术分享:手淘亿级移动端接入层网关的技术演进之路
- 你们要的MyCat实现MySQL分库分表来了
- 亿级 ELK 日志平台构建实践
- 亿级流量场景下,大型缓存架构设计实现,你知道吗?
- 儿童脾胃不好七大表现
- 阿里数据库开发规范解释:关联查询,为什么要建议小表驱动大表?