Mycat中表的类型中,定义了全局表和普通表,全局表,可以说就是在每一个数据库节点中,都存在,在mycat中,对全局表的变更 操作,都会发送到每一个节点上,全局表的特点是,变化小,数据量不是特别多,而且全局都是依赖于它的,这种表在系统中,常见的是基础表,比如菜单、网站系统信息,数据字典等。全局表在mycat中,也是很有优先权的,可以和任何的表进行join操作
全局表的作用
在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性:
变动不频繁
数据量总体变化不大
数据规模不大,很少有超过数十万条记录。
鉴于此,MyCAT 定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:
1、全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
2、全局表的查询操作,只从一个节点获取
3、 全局表可以跟任何一个表进行 JOIN 操作
创建测试数据库
创建两个数据库,并都创建test表
#创建数据库
create database mycat;
#添加表
use mycat
#创建表test
create table test(id int auto_increment primary key,name varchar(32)) ;
#创建数据库
create database mycat2;
#添加表
use mycat 2
#创建表test
create table test(id int auto_increment primary key,name varchar(32)) ;
配置schemal.xml
vim conf/schemal.xml , 配置表的type为global类型的,如果不配置就会默认为普通表类型,全局表不用配置rule,因为全局表在mycat的所有子节点中,都是同步的
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="yellowcong" checkSQLschema="true" sqlMaxLimit="1000">
<table name="test" dataNode="jdbc_node1,jdbc_node2" primaryKey="id" type="global" />
</schema>
<!--多个数据库-->
<dataNode name="jdbc_node1" dataHost="localhost" database="mycat" />
<dataNode name="jdbc_node2" dataHost="localhost" database="mycat2" />
<!-- 快递员表,非分片表 -->
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" />
</dataHost>
</mycat:schema>
配置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
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
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="serverPort">8066</property>
<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> -->
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<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>
<user name="root">
<property name="password">root</property>
<property name="schemas">yellowcong</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">yellowcong</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
插入数据到mycat
#指定连接的服务器
#-proot,后面的root是密码
mysql -h 127.0.0.1 -P 8066 -u root -proot
#使用 yellowcong 数据库
use yellowcong
#插入表
INSERT INTO test VALUES(NULL,'doubi1'),(NULL,'doubi2'),(NULL,'doubi3');
#查询插入的数据
select * from test;
查询子节点数据
#进入本地数据库
mysql -u root -proot;
#使用第一个节点
select * from mycat.test;
#使用第二个节点
select * from mycat2.test;
大家可以发现,子节点里面的每一个库,都会执行全局表的插入数据信息。
全局表的插入机制
将所管理的子节点的数据,都插入。大家可以看到,向每一个节点,都插入了数据。
explain insert into test(null,'testest');
全局表的查询机制
大家可以看到,全局查询的节点是随机的,不是想普通表一样,查询所有的数据库
explain select * from test;