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)) ;

Mycat之全局表-yellowcong_全局表

配置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;

Mycat之全局表-yellowcong_mycat_02

查询子节点数据

#进入本地数据库
mysql -u root -proot;

#使用第一个节点
select * from mycat.test;

#使用第二个节点
select * from mycat2.test;

大家可以发现,子节点里面的每一个库,都会执行全局表的插入数据信息。

Mycat之全局表-yellowcong_xml_03

全局表的插入机制

将所管理的子节点的数据,都插入。大家可以看到,向每一个节点,都插入了数据。

explain insert into test(null,'testest');

Mycat之全局表-yellowcong_分布式事务_04

全局表的查询机制

大家可以看到,全局查询的节点是随机的,不是想普通表一样,查询所有的数据库

explain select * from test;

Mycat之全局表-yellowcong_数据库_05