欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mycat之全局表-yellowcong

程序员文章站 2022-05-08 21:12:14
...

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

查询子节点数据

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

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

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

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

Mycat之全局表-yellowcong

全局表的插入机制

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

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

Mycat之全局表-yellowcong

全局表的查询机制

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

 explain select * from test;

Mycat之全局表-yellowcong

相关标签: mycat 全局表