Mycat服务发现功能的架构设计及实现
Posted 苏宁云Cloud
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,实现连接重置。其流程图及实现步骤如下:
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: 返回数据查询的结果集。
四. 如何基于JDBC实现服务发现
并启动ETCD监听线程,在集群信息改变时,自动重新获取,进行重连。为了完成上述功能,需要重新注册新的JDBC驱动类型,并实现Driver接口中的connect函数,完成ETCD信息获取,URL改写,同时启动ETCD监听。
注册新的驱动类型
实现新的驱动类SNDPDriver,继承自Mysql JDBC驱动的NonRegisteringDriver类,并完成在DriverManager的注册:
重写Driver接口的connect函数
Driver是每个数据库驱动都必须继承的接口,由于我们仅需在connect函数中实现相关功能,因此只要重新实现connect,其他函数调用原有MySQL JDBC的实现。
(1)Driver接口定义:
(2)Connect函数实现:
以上是关于Mycat服务发现功能的架构设计及实现的主要内容,如果未能解决你的问题,请参考以下文章