1. 程式人生 > >Mycat之全域性表-yellowcong

Mycat之全域性表-yellowcong

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;

這裡寫圖片描述