天天看點

使用MyCat分庫實戰詳解1. 環境準備3. 配置真實伺服器資訊4. 配置路由規則5. 配置MyCat服務資訊6. 啟動測試7. 資料插入與查詢測試

1. 環境準備

JDK 1.8,官網下載下傳安裝即可。

MySQL 5.7,官網下載下傳安裝即可。

MyCat1.6.5,下載下傳位址

http://dl.mycat.io/1.6.5/

,此處我們選擇windows版本下載下傳即可。

使用MyCat分庫實戰詳解1. 環境準備3. 配置真實伺服器資訊4. 配置路由規則5. 配置MyCat服務資訊6. 啟動測試7. 資料插入與查詢測試

下載下傳解壓後,直接輕按兩下bin/startup_nowrap.bat即可啟動MyCat

使用MyCat分庫實戰詳解1. 環境準備3. 配置真實伺服器資訊4. 配置路由規則5. 配置MyCat服務資訊6. 啟動測試7. 資料插入與查詢測試

2. 資料庫準備

我們來模拟一個部落格系統的資料庫,規劃設計三個庫db001、db002、db003,我們先将三個庫都放到本地資料庫執行個體中,後續如果是部署到雲端的話,更改伺服器位址資訊即可。

然後我們有兩個表使用者表user和部落格表blog,使用者表存儲于db001,部落格表存儲于db001/db002/db003。

是以在db001執行如下語句建立user表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增序号',
  `name` varchar(255) DEFAULT '' COMMENT '姓名',
  `password` varchar(255) DEFAULT '' COMMENT '密碼',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      

然後再db001/db002/db003執行如下語句建立blog表

CREATE TABLE `blog` (
  `id` int(11) NOT NULL COMMENT '序号',
  `title` varchar(255) DEFAULT '' COMMENT '部落格标題',
  `content` varchar(255) DEFAULT '' COMMENT '部落格内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      

資料庫建立完成後結構如下:

使用MyCat分庫實戰詳解1. 環境準備3. 配置真實伺服器資訊4. 配置路由規則5. 配置MyCat服務資訊6. 啟動測試7. 資料插入與查詢測試

3. 配置真實伺服器資訊

通過修改

conf/schema.xml

,來配置真實伺服器的資訊,并為資料庫劃分節點,指定資料表所在的節點。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
  <!-- 注意TESTDB是MyCat設定的抽象資料庫名,對應我們配置的多個真實資料庫 -->
  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <!-- user表對應dn1節點 -->
    <table name="user" dataNode="dn1" />
    <!-- blog表對應dn1/dn2/dn3節點,rule-blog表示對blog表的路由規則名稱 -->
    <table name="blog" dataNode="dn1,dn2,dn3" rule="rule-blog" />
  </schema>

  <!-- 為執行個體下面的各個庫設定節點 -->
  <dataNode name="dn1" dataHost="localhost1" database="db001" />
  <dataNode name="dn2" dataHost="localhost1" database="db002" />
  <dataNode name="dn3" dataHost="localhost1" database="db003" />

  <!-- 配置真實資料庫執行個體資訊 -->
  <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- 配置資料庫url、使用者名、密碼 -->
    <writeHost host="server1" url="localhost:3316" user="root" password="Easy@0122" />
  </dataHost>
</mycat:schema>
      

4. 配置路由規則

在schema.xml中我們已經制定了blog表存儲的節點,且設定了路由規則的名稱

rule-blog

,然後我們設定該規則具體的政策。

修改

conf/role.xml

,配置規則如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
  <!-- 指定要設定的規則 -->
  <tableRule name="rule-blog">
    <rule>
      <!-- 規則生效的列 -->
      <columns>id</columns>
      <!-- 對應的路由算法 -->
      <algorithm>rule-blog-algorithm</algorithm>
    </rule>
  </tableRule>

  <!-- 配置算法具體實作方式 -->
  <function name="rule-blog-algorithm" class="io.mycat.route.function.PartitionByMod">
    <property name="count">3</property>    <!-- 表示對id進行除3取模分表 -->
  </function>

</mycat:rule>

      

5. 配置MyCat服務資訊

通過上面兩個配置檔案,我們已指定了庫、表、分表路由規則,下面我們将其通過MyCat暴露出來,讓用戶端進行通路。

conf/server.xml

配置MyCat對外服務資訊,主要就是使用者名、密碼、以及上面指定的抽象資料庫名稱TESTDB

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
  <!-- system部分采用預設即可 -->
  <system>
    <property name="nonePasswordLogin">0</property>    <!-- 0為需要密碼登陸、1為不需要密碼登陸 ,預設為0,設定為1則需要指定預設賬戶-->
    <property name="useHandshakeV10">1</property>
    <property name="useSqlStat">0</property>    <!-- 1為開啟實時統計、0為關閉 -->
    <property name="useGlobleTableCheck">0</property>    <!-- 1為開啟全加班一緻性檢測、0為關閉 -->
    <property name="sequnceHandlerType">2</property>
    <property name="subqueryRelationshipCheck">false</property>    <!-- 子查詢中存在關聯查詢的情況下,檢查關聯字段中是否有分片字段 .預設 false -->
    <!--預設為type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
    <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">64k</property>
    <!--機關為k-->
    <property name="spillsFileBufferSize">1k</property>
    <property name="useStreamOutput">0</property>
    <!--機關為m-->
    <property name="systemReserveMemorySize">384m</property>
    <!--是否采用zookeeper協調切換  -->
    <property name="useZKSwitch">false</property>
  </system>
  <!-- 設定通路的使用者名密碼 -->
  <user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <!-- 注意此處是之前設定的抽象資料庫名稱 -->
    <property name="schemas">TESTDB</property>
  </user>
</mycat:server>

      

6. 啟動測試

輕按兩下bin/startup_nowrap.bat啟動MyCat,如圖啟動成功:

使用MyCat分庫實戰詳解1. 環境準備3. 配置真實伺服器資訊4. 配置路由規則5. 配置MyCat服務資訊6. 啟動測試7. 資料插入與查詢測試

我們使用navicat(其他工具也可以),通過上面配置的MyCat使用者名密碼連接配接MyCat,如下圖:

使用MyCat分庫實戰詳解1. 環境準備3. 配置真實伺服器資訊4. 配置路由規則5. 配置MyCat服務資訊6. 啟動測試7. 資料插入與查詢測試

連接配接成功後,會發現一個資料庫TESTDB,及兩張表user/blog,TESTDB即為MyCat抽象出來的資料庫,操作TESTDB中的資料會按照當時設定的規則,實際操作會發生在db001/db002/db003中,這個我們不必關心,MyCat會自動為我們實作。

使用MyCat分庫實戰詳解1. 環境準備3. 配置真實伺服器資訊4. 配置路由規則5. 配置MyCat服務資訊6. 啟動測試7. 資料插入與查詢測試

7. 資料插入與查詢測試

我們在TESTDB執行6次insert語句。

insert into blog(id,title,content)values(1,"title1","content1")
insert into blog(id,title,content)values(2,"title2","content2")
insert into blog(id,title,content)values(3,"title3","content3")
insert into blog(id,title,content)values(4,"title4","content4")
insert into blog(id,title,content)values(5,"title5","content5")
insert into blog(id,title,content)values(6,"title6","content6")
      

在TESTDB查詢有6條資料,說明插入成功。

而db001有id為3/6的資料。

db002有id為1/4的資料。

db003有id為2/5的資料。

說明MyCat自動為我們取模了。