1. mycat介绍
myCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度
2.使用介绍:
本次演示的是基于mysql数据库,通过中间件mycat实现分库分表功能。
3.环境
3台物理机linux操作系统
其中两台安装Mysql 5.7
另一台安装Mycat
4.原理图
5.搭建过程
- 下载mycat
http://mycat.sourceforge.net/ - 安装及修改配置文件
下载好安装包,解压即可
Mycat分为3个重要的配置文件,分别为 schema.xml server.xml rule.xml
1.scheme.xml
此配置文件是设置整体的scheme拆分任务;节点配置信息;表拆分信息;以及底层mysql数据库登录方式。
具体内容如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycat" checkSQLschema="false" sqlMaxLimit="1000"> --schema任务配置
<table name="test1" primaryKey="ID" dataNode="dn1,dn3,dn2" rule="auto-sharding-long"/> --表test1 拆分的节点以及拆分规则
<table name="test2" primaryKey="ID" dataNode="dn2,dn4" rule="rule1"/>
</schema>
<dataNode name="dn1" dataHost="192.168.0.3" database="db1" /> --节点信息配置
<dataNode name="dn2" dataHost="192.168.0.3" database="db2" />
<dataNode name="dn3" dataHost="192.168.0.4" database="db3" />
<dataNode name="dn4" dataHost="192.168.0.4" database="db4" />
<dataHost name="192.168.0.3" maxCon="1000" minCon="10" balance="0" --底层mysql登录方式
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="mysql1" url="192.168.0.3:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="192.168.0.4" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="mysql2" url="192.168.0.4:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
2.server.xml
此文件配置全局防火墙信息。
<?xml version="1.0" encoding="UTF-8"?>
<!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="processorBufferPoolType">0</property>m-vy288c43d05418f4
<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>
<firewall>
<whitehost>
<host host="127.0.0.1" user="root"/>
<host host="localhost" user="root"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
<user name="root">
<property name="password">123456</property>
<property name="schemas">mysql</property>
</mycat:server>
3.rule.xml
此配置文件配置的是表的拆分规则,以及拆分规则底层文件配置,
具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
c language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="test1"> --表test1拆分规则配置
<rule>
<columns>ID</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<tableRule name="test2">
<rule>
<columns>ID</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property>
<property name="count">2</property>
<property name="virtualBucketTimes">160</property>
</function>
<function name="crc32slot"
class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">2</property>
</function>
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
<function name="latestMonth"
class="io.mycat.route.function.LatestMonthPartion">
<property name="splitOneDay">24</property>
</function>
<function name="partbymonth"
class="io.mycat.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2015-01-01</property>
</function>
<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
<property name="mapFile">partition-range-mod.txt</property>
</function>
<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
<property name="totalBuckets">3</property>
</function>
</mycat:rule>
6.底层mysql配置
Mysql需要授予mycat所在主机的登录权限
在192.168.0.3上:
mysql> grant all on db1.* to 'root'@'192.168.0.4' identified by '123';
mysql> grant all on db2.* to 'root'@'192.168.0.4' identified by '123';
在192.168.0.4上:
mysql> grant all on db3.* to 'root'@'192.168.0.4' identified by '123';
mysql> grant all on db4.* to 'root'@'192.168.0.4' identified by '123';
7.测试功能
1.开启mycat:
2.在mycat所在主机登录mysql
由上图可以看到,在mycat所在主机中登录mysql 会看到已经创建好的schema 下面有两个表 test1 test2
3.插入数据测试:
插入三条数据,在mycat 所在主机select会显示所有数据
在底层数据库中指挥显示根据拆分规则插入的数据:
192.168.0.4中结果如下
192.168.0.3中结果如下