1.3.4 数据库中间件
在一般情况下,当应用系统只需要一台数据库服务器时,用不到数据库集群架构。前面介绍的几款常见数据库一般自带基本的数据库读写分离、分库分表功能,或者通过自带的代理软件来实现相关功能,但需要面对异构数据库时,就需要对数据库层抽象,来管理这些异构数据库。这个时候,最上层的应用只需要面对一个数据库层抽象,从而简化应用的开发部署。这个数据库层抽象就是数据库中间件,也能够用来构建底层的数据库集群。通常而言,数据库是对底层存储文件的抽象,通过表和字段来操作实际的数据,而数据库中间件产品是对各类数据库的抽象。
目前比较常用的数据库中间件有很多,包括Mycat、ShardingSphere等,下面分别对Mycat和ShardingSphere进行介绍。
1. Mycat
Mycat是一款开源的分布式数据库系统,服务器前端可以把它看成一个数据库代理(类似于MySQL Proxy),通过客户端工具或命令行就可以访问,但后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信。Mycat基于阿里开源的Cobar产品研发,解决了Cobar当时存在的一些问题,并融入业界优秀的开源项目功能和创新思路,目前作为一款开源产品在互联网领域得到广泛应用,社区活跃度很高,在功能和性能上甚至超越某些商业产品。
通过以上介绍可以看出,MySQL Proxy的主要功能是代理MySQL数据库,而Mycat这类数据库中间件产品,主要起到前端和后端各类异构数据库的桥梁作用。如果使用简单的读写分离功能,MySQL Proxy就可以直接对MySQL数据库进行代理,用于分配不同类型的读写流量。但对于非MySQL数据库,Mycat的优势得以发挥。Mycat目前能够实现数据库读写分离、分库分表等集群功能,不但支持传统的Oracle、MySQL、SQL Server、PostgreSQL、DB2等关系型数据库,还支持MongoDB等非关系型数据库。与众多其他类型的数据库相比,它的主要特点可以概括为以下几点。
(1)彻底开源的、面向企业应用开发的大数据库集群。
(2)支持事务、ACID,并可以替代MySQL的加强版数据库。
(3)一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群。
(4)一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server。
(5)结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品。
(6)一个新颖的数据库中间件产品。
在这里,Mycat的核心功能是分表分库,将一个大表水平分割为多个小表,存储在后端MySQL或其他数据库中。Mycat能够完全实现分布式事务处理,通过Mycat Web可以完成可视化配置、智能监控和自动运维。通过MySQL本地节点,完整地解决数据扩容难题,实现自动扩容机制。图1-12展示了Mycat的一种实际部署形式。
图1-12 Mycat的一种实际部署形式
2. ShardingSphere
ShardingSphere的前身是Sharding-JDBC。Sharding-JDBC是一套扩展于Java JDBC层的分库分表中间件,起源于当当网内部应用框架的数据库访问层组件。由于分库分表需求具有相对普遍性,并且具备独特的生命力和关注度,因此将其抽离为独立的项目,命名为Sharding-JDBC,并于2016年年初开源。
ShardingSphere不是专为MySQL实现集群架构设计的,但在实现MySQL集群架构时性能强大。经过多年发展,ShardingSphere已经成为开源分布式数据库中间件解决方案组成的生态圈,由JDBC、Proxy和Sidecar这3款相互独立却又能混合部署、配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,适用于Java同构、异构语言、云原生等各种多样化的应用场景。ShardingSphere已于2020年4月16日成为Apache软件基金会的顶级项目。
ShardingSphere的基本结构如图1-13所示。
Sharding Sphere-JDBC定位为轻量级Java框架,在Java的JDBC层提供额外的服务。它使用客户端直连数据库,以Jar包形式提供服务,不需要额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。本模块适用于任何基于JDBC的ORM框架,如JPA、Hibernate、Mybatis、Spring JDBC或直接使用JDBC;支持任何第三方的数据库连接池,如DBCP、C3P0、BoneCP、Druid、HikariCP等;支持任意实现JDBC规范的数据库,目前支持MySQL、Oracle、SQL Server、PostgreSQL,以及任何遵循SQL92标准的数据库。
图1-13 ShardingSphere的基本结构
Sharding Sphere-Proxy定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于实现对异构语言的支持。目前,其提供MySQL和PostgreSQL版本,可以使用任何兼容MySQL和PostgreSQL协议的客户端操作数据,对DBA更加友好。
Sharding Sphere-Sidecar定位为Kubernetes的云原生数据库代理,以Sidecar的形式代理所有对数据库的访问。通过无中心、零侵入的方案提供与数据库交互的啮合层,即Database Mesh,又可称为数据库网格。