1. 程式人生 > >Mycat之資料庫分片(分片列舉)-yellowcong

Mycat之資料庫分片(分片列舉)-yellowcong

列舉分片,簡單來講,就是根據某個值,決定這條資料放到哪一個庫裡面。我現在有個需求,我有很多使用者,根據地址來放到資料庫,三個資料庫,湖北、北京、上海。實現的步驟:1、建立資料庫,2、配置schema.xml檔案,3、配置server.xml,4、新增rule.xml,5.新增partition-hash-int-local.txt (檔名和你自己定義rule.xml中配置的一致,不是固定的),設定分片策略。

建立資料庫

-- 建立資料庫
create database local1;
-- 使用local1資料庫
use local1;
-- 建立使用者表
create table
user (dbname varchar(32),username varchar(32),province varchar(16),age int(3));
create database local2; use local2; create table user (dbname varchar(32),username varchar(32),province varchar(16),age int(3)); create database local3; use local3; create table user (dbname varchar(32),username varchar
(32),province varchar(16),age int(3));

檢視建立好的表結構
這裡寫圖片描述

配置mycat

1、配置schema.xml

vim ./conf/schema.xml

#新增表
#通過這種$的方法,解決了有很多資料庫的情況
#jdbc_node$1-3 ,表示的是jdbc_node、jdbc_node、jdbc_node3
<table name="user" dataNode="jdbc_node$1-3" rule="sharding-by-intfile-local"/>

完整配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="yellowcong" checkSQLschema="true" sqlMaxLimit="100"> <table name="user" dataNode="jdbc_node$1-3" rule="sharding-by-intfile-local"/> </schema> <dataNode name="jdbc_node1" dataHost="localhost" database="local1" /> <dataNode name="jdbc_node2" dataHost="localhost" database="local2" /> <dataNode name="jdbc_node3" dataHost="localhost" database="local3" /> <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="host" url="127.0.0.1:3306" user="root" password="root"/> </dataHost> </mycat:schema>

2、配置server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <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

#新增rule ,
#設定通過province 這個欄位進行分片
<tableRule name="sharding-by-intfile-local">
             <rule>
                     <columns>province</columns>
                     <algorithm>hash-int-local</algorithm>
             </rule>
</tableRule>

#新增hash-int-local 的配置
#mapFile 匹配的檔案
#type 型別 ,1表示字串,0表示是int型別
#defaultNode 預設的節點 ,小於0表示不設定預設節點,大於等於0表示設定預設節點
<function name="hash-int-local"
    class="io.mycat.route.function.PartitionByFileMap">
           <property name="mapFile">partition-hash-int-local.txt</property>
           <property name="type">1</property>
           <property name="defaultNode">0</property>
 </function>

這裡寫圖片描述

新增partition-hash-int-local.txt

#新增這個自定義的分片
vim ./conf/partition-hash-int-local.txt

#新增配置
hubei=0
beijing=1
shanghai=2

這裡寫圖片描述

測試插入資料

#連線mycat 
mysql -h 127.0.0.1 -P 8066 -u root -proot

#使用yellowcong 資料庫
use yellowcong 

#插入資料
insert into user (dbname,username,province,age) values (database(),'yellowcong','hubei',12);

insert into user (dbname,username,province,age) values (database(),'yellowcong2','beijing',12);

insert into user (dbname,username,province,age) values (database(),'yellowcong3','shanghai',12);

#插入一條不屬於他們任何一個的分類的資料
insert into user (dbname,username,province,age) values (database(),'yellowcong3','haerbin',12);

我們在匹配的時候,設定了預設資料庫,如果都不滿足,就會直接插入預設的資料庫中,我們在rule.xml中配置了預設資料庫為 local1,所以那條haerbin的匹配不上,就跑到了預設節點裡面了。
這裡寫圖片描述

問題集合

io.mycat.config.util.ConfigException: java.lang.NullPointerException

這個問題的原因,多半就是節點不存在的情況。簡單來講,就是表的節點配置有問題
這裡寫圖片描述

檢查節點配置
這裡寫圖片描述