由於MyCat是java開發的,因此須要java虛擬機環境,在Linux節點中安裝JDK
是必須的。
java
在主從節點上都放開對端口3306的訪問,或者直接關閉防火牆
。node
# 臨時關閉 service iptables stop service iptables start # 永久關閉 chkconfig iptables on chkconfig iptables off # 查看防火牆狀態 service iptables status 複製代碼
MyCat是咱們的數據庫中間件,那麼MyCat必然要可以訪問對應的主從
數據庫,因此在主從
數據庫中咱們須要分別建立訪問的帳號。mysql
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option; flush privileges; 複製代碼
官網地址:www.mycat.io/程序員
將下載的文件上傳到/usr/local
目錄下,並解壓算法
解壓後的目錄結構以下:sql
目錄 | 描述 |
---|---|
bin | 目錄裏是啓動腳本 |
conf | 目錄裏是配置文件 |
catlet | 爲 MyCat 的一個擴展功能 |
lib | 目錄裏是 MyCat 和它的依賴 jar |
logs | 目錄裏是 console.log 用來保存控制檯日誌,和 MyCat.log 用來保存 MyCat 的 log4j日誌 |
MyCat的架構其實很好理解,MyCat是代理
,MyCat後面就是物理數據庫。和Web服務器的 Nginx相似。對於使用者來講,訪問的都是 MyCat,不會接觸到後端的數據庫。數據庫
注意
:MyCat的主要配置文件都在conf
目錄下。咱們給你們來介紹下介個核心的配置文件express
配置文件 | 說明 |
---|---|
server.xml | MyCat 的配置文件,設置帳號、參數等 |
schema.xml | MyCat 對應的物理數據庫和數據庫表的配置 |
rule.xml | MyCat 分片(分庫分表)規則 |
server.xml
是用來配置帳號,參數及相關操做權限的文件,下面是給文件的簡要內容,去掉了相關的註釋apache
<?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 |
dml 權限順序爲:insert(新增),update(修改),select(查詢),delete(刪除),0000–> 1111,0 爲禁止權限,1 爲開啓權限
。
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> 複製代碼
在配置文件中能夠定義讀寫分離,邏輯庫,邏輯表,dataHost,dataNode 等信息.
節點 | 描述 |
---|---|
schema | 配置邏輯庫,name 與 server.xml 中 schema 對應 |
dataNode | 定義數據節點的標籤,也就是分庫相關配置 |
dataHost | 物理數據庫,真正存儲數據的數據庫 |
屬性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 配置文件.
複製代碼
屬性 name
數據節點名稱, 是定義的邏輯名稱,對應具體的物理數據庫 database
複製代碼
屬性 dataHost
引用 dataHost 標籤的 name 值,表明使用的物理數據庫所在位置和配置信息.
複製代碼
屬性 database
在 dataHost 物理機中,具體的物理數據庫 database 名稱.
複製代碼
屬性 name
定義邏輯上的數據主機名稱
複製代碼
屬性 maxCon/minCon
最大鏈接數, max connections
最小鏈接數, min connections
複製代碼
屬性 dbType
數據庫類型 : mysql 數據庫
複製代碼
屬性 dbDriver
dataHost 子標籤 writeHost
寫數據的數據庫定義標籤. 實現讀寫分離操做.
複製代碼
屬性 host
數據庫命名
複製代碼
屬性 url
數據庫訪問路徑
複製代碼
屬性 user
數據庫訪問用戶名
複製代碼
屬性 password
訪問用戶密碼
複製代碼
writeHost 子標籤 readHost
屬性 host
數據庫命名
複製代碼
屬性 url
數據庫訪問路徑
複製代碼
屬性 user
數據庫訪問用戶名
複製代碼
用於定義分片規則的配置文件。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
,咱們分別來介紹下
是用來聲明table的分片規則的,相關屬性及標籤的含義以下
節點 | 描述 |
---|---|
name | 屬性指定惟一的名字,用於標識不一樣的分片規則。內嵌的 |
rule | 標籤則指定對物理表中的哪一列進行拆分和使用什麼分片算法 |
columns | 指定要拆分的列名字 |
algorithm | 使用 function 標籤中的 name 屬性。鏈接表規則和具體分片算法。 table 標籤內使用。讓邏輯表使用這個規則進行分片 |
指定分片規則的算法的具體實現
節點 | 描述 |
---|---|
name | 指定算法的名字 |
class | 制定分片算法具體的類名字 |
property | 爲具體算法須要用到的一些屬性 |
ok~MyCat的安裝及相關配置介紹就介紹到此,下篇咱們介紹經過MyCat來具體實現讀寫分離