加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

“分库分表 不注意选型和流程的话,容易失控

发布时间:2020-01-07 21:21:58 所属栏目:MySql教程 来源:站长网
导读:副标题#e# 数据库中间件之分库分表 恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了。但你是否知道分库分表需要哪些要素?拆分过程是复杂的,提前计划,不要等真正开工,各种意外的工作接踵而至,以至失控。 本文意图打开数据库中间件的
副标题[/!--empirenews.page--]

“分库分表 不注意选型和流程的话,容易失控

数据库中间件之分库分表

恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了。但你是否知道分库分表需要哪些要素?拆分过程是复杂的,提前计划,不要等真正开工,各种意外的工作接踵而至,以至失控。

本文意图打开数据库中间件的广度,而不考虑实现深度,至于库表垂直和水平分的概念和缘由,不做过多解释。所以此文面向的是有一定研发经验,正在寻找选型和拆分流程的专业人士。

切入层次

以下,范围界定在JAVA和MySQL中。我们首先来看一下分库分表切入的层次。

“分库分表


① 编码层

在同一个项目中创建多个数据源,采用if else的方式,直接根据条件在代码中路由。Spring中有动态切换数据源的抽象类,具体参见

AbstractRoutingDataSource。

如果项目不是很庞大,使用这种方式能够快速的进行分库。但缺点也是显而易见的,需要编写大量的代码,照顾到每个分支。当涉及跨库查询、聚合,需要循环计算结果并合并的场景,工作量巨大。

如果项目裂变,此类代码大多不能共用,大多通过拷贝共享。长此以往,码将不码。

② 框架层

这种情况适合公司ORM框架统一的情况,但在很多情况下不太现实。主要是修改或增强现有ORM框架的功能,在SQL中增加一些自定义原语或者hint来实现。

通过实现一些拦截器(比如Mybatis的Interceptor接口),增加一些自定义解析来控制数据的流向,效果虽然较好,但会改变一些现有的编程经验。

很多情况要修改框架源码,不推荐。

③ 驱动层

基于在编码层和框架层切入的各种缺点,真正的数据库中间件起码要从驱动层开始。什么意思呢?其实就是重新编写了一个JDBC的驱动,在内存中维护一个路由列表,然后将请求转发到真正的数据库连接中。

像TDDL、ShardingJDBC等,都是在此层切入。

包括Mysql Connector/J的Failover协议

(具体指“load balancing”、“replication”、“farbic”等),

也是直接在驱动上进行修改。

请求流向一般是这样的:

“分库分表


④ 代理层

代理层的数据库中间件,将自己伪装成一个数据库,接受业务端的链接。然后负载业务端的请求,解析或者转发到真正的数据库中。

像MySQL Router、MyCat等,都是在此层切入。

请求流向一般是这样的:

“分库分表


⑤ 实现层

SQL特殊版本支持,如Mysql cluster本身就支持各种特性,mariadb galera cluster支持对等双主,Greenplum支持分片等。

需要换存储,一般是解决方案,就不在讨论之列了。

技术最终都会趋于一致,选择任何一种、都是可行的。但最终选型,受开发人员熟悉度、社区活跃度、公司切合度、官方维护度、扩展性,以及公司现有的数据库产品等多方位因素影响。选择或开发一款合适的,小伙伴们会幸福很多。

驱动层和代理层对比

通过以上层次描述,很明显,我们选择或开发中间件,就集中在驱动层和代理层。在这两层,能够对数据库连接和路由进行更强的控制和更细致的管理。但它们的区别也是明显的。

驱动层特点

仅支持JAVA,支持丰富的DB

驱动层中间件仅支持Java一种开发语言,但支持所有后端关系型数据库。如果你的开发语言固定,后端数据源类型丰富,推荐使用此方案。

“分库分表


占用较多的数据库连接

驱动层中间件要维护很多数据库连接。比如一个分了10个 库 的表,每个java中的Connection要维护10个数据库连接。如果项目过多,则会出现连接爆炸(我们算一下,如果每个项目6个实例,连接池中minIdle等于5,3个项目的连接总数是 10*6*5*3 = 900个)。像Postgres这种每个连接对应一个进程的数据库,压力会很大。

数据聚合在业务实例执行

数据聚合,比如count sum等,是通过多次查询,然后在业务实例的内存中进行聚合。

路由表存在于业务方实例内存中,通过轮询或者被动通知的途径更新路由表即可。

集中式管理

所有集群的配置管理都集中在一个地方,运维负担小,DBA即可完成相关操作。

典型实现

“分库分表


代理层特点

异构支持,DB支持有限

代理层中间件正好相反。仅支持一种后端关系型数据库,但支持多种开发语言。如果你的系统是异构的,并且都有同样的SLA要求,则推荐使用此方案。

“分库分表


运维负担大

代理层需要维护数据库连接数量有限(MySQL Router那种粘性连接除外)。但作为一个独立的服务,既要考虑单独部署,又要考虑高可用,会增加很多额外节点,更别提用了影子节点的公司了。

另外,代理层是请求唯一的入口,稳定性要求极高,一旦有高耗内存的聚合查询把节点搞崩溃了,都是灾难性的事故。

典型实现

“分库分表


共同点

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读