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
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
分片配置說明
可以看到,分片從schemal.xml一級一級的引用到組後的分片配置。
測試插入資料
重新開機伺服器,然後進入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');
實體節點資料檢視
#進入實體節點
mysql -h 127.0.0.1 -P 3306 -u root -proot
#檢視節點1,也就是預設節點
select * from mycat.test6;
#檢視節點2
select * from mycat2.test6;
檢視實體節點中的資料情況,發現,隻向預設節點中,插入了資料,沒有向第二個節點中插入資料。
錯誤集合
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檔案
導緻錯誤的原因查找,删除一個節點,就不會報錯了。
ERROR 1064 (HY000): bad insert sql (sharding column:ID not provided,INSERT INTO test2 (NULL, ‘doubi1’)
包這個問題的原因很明顯,就是我們沒有設定mycat中虛拟表的id自增,是以導緻沒有擷取到id,是以導緻了這個問題。
#修改後的語句
insert into test2(name) values('doubi1'),('doubi2'),('doubi3'),('yellowcong');
ERROR 1064 (HY000): insert must provide ColumnList
必須提供添加的列,直接插入,導緻了問題,是以我們需要修該插入語句
#原來語句
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生成政策是根據資料庫生成的。
vim conf/server.xml
0 表示是表示使用本地檔案方式。
1 表示的是根據資料庫來生成
2 表示時間戳的方式 ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重複累加)
<property name="sequnceHandlerType">2</property>