赞
踩
1.1. 数据分布式切分方式
分布式架构中最难解决的是数据分布式问题,大部分数据库中间件都以分库分表作为切分方式,好处是通用,但也存在以下问题:
以核心业务对象切分方式则以产品线入口业务对象作为切分目标(比如互联网业务系统中的客户对象),开户交易途径数据库中间件,以手机号或其它入口字段作为核心字段做附带权重的客群切分,归属到数据库集群中的某个库中,并保存分配结果,以后该客户的所有交易都会被发往其归属库处理。当需要库存储扩容时,只需简单的增加MySQL归属库到数据库集群中,在数据库中间件系统中增加新归属库配置信息,并调大新库被分配权重,新客户分配归属到新库的概率变大,当新库存储增长到一定程度时调平分配权重,新客户分配归属到所有库的概率均等,直到下一次扩容。
以核心业务对象切分方式的好处是:
但也存在以下硬伤:
以分库分表切分和以核心业务对象切分是两种主流的数据分布式设计范式,各有优缺点,应在不同场景挑选合适的方式。
1.2. mysqlda
mysqlda是一款基于核心业务对象切分的Proxy模式的分布式MySQL数据库中间件。
mysqlda优势:
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归属库被选定或切换,这两个会话会被桥接起来。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。