一、前言
在上一篇博客中,小编向大家介绍了一下mycat和数据库切分的一些知识,具体实践还是要亲手实践,在项目中体验才会有感觉,所以在这一片博客中,小编给大家做一个用mycat水平切分数据库表的demo。
二、环境说明
Centos 7
jdk-8u131-linux-x64.rpm
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mysql
Navicat数据库管理工具
说明:
小编搭建三天Linux虚拟机:192.168.137.16,192.168.137.17,192.168.137.18。布置结构图如下
三、达到的效果
3.1 Mycat支持的数据库
3.2采用分片规则
数据库中数据主键id以bigint类型,每个分片要求最多有500w条数据,如果超过500万,就向下一个分片中存储。
说明:
1. 逻辑库(schema) :
前面一节讲了数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
2. 逻辑表(table):
既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
分片表:是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。 总而言之就是需要进行分片的表。
非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。
3. 分片节点(dataNode)
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。
4. 节点主机(dataHost)
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。
5. 分片规则(rule)
前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。
四、mycat安装
4.1 安装jdk,1.7以上
由于Mycat是由java开发,开发依赖了java7中的一些特性,所以需要依赖jdk1.7以上的环境。
1、下载jdk并上传到/usr/java目录
jdk7下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 选择对应的linux版本,下载rpm文件。这里选择的是jdk-7u79-linux-x64.rpm。并上传到Linux的/usr/java目录下(java目录不存在则进行创建)。
2、解压安装
运行如下命令进行解压
rpm -ivh 文件名称
3、配置profile文件
运行如下命令:
vim /etc/profile
将如下内容添加到profile文件末尾并保持
export JAVA_HOME=/usr/java/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
保存之后,运行如下命令使配置生效
source /etc/profile
检查jdk是否安装成功,运行如下命令
java -version
4.2 安装Mycat
1.把Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz安装包解压,直接使用:
tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
2.建议将mycat放到/usr/local/mycat目录下。
3.进入mycat目录,启动mycat
./mycat start
停止:
./mycat stop
mycat 支持的命令{ console | start | stop | restart | status | dump }
Mycat的默认端口号为:8066
4.3 安装mysql
关于安装步骤,小编在【Mysql】Linux环境安装Mysql中写过了安装步骤,不会的小伙伴,可以选择性的补课。
这里,小编向192.168.137.16 安装了mysql,建立了db1和db3两个数据库,向192.168.137.17安装了mysql,建立了db2:
4.4 配置schema.xml
schema.xml文件可以说是Mycat配置的核心,本意是逻辑表的意思。
Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。
schema 标签用于定义MyCat实例中的逻辑库
Table 标签定义了MyCat中的逻辑表
dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。
dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。
进入到mycat/conf目录下,通过vim schema.xml
修改配置文件:
在schema中我们配置了逻辑表table,在table中指明了数据节点和分片规则rule,这里我们使用的是auto-sharding-long,这个规则会根据id的大小来进行分片,id超出某个范围会在某个表内。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.>
<!--配置逻辑表:指明是否分表,分成几个表-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- 对tb_item表进行分表,分片规则为,auto-sharding-long根据id范围 -->
<table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<!--配置分片节点:指明要分库的节点主机--
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost2" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<!--配置节点主机1:指明连接情况,主机地址-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.137.16:3306" user="root"
password="root">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
<!--配置节点主机2:指明连接情况,主机地址-->
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.137.17:3306" user="root"
password="root">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
</mycat:schema>
4.5 配置server.xml,设置Mycat的用户名和密码
server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。这里我们只需要修改user。
Server.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">1</property>
<!--
单位为m
-->
<property name="memoryPageSize">1m</property>
<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</property>
<!--是否采用zookeeper协调切换 -->
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火墙设置 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">false</property>
</user>
</mycat:server>
4.6 分片规则rule.xml
rule.xml这个配置文件不用修改,使用默认的就可以了,在这个文件中,定义了很多的分片规则,我们可以根据不同的情形来选择不同的规则。具体的分片细节。
4.7 运行
配置好后,运行mycat:
使用navcat连接mycat,连接信息和server.xml配置的用户信息一样,端口是8066:
打开数据库后,发现有tb_item表:
同时在16和17数据口的db1、db2、db3中都发现了tb_item表:
向mycat中的tb_item插入数据后:
所有的数据都会在mycat中的tb_item中显示,因为我们使用的分片规则是auto-sharding-long 根据id范围分片,当id小于500万的时候,数据会存储在db1中,大于500万小于1000万的时候,数据会放到db2中,当数据大于1000万小于1500万的时候存储在db3中。
mycat:
db1:
db2:
db3:
五、小结
通过配置mycat,对数据库数据进行分片使用,这个真的让数据库的性能提升了不少,把数据库分片管理,提高了性能,使用也更加方便了。下一篇博客向大家介绍mycat的分片规则。