携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
概述
系统优化到分库分表后,选定了路由key,确定了路由策略,这个时候就需要落地实现对多数据源的管理,前面有些章节也有实际落地的关于多数据源的管理,比如在引入读写分离架构的时候就有自定义的多数据源管理等落地方案的代码。本着不重复造轮子的原则以及对团队整体技术水平的考虑,可以进行自研分库分表中间件,也可以采用成熟的开源的分库分表中间件。
分库分表的中间件很多,实现方式可以归结为两大类:
- CLIENT: 客户端模式
- PROXY: 代理模式
client模式
proxy模式
相关的产品调研:
MyCAT
2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,及其使用限制,经过Mycat发起人第一次改良,第一代改良版——Mycat诞生。 Mycat开源以后,一些Cobar的用户参与了Mycat的开发,最终Mycat发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件。
MyCat支持读写分离、数据分片、多数据源管理。
MyCat需要搭建独立的服务,如果需要管理的数据源特别多,那么MyCat的压力会很大,性能会降低。
MyCat的单机模式无法保证系统的可靠性,一旦服务宕机就会变得不可用,所以需要引入HAProxy来实现MyCat的高可用集群部署方案,为了解决HAProxy的高可用问题,又需要引入keepalived技术,系统架构会变得比较复杂。
MyCat适用于中小型公司和创业公司。
ShardingSphere
Apache ShardingSphere 由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。它们均提供标准化的基于数据库作为存储节点的增量功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
ShardingSphere-JDBC定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
在外卖订单系统中,其实sharding-jdbc主要是通过包装或者是代理应用的本地数据源,拦截sql语句,根据配置的路由策略定位到是哪个数据库,然后改写sql语句的schema;再根据路由策略定位到是哪个表,然后再改写sql语句的表名称,最后到实际的数据库上的表中查询数据。整体流程如下图:
总结
无论是CLIENT模式,还是PROXY模式。几个核心的步骤是一样的:SQL解析,重写,路由,执行,结果归并。client模式,架构简单,性能损耗比较小,运维成本低。