一、安裝MyCat 1.安裝準備環境 1.1 安裝JDK 因為MyCat是java開發的,所以需要java虛擬機環境,在Linux節點中安裝JDK是必須的。 1.2 放開相關埠 在主從節點上都放開對埠3306的訪問,或者直接關閉防火牆。 臨時關閉 service iptables stop se ...
一、安裝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
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 |
dml 許可權順序為:insert(新增),update(修改),select(查詢),delete(刪除),0000–> 1111,0 為禁止許可權,1 為開啟許可權
。
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 節點及相關屬性介紹
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
屬性 name
數據節點名稱, 是定義的邏輯名稱,對應具體的物理資料庫 database
屬性 dataHost
引用 dataHost 標簽的 name 值,代表使用的物理資料庫所在位置和配置信息.
屬性 database
在 dataHost 物理機中,具體的物理資料庫 database 名稱.
2.2.2.3 dataHost
屬性 name
定義邏輯上的數據主機名稱
屬性 maxCon/minCon
最大連接數, max connections
最小連接數, min connections
屬性 dbType
資料庫類型 : mysql 資料庫
屬性 dbDriver
資料庫驅動類型, native,使用 MyCat提供的本地驅動.
dataHost 子標簽 writeHost
寫數據的資料庫定義標簽. 實現讀寫分離操作.
屬性 host
資料庫命名
屬性 url
資料庫訪問路徑
屬性 user
資料庫訪問用戶名
屬性 password
訪問用戶密碼
writeHost 子標簽 readHost
屬性 host
資料庫命名
屬性 url
資料庫訪問路徑
屬性 user
資料庫訪問用戶名
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>