Mycat服务发现功能的架构设计及实现

Mycat服务发现功能的架构设计及实现

一. Mycat是什么

Mycat 是什么?从定义和分类来看,它是一个数据库中间件,介于数据库与应用之间,进行数据处理与交互的中间服务。

Mycat是一个实现了MySQL协议的Server,前端应用可以把它看作是一个数据库代理,能够使用MySQL 客户端工具和命令行访问。

而在后端,Mycat使用MySQL 原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,实现数据库层面的数据存储。

对于应用开发者来说, Mycat近似于一个MySQL服务器,可以使用连接MySQL 的方式去连接Mycat(默认的Mycat 端口是8066 而非MySQL 的3306),大多数情况下,还可以使用熟悉的对象映射框架来使用Mycat。

Mycat作为中间件,本身并不存储数据,但是能够实现分库分表、读写分离、容灾备份等功能,其灵活的架构为应用层减少了数据库操作的复杂性,易于应用根据自身需要进行灵活的数据分片和水平扩容。

二. 服务发现的功能设计

服务发现的必要性

当前Mycat已经成功应用与苏宁金融、物流、库存等业务的30多个生产系统中,业务层通过配置URL来连接Mycat。

那么,问题来了,每当Mycat集群规模改变或IP变化时,都需要修改URL并重启业务才能生效,引起业务中断。

因此,必须对应用提供透明的连接接入能力,动态感知Mycat集群成员及角色的变化,并实现Mycat多个节点间的负载均衡。

功能设计

在实际使用过程中,应用层通过框架最终使用JDBC驱动来连接Mycat,因此,要动态感知Mycat集群成员的变化,最合理的方式是在JDBC层实现服务发现,使用etcd组件作为一个高可用、强一致性的服务发现存储仓库,存储Mycat集群信息,当Mycat集群信息变化时,动态通知JDBC,实现连接重置。其流程图及实现步骤如下:

Mycat服务发现功能的架构设计及实现

1. Mycat增减节点时,修改ETCD中的Mycat集群信息。

2. ETCD通知JDBC中的监听线程,告知信息发生变化。

3. JDBC监听线程接收到变更通知后,更新Mycat集群配置信息,然后调用连接池flush接口,释放连接池中的全部连接。

4. 根据获取到的Mycat集群信息创建到Mycat的连接。

三. JDBC驱动的实现架构

要在JDBC层进行改造,必须首先了解JDBC的实现架构。一般的JDBC体系结构由两层组成:JDBC API提供应用程序对JDBC的管理连接;JDBC Driver API支持JDBC管理到驱动器连接。

JDBC API使用驱动程序管理器(DriverManager)和数据库特定的驱动程序(Driver)来连接到异构数据库,其主要提供了以下接口和类:

DriverManager: 管理一组JDBC驱动程序的基本服务。

Driver: 处理与数据库服务器的通信。不同类型的数据库需要实现不同的Driver。

Connection : 代表与数据库的链接,并拥有创建SQL语句的方法,以完成基本的SQL操作,同时为数据库事务提供提交和回滚方法。

Statement : 通过这个接口创建对象用来执行SQL语句。

ResultSet: 返回数据查询的结果集。

Mycat服务发现功能的架构设计及实现

四. 如何基于JDBC实现服务发现

通过以上分析,为了基于JDBC进行服务发现,可以在已有MySQL JDBC驱动的基础上,改写服务连接部分,从URL中解析出ETCD的IP和端口,在首次连接时从ETCD获取Mycat集群的实际地址和端口,拼装成真正的URL通过MySQL JDBC连接Mycat集群。

并启动ETCD监听线程,在集群信息改变时,自动重新获取,进行重连。为了完成上述功能,需要重新注册新的JDBC驱动类型,并实现Driver接口中的connect函数,完成ETCD信息获取,URL改写,同时启动ETCD监听。

注册新的驱动类型

实现新的驱动类SNDPDriver,继承自Mysql JDBC驱动的NonRegisteringDriver类,并完成在DriverManager的注册:

Mycat服务发现功能的架构设计及实现

重写Driver接口的connect函数

Driver是每个数据库驱动都必须继承的接口,由于我们仅需在connect函数中实现相关功能,因此只要重新实现connect,其他函数调用原有MySQL JDBC的实现。

(1)Driver接口定义:

Mycat服务发现功能的架构设计及实现

(2)Connect函数实现:

Mycat服务发现功能的架构设计及实现


分享到:


相關文章: