SELECT * FROM t_order_n
SQL执⾏
将路由和改写后的真实 SQL 安全且高效发送到底层数据源执行。但这个过程并不能将 SQL 一股脑的通过 JDBC 直接发送至数据源执行,需平衡数据源连接创建以及内存占用所产生的消耗,它会自动化的平衡资源控制与执行效率。
将从各个数据节点获取的多数据结果集,合并成一个大的结果集并正确的返回至请求客户端,称为结果归并。而我们SQL中的排序、分组、分页和聚合等语法,均是在归并后的结果集上进行操作的。
分布式主键
数据分⽚后,一个逻辑表(t_order
)对应诸多的真实表(t_order_n
),它们之间由于⽆法互相感知,主键ID都从初始值累加,所以必然会产⽣重复主键ID,此时主键不再唯一那么对于业务来说也就没意义了。
尽管可通过设置表⾃增主键 初始值
和 步⻓
的⽅式避免ID碰撞,但这样会使维护成本加大,可扩展性差。
这个时候就需要我们手动为一条数据记录,分配一个全局唯一的ID,这个ID被叫做分布式ID,而生产这个ID的系统通常被叫做发号器。
大家可以参考我之前发布的这篇文章 9种分布式ID生成方案
分库分表数据脱敏是一种有效的数据保护措施,可以确保敏感数据的机密性和安全性,减少数据泄露的风险。
比如,我们在分库分表时可以指定表的哪些字段为脱敏列,并设置对应的脱敏算法,在数据分片时解析到执行SQL中有待脱敏字段,会直接将字段值脱敏后的写入库表内。
对于用户的个人信息,如姓名、地址和电话号码等,可以通过加密、随机化或替换成伪随机数据的方式进行脱敏,以确保用户的隐私得到保护。
大家可以参考我之前发布的这篇文章 大厂也在用的 6种 数据脱敏方案
分布式事务
分布式事务的核心问题是如何实现跨多个数据源的原子性操作。
由于不同的服务通常会使用不同的数据源来存储和管理数据,因此,跨数据源的操作可能会导致数据不一致性或丢失的风险。因此,保证分布式事务的一致性是非常重要的。
以订单系统为例,它需要调用支付系统、库存系统、积分系统等多个系统,而每个系统都维护自己的数据库实例,系统间通过API接口交换数据。
为了保证下单后多个系统同时调用成功,可以使用强一致性事务
的XA协议,或者柔性事务
的代表工具Seata,来实现分布式事务的一致性。这些工具可以帮助开发人员简化分布式事务的实现,减少错误和漏洞的出现,提高系统的稳定性和可靠性。
经过分库分表之后,问题的难度进一步提升。自身订单服务,也需要处理跨数据源的操作。这样一来,系统的复杂度显著增加。因此,不到万不得已的情况下,最好避免采用分库分表的解决方案。
关于分布式事务详细的介绍,大家可以参考我之前发布的这篇文章 对比 5 种分布式事务方案,还是宠幸了阿里的 Seata(原理 + 实战)
分库分表后还有个让人头疼的问题,那就是数据迁移,为了不影响现有的业务系统,通常会新建数据库集群迁移数据。将数据从旧集群的数据库、表迁移到新集群的分库、分表中。这是一个比较复杂的过程,在迁移过程中需要考虑数据量
、数据一致性
、迁移速度
等诸多因素。
迁移主要针对 存量数据
和 增量数据
的处理,存量数据指旧数据源中已经存在且有价值的历史数据,增量数据指当下持续增长以及未来产生的业务数据。
存量数据可以采用定时、分批次的迁移,迁移过程可能会持续几天。
增量数据可以采用新、旧数据库集群双写模式。待数据迁移完毕,业务验证了数据一致性,应用直接切换数据源即可。
后续我们会结合三方工具,来演示迁移的过程。
什么是影子库(Shadow Table
)?
影子库是一个与生产环境数据库结构完全相同的实例,它存在的意义是为了在不影响线上系统的情况下,验证数据库迁移或者其他数据库变更操作的正确性,以及全链路压测。影子库中存储的数据是从生产环境中定期复制过来的,但是它不对线上业务产生任何影响,仅用于测试,验证和调试。
在进行数据库升级、版本变更、参数调优等操作前,通过在影子库上模拟这些操作,可以发现潜在的问题,因为测试环境的数据是不可靠的。
在使用影子库时,需要遵循以下几个原则:
与生产环境数据库的结构应该完全一致,包括表结构、索引、约束等;
数据要与生产环境保持一致,可以通过定期同步方式实现;
读写操作不会影响生产环境,一般情况下应该禁止在影子库上执行更新、删除等操作;
由于影子库的数据特点,访问权限应该严格控制,只允许授权人员进行访问和操作;
本文介绍了关于分库分表架构的21个通用概念,对有一定的了解之后,接下来我们将进入更深度的内容,包括读写分离
、数据脱敏
、分布式主键
、分布式事务
、配置中心
、注册中心
、Proxy服务
等实战案例的讲解和源码分析。
下期文章将是《分库分表ShardingSphere5.x原理与实战》系列的第三篇,《快速实现分库分表的 2种方式》。
我是小富,下期见~