(联通(广东)产业互联网有限公司 广东广州 510000)
摘要:MyCat中间件是当前主流的分布式代理中间件,能够降低分布式数据库使用的复杂性和代价。本文结合某运营商IT系统的转型实例,对基于MyCat中间件的分布式数据库实现原理以及其应用进行了详细的介绍,为有关需要提供参考。
关键词:MyCat;分布式数据库;实现;应用
引言
随着信息时代的发展以及互联网技术的不断推广应用,数据日益累积,社会各个行业都普遍面临着海量数据带来的挑战。而分布式关系数据库作为大数据存储和处理的主要解决方案之一,在企业生产中得到越来越广泛的应用。在这背景下,研究基于MyCat中间件的分布式数据库实现与应用具有十分重要的意义。
1.Mycat分片规则
随着互联网的快速发展,海量数据的存储问题越来越突出,数据的量级也是指数的增长。分片,是指通过对某一个字段通过特定的算法进行计算、分片,将原本存放在一个数据库中的数据分散存放到多个数据库,以达到分散单节点数据的压力。数据分片在维度上可以分为垂直分片和水平分片。垂直分片:在传统系统设计中应用非常广泛,按照不同的业务进行数据库分库。在运营商支撑系统就按照业务分为营业数据库、账务数据库、报表数据库等,如图1。水平分片:将每个独立的表按照一定的计算规则,将每个表中的数据分散到多个数据库中。每个库的数据表结构一样,但是存储的数据不一样,如图2。
图1系统数据垂直分片
图2系统数据水平分片
分片规则:Mycat是在数据库和业务应用之间增加的一个数据库中间层,可以对数据量小且不需要做数据切片的表归集到非分片表;对于数据量大,并且业务上有分片需求的表归集为分片表。分片表按照分片规则分为以下四大类:
ER关系分片:ER模型是实体关系模型,基本元素是实体、关系和属性,Mycat 针对ER关系表的切分规则中,使得有相互依赖的表能够按照某一个规则切分到相同的节点上,避免跨库 Join 关系查询。比如订单表和订单明细表就存在依赖关系,可以抽象为父子关系。子表的记录与所关联的父表存放在同一个数据分片上。
时间分片:将不同月甚至日的数据分散到不同的库中。具体可以按照日期、单月小时、自然月以及日期范围hash算法。
固定值分片:按照所选分片字段通过特定的计算,按照计算得到的值进行分片。具体如下:
(1)取模分片;
(2)枚举分片;
(3)范围分片;
(4)范围求模分片。
Hash算法分片:通过hash算法对分片字段进行计算,将计算后的值按照求模、范围等进行分片。具体方法有:
(1)固定分片hash算法;
(2)字符串hash求模范围算法;
(3)一致性hash算法。
通过以上的分片方法,可以将数据按照既定的规则落到对应的分片数据库中。
2.Mycat搭建读写分离
读写分离,简单地说就是把对数据库的读和写分开,以应对不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样可以有效地减轻单台服务器的压力。主服务器进行写操作后,数据及时同步到所读的数据库,尽可能保证读写数据库的数据一致。正常情况下,一个写数据库的操作在几十毫秒内即可完成,而系统中大部分语查询语句需要几秒甚至几分钟才能得到结果,而这些查询语句需要消耗大量的计算能力,高峰期间甚至可以引起系统的崩溃。所以从保护数据的角度来看,也需要进行有容灾处理机制,避免没有主从复制机制的单节点数据库。
MySQL的主流读写分离是Master-Slave和GaleraCluster两种模式。
Master-Slave是MySQL数据库的标准读写分离模式。一般由Master节点负责写操作,在Master后配置多个Slave节点作为读的操作。Slave节点的多少取决于系统的读操作的压力,可以进行水平扩展。具体原理图如下:
图3Master-Slave读写分离同步机制
此方法同步机制:
(1)主库在每次更新数据前,将更新的记录到二进制文件中。
(2)备库将主库的二进制日志复制到本地的中继日志中。具体原理是备库启动一个工作线程,和主库建立连接,用来监控主库更新状态,将主库的二进制日志变化写入到本地中继日志中。
(3)备库启动一个SQL线程,将中继日志中的数据读取并在备库中执行,完成备库的数据更新。
GaleraCluster读写分离模式是一种多主同步复制模式。该模式可以在任意节点进行读写及复制,各节点之间无延迟且节点宕机也不会导致数据丢失。所有的节点保持相同的状态,节点间没有不同的数据。无需手工备份当前数据库并复制到新节点;无需更改或者很小的改动可以实现任意节点上进行读写。并且可以自动剔除故障节点,自动加入新节点;该模式通常采用至少3个MySQL节点作为一个Cluster。理论上可以进行多写,但是在多个案例中,多写会引起较为严重的锁等待,所以使用Galera推荐使用一写多读。
图4GaleraCluster读写分离同步机制
Mycat读写分离:Mysql的复制由Mysql自行控制,Mycat不负责数据的同步问题。
Mycat作为数据库中间件,在配置好数据库的从属关系后,只需要配置相关参数既可以实现读写分离,和前端应用无关,应用侧只需要侧重业务即可。
读写模式的变更,通过修改Mycat中配置文件属性balance来实现。
<dataHostname="192.168.0.3"maxCon="999"minCon="9"balance="1"writeType="0"dbType="mysql"dbDriver="native">
<heartbeat>selectuser()</heartbeat>
<!--canhavemultiwritehosts-->
<writeHosthost="nodeMaster1"url="192.168.0.4:3306"user="root"password="root">
<!--canhavemultireadhosts-->
<readHosthost="nodeSlave1"url="192.168.0.5:3306"user="root"password="root"weight="1"/></writeHost>
</dataHost>
当balance=0时,不启用读写分离,所有客户端的读操作都将发送当当前的writeHost节点nodeMaster1实例。
当balance=1时,所有的读操作都发送当前的writeHost对应的writeHost和备用的writeHost。此情形主库可以提供高效的写操作,其他机器提供读操作。
当balance=2时,所有的读操作点发送给所有的writeHost和readHost。此情形适合主库压力不大,也可以分担读操作,更合理的运用资源。
3.Mycat故障切换
Mycat主从切换:通过心跳监控各个MySQL节点的活动情况,当任何一定出现心跳检测异常,则进行故障切换。
图5Mycat主从切换原理图
如图5所示,当Mysql配置为Master-Slave的复制方案,My⁃cat需要将Master节点和Slave节点都作为Mycat配置的data⁃Host元素;此时将Master节点设置为Mycat的dataHost的Write⁃Node,对应的从节点设置为readNode。为了保证WriteNode和ReadNode可用,必须对其进行监控,因此我们对两类节点发起心跳检测。而作为MySQL的复制方案,Master节点和Slave节点按照既定的复制策略保持数据同步。
在应用程序对数据库发起请求时,Mycat将所有的DMLSQL发送到WriteNode节点,如果Mycat配置了读写分离,那么所有的查询按照策略就会发送到对应ReadHost(具体规则见上章节)。
切换机制,当一个dataHost里配置了多个WriteHost时,如果检测到第一个WriteHost宕机,Mycat通过心跳检测监控,如果发现3次检测失败(默认配置为3次),则Mycat自动切换到下一个可用的WriteHost接管服务。并且在Mycat配置文件中记录当前所用的WriteHost节点顺序(配置文件为conf/dnindex.properties)。
解决了MySQL的故障切换,那么如何保证Mycat的故障切换?由于Mycat自身属于无状态的中间件,故可以很容易地进行集群式部署,提供高可用方案。此时可以借助HAproxy来进行负载可以解决,此处不展开说明。
4.分布式事务
在分布式系统中,各个节点在物理上都是独立的,每个节点上的数据操作都可以满足ACID。但是各独立节点之间无法知道其他节点事务的执行情况,无法保证多台机器中的数据保持一致,因此必须引入分布式事务,要么所有节点上的数据操作全部执行成功,要么全部不执行。
Mycat具体的分布式流程处理见图6:
图6Mycat分布式事务流程图
(1)在应用层设置事务不能自动提交;
(2)在Mycat中开启XA事务管理器,对本次事务记录对应的XID,瓶装XAENDXID,XAPREPAREXID最后进行提交,如果在提交过程中任何一个节点如果异常,则直接回滚事务XID。
(3)在多个节点MySQL中全部进行XACOMMIT,提交成功后,事务结束;如果异常,则对事务进行重新提交或者回滚。
5.结语
综上所述,在分布式数据库的实际应用中,分布式数据库常常采用中间件来降低数据库的传输代价,提高系统运行效率。其中,MyCat是当前的一种主流中间件,本文通过实现与应用MyCat中间件的分布式数据库,实现了运营商支撑系统的转型,提高系统的运行效益。
参考文献:
[1]符小周,胡洪云.分布式数据库的一致性与可用性分析[J].信息与电脑(理论版),2018(14):130-131.
[2]张琴,黄凯,袁佩玲,杨青,郑世珏.楚国数字文物分布式数据库设计[J].电子技术与软件工程,2018(08):192-194.
[3]姚丽丽,万玉建,朱峰.基于MyCat的建筑能耗监管系统数据库设计与实现[J].电脑编程技巧与维护,2015(24):5-7+14.
论文作者:吴振宇
论文发表刊物:《电力设备》2018年第17期
论文发表时间:2018/11/11
标签:节点论文; 分片论文; 数据库论文; 数据论文; 分布式论文; 操作论文; 系统论文; 《电力设备》2018年第17期论文;