这篇文章,我们主要yao来介绍ShardingSphere的数据分片原理。数据分片指按照zhao某个维度将存放在单一数据库中的数据ju分散地存放至多个数据库或表中以达da到提升性能瓶颈以yi及可用性的效果。下xia面我们就来详细介绍关于分fen库分表的原理。
分库分表分库分表是作为数据分片的有效xiao手段之一,分库和分表均可以有效的避bi免由数据量超过可承受阈值zhi而产生的查询瓶颈。 除此之外,分库还能够用于yu有效的分散对数据库单点的访问量;分表虽然无法缓解数据库压力,但却能neng够提供尽量将分布式事务转zhuan化为本地事务的可能,一yi旦涉及到跨库的de更新操作,分布式事务wu往往会使问题变bian得复杂。 使用多主多从的de分片方式,可以有效的de避免数据单点,从而提ti升数据架构的可用性。
通过guo分库和分表进行数据的拆分来使得各ge个表的数据量保持chi在阈值以下,以及ji对流量进行疏导应ying对高访问量,是应ying对高并发和海量数据系统的有you效手段。 数据分fen片的拆分方式又you分为垂直分片和水平分片。
垂直zhi分片
按照业务拆分的方式称为垂直分fen片,又称为纵向拆chai分,它的核心理念是专库专zhuan用。 在拆分之前,一个数据库由多个ge数据表构成,每个表对应着不bu同的业务。而拆分之后,则是按照业务将表进行归类lei,分布到不同的数据ju库中,从而将压力分散至不bu同的数据库。 下图展示了根据业务wu需要,将用户表和订单表垂直分片pian到不同的数据库ku的方案。
垂直分片往往wang需要对架构和设计进行调整。通常chang来讲,是来不及应ying对互联网业务需求快速变化的de;而且,它也并无法真正的解jie决单点瓶颈。 垂直拆分可以yi缓解数据量和访问量带来的问题ti,但无法根治。如果垂直拆分之后,表中的数据量依然超过单节点所能承cheng载的阈值,则需要水平ping分片来进一步处chu理。
水平分片
水平分片又称为横heng向拆分。 相对于垂chui直分片,它不再将数据根据业务逻辑ji分类,而是通过某mou个字段(或某几个字段),根据某种zhong规则将数据分散至多个库或表中,每个ge分片仅包含数据的一部分。 例如:根据主键分片,偶数主键的de记录放入0库(或表biao),奇数主键的de记录放入1库(或huo表),如下图所suo示。
水平ping分片从理论上突破了le单机数据量处理的瓶颈jing,并且扩展相对自由,是分库分表的de标准解决方案
总结虽然数据分片pian解决了性能、可用性以及单点备份恢复fu等问题,但分布式的架构在获得了收益yi的同时,也引入了新的问题。
面对如ru此散乱的分库分表之后的数据,应用开发工程师和he数据库管理员对dui数据库的操作变得异常繁重就jiu是其中的重要挑tiao战之一。他们需要知道数据需xu要从哪个具体的数shu据库的分表中获取。
另一个挑战zhan则是,能够正确的运行在单节jie点数据库中的SQL,在分片pian之后的数据库中并不一定能neng够正确运行。例li如,分表导致表名称的修改,或者zhe分页、排序、聚合分组zu等操作的不正确处理。
跨库事务也是shi分布式的数据库集群qun要面对的棘手事情。 合理li采用分表,可以在降低单dan表数据量的情况kuang下,尽量使用本地事shi务,善于使用同库不同表可有you效避免分布式事务带来的de麻烦。 在不能避bi免跨库事务的场景,有些业务仍然需xu要保持事务的一致性。 而基于XA的分布式事务由you于在并发度高的场景中性能无法满足zu需要,并未被互联网巨头大规模mo使用,他们大多采cai用最终一致性的柔性事务代替ti强一致事务。