天天看點

五分鐘帶你玩轉mycat(三)mycat異常集合

Mycat切片規則挺多的,我就簡單講講一些吧,這個是自定義範圍分片,簡單來将,就是我有兩個資料庫,a放多少條記錄,b放多少調資料。這樣就實作了分片的操作。實作步驟:1、建立資料庫。2、配置schemal.xml,3、配置service.xml,4、修改rule.xml,設定預設插入的節點、5、修改auto-sharding-long.txt,設定置分片範圍。

建立資料庫

這個地方我主鍵采用的是本地時間戳的方式來自動生成id

建立兩個資料庫,并都建立test表

#建立資料庫
create database mycat;
 
#添加表
use mycat 
#建立表test
create table test6(id varchar(18) primary key,name varchar(32)) ;
 
#建立資料庫
create database mycat2;
 
#添加表
use mycat 2
#建立表test
create table test6(id varchar(18) primary key,name varchar(32)) ;      
五分鐘帶你玩轉mycat(三)mycat異常集合

配置mycat

1、配置schemal.xml

#編輯添加table
vim conf/schemal.xml
 
#添加表,設定rule="auto-sharding-long" ,自動根據範圍分片
<table name="test6" dataNode="jdbc_node1,jdbc_node2" primaryKey="id" autoIncrement="true" rule="auto-sharding-long"/>      

下面是完整配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 
        <schema name="yellowcong" checkSQLschema="false" sqlMaxLimit="1000">
                <table name="test6" dataNode="jdbc_node1,jdbc_node2" primaryKey="id" autoIncrement="true" rule="auto-sharding-long"/>
 
        </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>      

2、配置server.xml

#編輯
vim ./conf/server.xml
 
#確定這個id的生成政策為2 ,表示為根據時間戳
<property name="sequnceHandlerType">2</property>      
<?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>
 
                <!--預設為type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
                <property name="processorBufferPoolType">0</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>      

3、修改rule.xml

vim ./conf/rule.xml
 
#添加defaultNode ,設定預設節點為0 ,不設定就會報錯
<function name="rang-long"
         class="io.mycat.route.function.AutoPartitionByLong">
         <property name="mapFile">autopartition-long.txt</property>
         <property name="defaultNode">0</property>
 </function>      

4、修改auto-sharding-long.txt

設定分片大小和規則

vim ./conf/autopartition-long.txt
 
#預設是三個,我們需要删除最後一個,不然就會報錯,說節點少了
#K=1000條記錄,M=10000條記錄,那麼下面三個配置就是0~500萬的記錄會存在資料庫節點1的表中,500萬~1000萬會存在節點2的表中
0-500M=0
500M-1000M=1      
五分鐘帶你玩轉mycat(三)mycat異常集合

分片配置說明

可以看到,分片從schemal.xml一級一級的引用到組後的分片配置。

五分鐘帶你玩轉mycat(三)mycat異常集合

測試插入資料

重新開機伺服器,然後進入mycat,測試資料

#進入mycat
mysql -h 127.0.0.1 -P 8066 -u root -proot
 
#使用yellowcong資料庫
use yellowcong;
 
#插入多條資料
insert into test6 (name) values ('doubi1'),('doubi2'),('doubi3'),('yellowcong');      
五分鐘帶你玩轉mycat(三)mycat異常集合

實體節點資料檢視

#進入實體節點
mysql -h 127.0.0.1 -P 3306 -u root -proot
 
#檢視節點1,也就是預設節點
select * from mycat.test6;
 
#檢視節點2
select * from mycat2.test6;      

檢視實體節點中的資料情況,發現,隻向預設節點中,插入了資料,沒有向第二個節點中插入資料。

五分鐘帶你玩轉mycat(三)mycat異常集合

錯誤集合

please make sure table datanode size = function partition size

出現這個問題的原因,可能是由于rule.xml配置檔案問題,

<span style="color:#000000"><code> Caused by: io.mycat.config.util.ConfigException: Illegal table conf : table [ TEST2 ] rule function [ rang-long ] <span style="color:#000088 !important">partition</span> <span style="color:#000088 !important">size</span> : <span style="color:#006666 !important">3</span> > table datanode <span style="color:#000088 !important">size</span> : <span style="color:#006666 !important">2</span>, please make sure table datanode <span style="color:#000088 !important">size</span> = function <span style="color:#000088 !important">partition</span> <span style="color:#000088 !important">size</span></code></span>      
  • 五分鐘帶你玩轉mycat(三)mycat異常集合

檢視rule.xml檔案

五分鐘帶你玩轉mycat(三)mycat異常集合

導緻錯誤的原因查找,删除一個節點,就不會報錯了。

五分鐘帶你玩轉mycat(三)mycat異常集合

ERROR 1064 (HY000): bad insert sql (sharding column:ID not provided,INSERT INTO test2 (NULL, ‘doubi1’)

包這個問題的原因很明顯,就是我們沒有設定mycat中虛拟表的id自增,是以導緻沒有擷取到id,是以導緻了這個問題。

五分鐘帶你玩轉mycat(三)mycat異常集合
#修改後的語句
insert into test2(name) values('doubi1'),('doubi2'),('doubi3'),('yellowcong');      

ERROR 1064 (HY000): insert must provide ColumnList

必須提供添加的列,直接插入,導緻了問題,是以我們需要修該插入語句

五分鐘帶你玩轉mycat(三)mycat異常集合
#原來語句
insert into test2 (null,'doubi1'),(null,'doubi2'),(null,'doubi3'),(null,'yellowcong');
 
#修改後的語句
insert into test2(name) values('doubi1'),('doubi2'),('doubi3'),('yellowcong');      

can’t find any valid datanode :TEST2 -> ID ->

如果沒有指定function中defaultNode值,則插入不識别的枚舉值時,報以下錯誤,是以需要指定

ERROR 1064 (HY000): can't find any valid datanode :TEST2 -> ID -> 953095995447709696      
  • 五分鐘帶你玩轉mycat(三)mycat異常集合

指定defaultNode,預設節點

Out of range value for column ‘id’ at row 1

導緻這個問題的大緻原因可能是由于mycat生成的id和資料庫的字元長度對不上,超過了資料庫配置的預設長度所導緻的。解決辦法,就是修改數server.xml,設定id生成政策是根據資料庫生成的。

五分鐘帶你玩轉mycat(三)mycat異常集合
vim conf/server.xml
 
0 表示是表示使用本地檔案方式。
1 表示的是根據資料庫來生成
2 表示時間戳的方式 ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重複累加)
<property name="sequnceHandlerType">2</property>      

參考文章

http://www.linuxidc.com/Linux/2016-01/127829.htm