本文我們來介紹下MyCat的安裝和相關的配置檔案的介紹
一、安裝MyCat
1.安裝準備環境
1.1 安裝JDK
因為mycat是java開發的,是以需要java虛拟機環境,在Linux節點中安裝JDK是必須的。
1.2 放開相關端口
在主從節點上都放開對端口3306的通路,或者直接關閉防火牆。
# 臨時關閉
service iptables stop
service iptables start
# 永久關閉
chkconfig iptables on
chkconfig iptables off
# 檢視防火牆狀态
service iptables status
1.3 root賬号
mycat是我們的資料庫中間件,那麼mycat必然要能夠通路對應的主從資料庫,是以在主從資料庫中我們需要分别建立通路的賬号。
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
2.安裝mycat
2.1 下載下傳安裝軟體
官網位址:
http://www.mycat.io/2.2 上傳解壓安裝
将下載下傳的檔案上傳到/usr/local目錄下,并解壓
2.3 目錄介紹
解壓後的目錄結構如下:
目錄 | 描述 |
bin | 目錄裡是啟動腳本 |
conf | 目錄裡是配置檔案 |
catlet | 為 Mycat 的一個擴充功能 |
lib | 目錄裡是 Mycat 和它的依賴 jar |
logs | 目錄裡是 console.log 用來儲存控制台日志,和 mycat.log 用來儲存 mycat 的 log4j日志 |
二、相關配置檔案介紹
Mycat的架構其實很好了解,Mycat是代理,Mycat後面就是實體資料庫。和Web伺服器的 Nginx類似。對于使用者來說,通路的都是 Mycat,不會接觸到後端的資料庫。
注意:MyCat的主要配置檔案都在conf目錄下。我們給大家來介紹下介個核心的配置檔案
配置檔案 | 說明 |
server.xml | MyCat 的配置檔案,設定賬号、參數等 |
schema.xml | MyCat 對應的實體資料庫和資料庫表的配置 |
rule.xml | MyCat 分片(分庫分表)規則 |
2.1 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>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火牆設定 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表級 DML 權限設定 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
system标簽中設定的是系統級别的相關參數,參考源檔案中的注釋即可能看懂,初始預設即可
user标簽是我們要注意的地方。 Mycat 中的使用者,使用者可以通路的邏輯庫,可以通路的邏輯表,服務的端口号等
說明:上面的預設的配置表示 建立的有兩個使用者root和user賬号
root 賬号,密碼是123456,對應的邏輯庫是 TESTDB
user 賬号,密碼是user,對應的邏輯庫是 TESTDB,權限是隻讀
注釋掉的privileges 表示root使用者的操作權限
參數 | 事例 | |
dml | insert,update,select,delete | 0000 |
2.2 schema.xml
schema.xml 是最主要的配置檔案,首先看預設的配置檔案
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
<childTable name="order_items" joinKey="order_id" parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
</table>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
</dataHost>
</mycat:schema>
2.2.1 主要節點介紹
在配置檔案中可以定義讀寫分離,邏輯庫,邏輯表,dataHost,dataNode 等資訊.
節點 | |
schema | 配置邏輯庫,name 與 server.xml 中 schema 對應 |
dataNode | 定義資料節點的标簽,也就是分庫相關配置 |
dataHost | 實體資料庫,真正存儲資料的資料庫 |
2.2.2.1 schema
屬性name
邏輯庫名稱
屬性checkSQLschema
是否檢測 SQL 文法中的 schema 資訊. 如: Mycat 邏輯庫名稱 A, dataNode 名稱 B
SQL : select * from A.table;
checkSQLschema 值是 true, Mycat 發送到資料庫的 SQL 是 select * from table;
checkSQLschema 隻是 false,Mycat 發送的資料庫的 SQL 是 select * from A.table;
屬性sqlMaxLimit
Mycat 在執行 SQL 的時候,如果 SQL 語句中沒有 limit 子句.自動增加 limit 子句. 避免一次
性得到過多的資料,影響效率. limit子句的限制數量預設配置為100.如果 SQL中有具體的 limit
子句,目前屬性失效.
SQL : select * from table . mycat 解析後: select * from table limit 100
SQL : select * from table limit 10 . mycat 不做任何操作修改.
标簽 table
定義邏輯表的标簽
屬性 name
邏輯表名
屬性 dataNode
資料節點名稱. 即實體資料庫中的 database 名稱.多個名稱使用逗号分隔.
屬性 rule
分片規則名稱.具體的規則名稱參考 rule.xml 配置檔案.
2.2.2.2 dataNode
資料節點名稱, 是定義的邏輯名稱,對應具體的實體資料庫 database
屬性 dataHost
引用 dataHost 标簽的 name 值,代表使用的實體資料庫所在位置和配置資訊.
屬性 database
在 dataHost 實體機中,具體的實體資料庫 database 名稱.
2.2.2.3 dataHost
定義邏輯上的資料主機名稱
屬性 maxCon/minCon
最大連接配接數, max connections
最小連接配接數, min connections
屬性 dbType
資料庫類型 : mysql 資料庫
屬性 dbDriver
資料庫驅動類型, native,使用 mycat 提供的本地驅動.
dataHost 子标簽 writeHost
寫資料的資料庫定義标簽. 實作讀寫分離操作.
屬性 host
資料庫命名
屬性 url
資料庫通路路徑
屬性 user
資料庫通路使用者名
屬性 password
通路使用者密碼
writeHost 子标簽 readHost
資料庫命名
資料庫通路路徑
資料庫通路使用者名
2.3 rule.xml
用于定義分片規則的配置檔案。mycat 預設的分片規則: 以 500 萬為機關,實作分片規則.邏輯庫 A 對應 dataNode - db1 和 db2. 1-500 萬儲存在 db1 中, 500 萬零 1 到 1000 萬儲存在 db2 中,1000 萬零 1 到 1500 萬儲存在 db1 中.依次類推.
<?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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="rule2">
<rule>
<columns>user_id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
<tableRule name="crc32slot">
<rule>
<columns>id</columns>
<algorithm>crc32slot</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-month">
<rule>
<columns>create_time</columns>
<algorithm>partbymonth</algorithm>
</rule>
</tableRule>
<tableRule name="latest-month-calldate">
<rule>
<columns>calldate</columns>
<algorithm>latestMonth</algorithm>
</rule>
</tableRule>
<tableRule name="auto-sharding-rang-mod">
<rule>
<columns>id</columns>
<algorithm>rang-mod</algorithm>
</rule>
</tableRule>
<tableRule name="jch">
<rule>
<columns>id</columns>
<algorithm>jump-consistent-hash</algorithm>
</rule>
</tableRule>
<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 預設是0 -->
<property name="count">2</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一個實際的資料庫節點被映射為這麼多虛拟節點,預設是160倍,也就是虛拟節點數是實體節點數的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點預設是1。以properties檔案的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于測試時觀察各實體節點與虛拟節點的分布情況,如果指定了這個屬性,會把虛拟節點的murmur hash值與實體節點的映射按行輸出到這個檔案,沒有預設值,如果不指定,就不會輸出任何東西 -->
</function>
<function name="crc32slot"
class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">2</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片 -->
</function>
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
<function name="latestMonth"
class="io.mycat.route.function.LatestMonthPartion">
<property name="splitOneDay">24</property>
</function>
<function name="partbymonth"
class="io.mycat.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2015-01-01</property>
</function>
<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
<property name="mapFile">partition-range-mod.txt</property>
</function>
<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
<property name="totalBuckets">3</property>
</function>
</mycat:rule>
簡化版
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
</mycat:rule>
由上我們可以發現在rule.xml檔案中,核心的标簽就兩個tableRule 和function,我們分别來介紹下
2.3.1 tableRule
是用來聲明table的分片規則的,相關屬性及标簽的含義如下
algorithm 使用 function 标簽中的 name 屬性。連接配接表規則和具體分片算法。 table 标簽内使用。讓邏輯表使用這個規則進行分片
2.3.2 function
指定分片規則的算法的具體實作
name | 指定算法的名字 |
class | 制定分片算法具體的類名字 |
property | 為具體算法需要用到的一些屬性 |