
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库技术的应用是每一位软件开发程序员都应该熟练掌握的编程技术,下面我们就通过案例分析来了解一下,数据库分库分表架构方式。
分库分表的痛点
事务性问题
将原来的一个表/库进行拆分之后,就不能使用数据库自身的事务机制保证数据操作的ACID特性,因此需要利用分布式事务如基于两阶段提交的XA协议;
联表查询的问题
如果表A被拆分出了两个表A1和A2,表B被拆分出了两个表B1和B2,那么原来的AINNERJOINB查询将需要(A1INNERJOINB1)UNION(A1INNERJOINB2)UNION(A2INNERJOINB1)UNION(A2INNERJOINB2)这样的操作;
如果拆分得更多,终的联表查询结果将是两个表拆分数量的笛卡尔积的Union操作,查询性能会变得异常低下;
排序分页的问题
对数据库表的查询结果进行排序分页,需要从各个分表查询出结果进行汇总之后再进行排序分页;
分库分表的架构
常用的分库分表架构大致可以分为两类:组件模式和代理模式;
组件模式将分库分表的逻辑以组件的方式提供给客户端使用;客户端开发人员需要以依赖的形式引用这些组件,并在客户端代码中配置分库分表的规则;ApacheShardingSphere、阿里巴巴的TDDL就是这类模式的代表;
代理模式是在客户端和服务器之间加入一个代理服务器,这个代理服务器负责对客户端请求的数据进行分库分表,这些分库分表规则对客户端开发人员而言是完全透明的,它屏蔽了分库分表的复杂度,减轻了客户端开发人员的学习曲线;MyCat、ShardingProxy是这类模式的代表。
由于代理模式加入了一个中间层,不像组件模式那样客户端直连数据库管理系统,因此性能相对较差;但由于组件模式需要客户端开发人员去了解分库分表的规则,并保证这些规则在客户端都能正确配置;因此代理模式渐渐成为分库分表架构设计的主流。
水平分表的方式
顺序分布
顺序分布又分为时间顺序或主键顺序;时间顺序如将每年或每月的数据单独存储在一个表中;主键顺序如对于一个主键递增的表A,将主键ID为1-10000范围内的记录存储到A1表,将主键ID为10001-20000范围内的记录存储到A2表......以此类推。
Hash分布
Hash分布可以分为三类:Hash取模、一致性Hash、虚拟槽分区;
Hash取模是使用主键ID对数据库节点数量进行取模,得到的值即是该记录存储节点的索引值;
一致性Hash和虚拟槽分区可以参考我以前写的Cassandra介绍中的数据分布部分。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。