也谈分库分表在实际应用的实践(下)

简介: 也谈分库分表在实际应用的实践(下)

3. 分表策略


分表的策略就相对简单了,复杂的是迁移方案,在同一个业务领域,对于数据进行分表,无非就是分表规则,场景等。


3.1. 分表规则


分表规则很简单,我们根据自己的业务场景,按照人的纬度hash取模的方式来进行分表,这里大家经常会遇到的问题是,将来还需要再继续分的时候怎么办,我们的策略是,目前的分表充分考虑未来的容量,尽量不给将来二次分表的机会;即使不得不做,我们可以采用通用的2分法来做,2分法可以保证在采用新的分表策略时,需要迁移的规模是2分之一;除此之外,还有一种方式,就是数据冷热分级,需要分析用户的行为把用户数据分为冷热数据,冷数据归档起来提供单独处理。有同学可能会问,为什么不优先选择冷热,然后再做分表,个人觉得各有千秋,且看本文第四部分讨论。


3.2. 场景


3.2.1. 读写


读写我们封装了统一的中间层来负责分表规则,这里我们并没有去做SQL解析,来统一处理,原因有二:


  • 从中间层不支持复杂的SQL操作,避免因为开发水平参差不齐导致一些耗时操作上线,有人可能会觉得这个是过程管理问题,我还是觉得技术上的保障会更靠谱一些。如果某个场景真的有这个需要,拉出来讨论清楚再说。


  • 能够给开发者在开发时做到一定程度的提醒,这里的数据是分表处理的,需要特别注意。


3.2.2. 表关联


表关联确实是个问题,我们的场景是尽量规避表关联,尽量通过数据冗余,空间换时间来做。 如果不得不做,基于场景讨论。


3.2.3. 跨分表查询


这个是杜绝的,针对分表的所有操作,都需要带着分表主键,如果确实有场景需要进行聚合操作,则根据场景进行异步数据合并,然后操作合并后的数据,而非直接操作原始分表数据。


拆分后


image.png


3. 迁移方案


终于到迁移方案了,迁移方案有很多种,有粗暴的,有温柔的,还有无感的(这些词不要想歪了)。


3.1. 停机


这个很简单,高效,停机,旧数据按照分库、分表规则直接导入到新表中就行,迁移过程中的细节就不说了,无非就是数据备份、数据准备、数据操作、数据验证、业务恢复。


  • 优点:简单直接



  • 缺点:需要停机,业务影响大,恢复时间依赖数据迁移进度。


3.2. 无感迁移


无感大家都很喜欢,也是我们喜欢和选择的,为了能够在基础能力扩充和业务无感上寻找一个平衡,我们花了不少代价,总结下来就是双写、并行、验证、回写、追数据、切换,这几个环节并非严格按照次序,需要根据业务场景及对数据的操作来进行细分:


3.2.1. 双写


针对分库的数据,新旧库各写一份,数据操作依然用旧库。 对于分表,采用的是业务隔离,按照一定的条件旧写旧,新写新,新的数据回写到旧表,数据读取依然用旧表。


image.png


3.2.2. 并行

并行一段时间,保证有足够的时间片内的数据,这个时间根据不同业务的数据热度以及迁移代价来定,太短稳定性有风险,太长有数据压力。


image.png


3.2.3. 验证

针对并行期间的数据做新旧逻辑验证及数据验证。

3.2.4. 回写

针对分表数据,走消息系统回写到旧表中,保证用户能够及时看到数据。

3.2.5. 追数据

验证并并行一段时间以后,就可以针对旧数据进行迁移了,这个环节由于数据规模比较大,都是在数据库级别的批量操作。


image.png


3.2.6. 切换


分库业务的切换,要注意数据的时效性,切换到新的服务,分散旧库的压力。 分表的切换会分的更细一些,按照读、写的纬度来切,优先切写到新表,通过数据回写保证能读到,然后切读到新表,最后再停回写。


image.png


4. 延伸


4.1. 选择问题


4.1.1. 消息与反查


这两个放在一起是不是有些奇怪,笔者是基于保证数据一致性的手段来考虑这件事情。 通常来说,反查更多用在同步调用上,而消息是异步场景下来用。 两者共同点在于,都需要用幂等机制来保证数据一致性。不同点在于反查时效更高,通常依赖调度,并且系统隔离性较差。 消息系统隔离性较好,但是存在消息无序性和较大延迟。


4.1.2. 幂等加异步与分布式事务


这两个放一起也是由于解决数据一致性的问题,两者各有千秋,我们选择了开发复杂一些,但是相对灵活一些的方案,针对大数据量、高并发的场景,分布式事务对于我们来说太重了。如果只是单纯的把数据库进行拆分,分布式事务可能更为适合。


4.1.3. 读写分离与分库分表


读写分离也是分摊系统压力和数据库压力的有效方式,两者不存在谁更好的问题,需要根据面对的业务场景及数据场景,分析数据的读写比作出选择,如果读写比非常高,那么无疑读写分离的效果是非常明显的。


4.1.4. 数据归档与分库分表


数据归档也是一种常用的策略,根据用户行为的分析业务场景和数据,来降低系统压力,选择依据是数据本身的冷热程度,如果数据冷热分布存在比较大的不均衡,那么归档无疑是比较优先的选择。


4.2. 代价问题


4.2.1. 数据时效


并行时间需要根据数据时效要求来做评估,时效要求比较长,那么并行期会比较长,这时建议考虑其它策略。


4.2.2. 流程影响


从直接操作数据库到依赖服务,从同步改为异步,这些对业务流程和数据流程都有非常大的影响,需要评估并做好处理。


4.2.3. 开发复杂度


方案选择直接影响就是开发复杂度,如果要做无感迁移,复杂度要多非常多,怎么平衡和选择才是关键。


4.3. 迁移升级


如果应用和外部系统有交互,那么还需要考虑灰度及兼容,以及推动外部迁移的部分,这些就是后话,不在此文之列。



相关文章
|
Shell
我来教你如何将cpu使用率up起来(shell脚本[含注释])
我来教你如何将cpu使用率up起来(shell脚本[含注释])
1352 0
|
3月前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
【阿里规约】阿里开发手册解读——数据库和ORM篇
|
Linux C语言 Perl
centos实现离线更新openssh
在CentOS上离线更新OpenSSH: 升级完成后, OpenSSH 版本应为 9.3。务必先备份重要数据与配置并测试系统。
1907 2
|
机器学习/深度学习 数据采集 人工智能
AI技术实践:利用机器学习算法预测房价
人工智能(Artificial Intelligence, AI)已经深刻地影响了我们的生活,从智能助手到自动驾驶,AI的应用无处不在。然而,AI不仅仅是一个理论概念,它的实际应用和技术实现同样重要。本文将通过详细的技术实践,带领读者从理论走向实践,详细介绍AI项目的实现过程,包括数据准备、模型选择、训练和优化等环节。
1338 3
|
人工智能 弹性计算 API
通义万相AI绘画创作体验评测
从使用者的角度解读通义万相AI绘画创作方案的优与劣
11569 12
|
Java 开发工具 数据库
IntelliJ IDEA 面试题及答案整理,最新面试题
IntelliJ IDEA 面试题及答案整理,最新面试题
264 0
|
监控 Java 程序员
Go 语言推荐书籍(2023)
Go是谷歌公司为了解决重大问题而设计的一种小型编程语言。 快速、现代的编程语言能让业余爱好者、初学者和专业人员都受益。你需要的正是这样的语言。 今天给大家推荐 10余本 Go语言相关书籍,都是历经多年口碑的优秀作品。
651 1
Go 语言推荐书籍(2023)
阿里巴巴开发手册“泰山”版它来了,1.4.0+终极版+阿里内部PPT
阿里的《Java开发手册》距离上次发布已经过去了 10 个月了,而这次发布也增加了很多干货内容,比如:新增 34 条规约,修改描述 90 处,其中错误码规则更是第一次提出完整的解决方案,发布日志如下图所示:
|
存储 传感器 Linux
(9)存储和EEPROM管理
(9)存储和EEPROM管理
393 0