有关分布式 MySQL 数据库中间件 MySQLDA,一文为你深入介绍~

来源:互联网 发布:无印良品淘宝旗舰店 编辑:程序博客网 时间:2024/05/16 18:45
2017-11-20 calvinwilliams ITPUB

点击蓝色字关注 "ITPUB" 一起玩耍哦~


1. 概述


1.1. 数据分布式切分方式


分布式架构中最难解决的是数据分布式问题,大部分数据库中间件都以分库分表作为切分方式,好处是通用,但也存在以下问题:

1. 扩容过程需要以切片为单位在库间移动数据。扩容规模受到切片数量限制,如果业务发展增长规模大大超出初期预估会导致切片数量不够用,陷入数据硬迁移的困境。


2. 同一业务对象的数据分散在不同库中,无法做聚合、连接等复杂处理。


3. 跨库意味着分布式事务,虽然现在有两阶段提交等解决方案,但理论上并不总是那么可靠,尤其是在金融行业苛求数据强一致性时。

以核心业务对象切分方式则以产品线入口业务对象作为切分目标(比如互联网业务系统中的客户对象),开户交易途径数据库中间件,以手机号或其它入口字段作为核心字段做附带权重的客群切分,归属到数据库集群中的某个库中,并保存分配结果,以后该客户的所有交易都会被发往其归属库处理。当需要库存储扩容时,只需简单的增加 MySQL 归属库到数据库集群中,在数据库中间件系统中增加新归属库配置信息,并调大新库被分配权重,新客户分配归属到新库的概率变大,当新库存储增长到一定程度时调平分配权重,新客户分配归属到所有库的概率均等,直到下一次扩容。


以核心业务对象切分方式的好处是:

1. 无需预估切片,其扩容过程无需移动任何数据。


2. 由于同一业务对象的数据集中在其归属库中,所以可以进行任意聚合、连接等复杂处理。


3. 每个库都是全业务库,同一业务对象的所有模块处理都在一个库中完成,不存在跨库分布式事务,数据强一致性丢还给数据库单库来保证。

但也存在以下硬伤:

1. 产品线设计初期慎重挑选核心业务对象作为切分依据,后期很难变更。


2. 有些业务系统存在多个核心业务对象,不适合使用这种切分方式,如银行线上线下整合核心。

以分库分表切分和以核心业务对象切分是两种主流的数据分布式设计范式,各有优缺点,应在不同场景挑选合适的方式。


1.2. mysqlda


mysqlda 是一款基于核心业务对象切分的 Proxy 模式的分布式 MySQL 数据库中间件。

mysqlda 优势:


  • 以核心业务对象切分方式的所有好处。

  • 支持以核心业务对象定位 MySQL 归属库(如开户用手机号或邮箱),也支持核心业务对象的关联对象(如开户后的用户 ID、用户名、账号)定位 MySQL 归属库。

  • 归属库分配权重自动调整,扩容后新库与老库的分配权重也自动调整,无需人工介入,使得所有归属库的数据量尽量自动均衡增长。

  • 已包含数据库网关高可用功能,当一个归属库当前 MySQL 主服务器不可用时自动切换到备服务器,支持多个备服务器。

  • 与 MySQL 服务器之间的连接池机制,实现了连接复用和闲置清理,提高连接和切换性能。

  • 通过在线重载配置文件,扩容新增 MySQL 归属库、调整 MySQL 服务器优先列表等完全无感。

  • 单体系统的数据分布式改造过程尽量无感。

2. 架构与原理


2.1. 体系架构




mysqlda 数据库中间件完全遵循 MySQL 通讯协议桥接应用服务器集群和 MySQL 数据库集群。


mysqlda 内部进程结构为 “父 - 单子进程”。


2.2. 工作原理


全量数据以核心业务对象切分到多个归属库中,每个归属库包含全业务表。一个归属库由一个 MySQL 服务器列表(需部署为向下游同步数据)组成,当当前 MySQL 服务器不可用时自动切换到下一个。


MySQL 数据库集群预创建相同的连接用户名、密码,相同的数据库名和应用表结构,mysqlda 预创建相同的连接用户名、密码。


启动 mysqlda,从配置文件(etc/mysqlda.conf)中装载连接用户名、密码,从保存文件(etc/mysqlda.save、etc/mysqlda. 关联对象类. save)中装载已存在的核心业务对象、关联对象 与 MySQL 数据库集群库 归属库关系信息。


应用服务器调用标准 MySQL 连接函数 / 方法连接 mysqlda,mysqlda 会遵循 MySQL 通讯协议处理 MySQL 用户登录和密码校验。


登录成功后,所有 DSL、DML 操作前,应用服务器发送 mysqlda 扩展 SQL 选择核心业务对象("select library (核心业务对象)")或关联对象类、关联对象("select library_by_correl_object (关联对象类) (关联对象)")以连接 MySQL 归属库,mysqlda 会查询其已分配的 MySQL 库核心业务对象或关联对象类、关联对象(如果没有分配过则根据加权一致性哈希算法分配一个归属库并持久化到保存文件中),从该 MySQL 归属库对应数据库服务器有序列表中选择第一个有效 MySQL 服务器及其连接池中选取空闲连接(如没有缓存连接则新建一条连接),然后桥接对外和对内连接结对,开始处理后续所有 DSL、DML 操作。


后续操作中可以也发送 mysqlda 扩展 SQL 再选择核心业务对象或关联对象类、关联对象以调整 MySQL 归属库服务器连接。


MySQL 归属库对应一个数据库服务器列表,如由 MySQL 数据库 1A(MASTER)、1B(SLAVE)、1C(SLAVE)、1D(SLAVE) 组成,1A 同步复制数据给 1B、1C 和 1D,如果 1A 出现故障不能被 mysqlda 连接,mysqlda 会依次尝试连接 1B、1C 和 1D,实现系统可用性。


应用服务器发送 mysqlda 扩展 SQL 绑定关联对象类和关联对象和核心业务对象("set correl_object 关联对象类 关联对象 核心业务对象"),mysqlda 会保存该关系并持久化到保存文件中,供以后直接用关联对象类、关联对象定位 MySQL 归属库。


2.3. 简易案例


部署了三个 MySQL 归属库,每个库有主备两台 MySQL 服务器组成。


A 用户用手机号(核心业务对象)开户,应用服务器发送手机号 13812345678 给 mysqlda 请求定位归属库("select library 13812341234"),mysqlda 通过加权一致性哈希算法计算出该手机号(分配客户)归属库 N 并持久化到保存文件中,从归属库 N 连接池中取出一个连接,把该连接与应用服务器连接桥接,交换后面的所有 SQL 和处理结果。


开户业务逻辑中创建了账户 331234567890,,应用服务器发送 mysqlda 扩展 SQL 给 mysqla("set correl_object account_no 331234567890 13812345678"),mysqlda 绑定两者关系并持久化到保存文件中。


A 用户后续处理请求,可以送手机号("select library 13812341234")或账号("select library_by_correl_object account_no 331234567890")给 mysqlda 定位、连接用户归属库,该用户的所有业务数据和业务处理都在该归属库中完成。


2.4. 内部数据实体和关系



一个 MySQL 归属库(forward_instance)对应一个 MySQL 数据库服务器有序列表(forward_servers list)。


一个 MySQL 数据库服务器有序列表(forward_servers list)下辖一个空闲连接池(unused_forward_session list)和一个工作连接池(forward_session list)。


一个核心业务对象可以绑定一个或多个关联对象类(forward_correl_object_class)、关联对象(forward_correl_object)。


一个核心业务对象或一个关联对象类、关联对象 与 MySQL 归属库 建立一个归属关系(forward_library)。


accepted_session 是应用服务器与 mysqlda 之间的通讯会话,forward_session 是 mysqlda 与 MySQL 数据库服务器之间的通讯会话,一旦一条连接上的 MySQL 归属库被选定或切换,这两个会话会被桥接起来。


来源:calvinwilliams

www.oschina.net/p/mysqlda



《双十一“超级工程”【特刊】》,开放下载啦!


每年双十一,不仅是剁手族的狂欢节,更是各大电商技术团队技术水平与技术创新实践检验的舞台,阿里、京东、网易、当当和苏宁都祭出了自己对付高流量和高峰值的大招,AI、大数据、反欺诈系统,会员系统,文件分发到镜像传输 ,这些武器的秘笈让人想近距离一窥究竟。IT168 特此准备了双十一“超级工程”特刊,分享给关心技术、尊重技术的你。


【福利】微信公众号后台回复 11” 即可下载PDF版本,文末点击阅读原文也可抢先在线阅读哦~



点击阅读原文,即刻查看双11“超级工程”特刊~



阅读全文
0 0