在传统的业务场景中,数据量不大、并发量不高,所以单机的数据库服务基本上就可以满足了业务需要。而在互联网时代,数据爆发式增加,数据量和并发量都急剧增加,这对单机数据库就带来许多的挑战。为了解决单机数据库的瓶颈问题,我们就需要对数据库进行切分,把大库变成多个小库。
为了实现大库变成多个小库,就需要对数据库进行数据切分。数据切分,就是通过一些规则,将原来存储在单机数据库的数据,分散到多个数据库(一般都多主机)中,从而达到降低单台数据库负载的压力。数据切分,一般分为垂直切分和水平切分两种。
垂直切分就是按照不同的表或者Schema切分到不同的数据库中。垂直切分的特点就是规则简单,易于实施,可以根据业务模块进行划分,各个业务之间耦合性低,相互影响也较小。
垂直切分的优点:
垂直切分的缺点:
水平切分,主要是将一个表中的数据,根据某种规则拆分到不同的数据库的表中,相比垂直切分,更为复杂。
水平切分的优点:
水平切分的缺点:
大多数互联网业务,往往读多写少,这时候,数据库的读操作往往会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用读写分离的架构。
读写分离一般都采用数据库的双机热备功能实现,即第一台数据库服务器,是对外提供增删改业务的服务;第二台数据库主要进行读的操作。·
将大量的读操作从数据库中剥离,让读操作从专用的读数据库中读取数据,大大缓解了数据库的访问压力,也使得读取数据的响应速度得到了大大的提升。读写分离就是解决数据库性能瓶颈的“银弹”吗?如果主从数据库之间的同步出现延迟、甚至宕掉了该怎么办呢?这就是读写分离的弊端,当主从间的数据同步挂掉,或者同步延迟比较大时,写库和读库的数据不一致,对于实时要求比较高的系统,用户可能无法接受这个数据的不一致问题。
MyCat 是什么?从定义和分类来看,它是一个开源的分布式数据库系统,前端的用户可以把它看成一个数据库代理,用MySql客户端和命令行工具都可以访问,而其后端则是用MySql原生的协议与多个MySql服务之间进行通信。MyCat的核心功能是分库分表,即将一个大表水平切分成N个小表,然后存放在后端的MySql数据当中。
MyCat发展到目前的版本,已经不是一个单纯的MySql代理了,它的后端支持MySql,Oracle,SqlServer,DB2等主流的数据库,也支持MongoDB这种NoSql数据库。而对于前端的用户来说,无论后端采用哪一种数据库,在MyCat里都是一个传统的数据库,支持标准的SQL语句,对于前端的开发人员来说,可以大大地降低开发难度,提升开发速度。
上述内容来至于慕课网的Java架构师课程的教学笔记。
基于MyCat实现读写分离,需要准备MySQl的主从环境,具体搭建方式,请参考《MySql5.7 数据库安装及主从同步配置》。
MyCat下载地址:http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/
或者通过wget命令下载:
wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
修改该文件,主要用来配置MyCat账号密码和数据库名。
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0property>
system>
<firewall>
<whitehost>
<host host="1*7.0.0.*" user="root"/>
<host host="*" user="root" />
whitehost>
<blacklist check="false">
blacklist>
firewall>
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">db_testproperty>
<property name="defaultSchema">db_testproperty>
user>
<user name="user">
<property name="password">123456property>
<property name="schemas">db_testproperty>
<property name="readOnly">trueproperty>
<property name="defaultSchema">db_testproperty>
user>
mycat:server>
schema.xml文件主要是用来配置mycat逻辑库与真实的MySQL数据库的映射关系了。其中涉及到了一下几个元素:
其中,dataHost 节点中有几个属性balance、writeType、switchType,他们的含义如下:
balance属性:
writeType属性:
switchType属性:
switchType=“-1”, 表示不自动切换
switchType=“1”, 默认值,自动切换
switchType=“2”, 基于MySQL 主从同步的状态决定是否切换
我们这里主要为了实现读写分离,所以最后的配置如下:
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="db_test" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">schema>
<dataNode name="dn1" dataHost="db_host" database="test" />
<dataHost name="db_host" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM1" url="192.168.1.8:3306" user="root" password="123456">
<readHost host="hostS2" url="192.168.1.9:3306" user="root" password="123456" />
writeHost>
dataHost>
mycat:schema>
在mycat的bin目录下,执行启动命令:
./mycat start
启动成功后,使用Navicat连接mycat,方式和连接MySQL一样,不过mycat的默认端口是8066。同时需要在server.xml配置上白名单,不然登录会被拒绝。
分别使用root、user两个用户(前面在server.xml中配置的)建立连接,我们在主数据库192.168.1.8上,添加数据,这个时候两个连接看见的数据一样,如果我们在从数据库192.168.1.9上添加数据,这个时候就只有user用户的连接可以看到数据(主要为了验证读库操作,这里记得需要设置balance=“3”)。
在这一篇博文中,我们了解了mycat的一些基本知识和基于mycat实现的读写分离,初步了解了mycat的用法。后续在学习的过程中,我们会不断进行尝试和记录,分库分表等尝试将在后续进行。