Mycat之全域性表-yellowcong
阿新 • • 發佈:2019-02-15
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;