基于Mycat的分布式数据库在运营商IT系统转型中的实现与探索
2018-07-28周智
周智
摘要:近几年由于传统互联网转型到移动互联网,通信运营商的运营压力倍增,支撑系统规模越来越大,行业应用所产生的数据量呈爆炸式增长,并且访问的并发量也呈现大幅的增长。无论从数据的存储上还是访问上,已经远远超出了传统计算机技术和信息系统的处理承载能力。而传统的集中式数据库面对大规模数据处理逐渐变现出其局限性。Mycat开源分布式数据库中间件可以将MySQL很简便部署为分布式,易于扩展,安全,可以替代Oracle数据库。下面笔者结合运营商IT转型中来介绍其实现原理以及探索。
关键词:Mycat;MySQL;分布式数据库;运营商IT系统
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2018)15-0025-03
1概述
在移动互联网时代,使用互联网的用户激增,大量数据存储以及超高并发访问成为系统设计与使用的问题,对于大量数据的处理需要应用新的技术方案。传统数据库存在先天性的弊端,即单机(单库)性能瓶颈,却又扩展困难。如果传统数据易于扩展,由单个的节点组合成為一个逻辑上的数据库,既可以解决此类问题。国产的开源数据库中间件Mycat能够支持此类扩展。这里就Mycat实现原理进行展开说明。
2 Mycat分片规则
分片,是指通过对某一个字段通过特定的算法进行计算、分片,将原本存放在一个数据库中的数据分散存放到多个数据库,以达到分散单节点数据的压力。数据分片在维度上可以分为垂直分片和水平分片。
垂直分片:在传统系统设计中应用非常广泛,按照不同的业务进行数据库分库。在运营商支撑系统就按照业务分为营业数据库、账务数据库、报表数据库等,如图:
水平分片:将每个独立的表按照一定的计算规则,将每个表中的数据分散到多个数据库中。每个库的数据表结构一样,但是存储的数据不一样。
分片规则:Mycat位于应用和数据库的中间层,按照业务要求,可以对数据量小且不需要做数据切片的表归集到非分片表;对于数据量大,并且业务上有分片需求的表归集为分片表。分片表按照分片规则分为以下四大类:
ER关系分片:ER模型是实体关系模型,基本元素是对系统抽象化的实体数据,Mycat将此关系引入到数据分片的规则中,使有相关依赖关系的表能够按照一定的业务规则切分到相同的节点上,避免数据的跨库查询。比如订单表和订单明细表就存在依赖关系,可以抽象为父子关系。子表的记录与所关联的父表存放在同一个数据分片上。
时间分片:将不同月甚至日的数据分散到不同的库中。具体可以按照日期、单月小时、自然月以及日期范围hash算法。
固定值分片:按照所选分片字段通过特定的计算,按照计算得到的值进行分片。具体如下:
3 Mycat搭建读写分离
读写分离,简单地说就是把对数据库的读和写分开,以应对不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样可以有效地减轻单台服务器的压力。主服务器进行写操作后,数据及时同步到所读的数据库,尽可能保证读写数据库的数据一致。正常情况下,一个写数据库的操作在几十毫秒内即可完成,而系统中大部分语查询语句需要几秒甚至几分钟才能得到结果,而这些查询语句需要消耗大量的计算能力,高峰期间甚至可以引起系统的崩溃。所以从保护数据的角度来看,也需要进行有容灾处理机制,避免没有主从复制机制的单节点数据库。
MySQL的主流读写分离是Master-Slave和Galera Cluster两种模式。
Master-Slave是MySQL数据库的标准读写分离模式。一般由Master节点负责写操作,在Master后配置多个Slave节点作为读的操作。Slave节点的多少取决于系统的读操作的压力,可以进行水平扩展。具体原理图如下:
此方法同步机制:
a) 主库在每次更新数据前,将更新的记录到二进制文件中。
b) 备库将主库的二进制日志复制到本地的中继日志中。具体原理是备库启动一个工作线程,和主库建立连接,用来监控主库更新状态,将主库的二进制日志变化写入到本地中继日志中。
c) 备库启动一个SQL线程,将中继日志中的数据读取并在备库中执行,完成备库的数据更新。
Galera Cluster读写分离模式是一种多主同步复制模式。该模式可以在任意节点进行读写及复制,各节点之间无延迟且节点宕机也不会导致数据丢失。所有的节点保持相同的状态,节点间没有不同的数据。无需手工备份当前数据库并复制到新节点;无需更改或者很小的改动可以实现任意节点上进行读写。并且可以自动剔除故障节点,自动加入新节点;
该模式通常采用至少3个MySQL节点作为一个Cluster。理论上可以进行多写,但是在多个案例中,多写会引起较为严重的锁等待,所以使用Galera推荐使用一写多读。
Mycat读写分离:Mysql的复制由Mysql自行控制,Mycat不负责数据的同步问题。
Mycat作为数据库中间件,在配置好数据库的从属关系后,只需要配置相关参数既可以实现读写分离,和前端应用无关,应用侧只需要侧重业务即可。
读写模式的变更,通过修改Mycat中配置文件属性balance来实现。
<!-- can have multi write hosts -->
<!-- can have multi read hosts -->