MyCat教程三:安裝及配置介紹

1、安裝MyCat

1.安裝準備環境

1.1 安裝JDK

  由於MyCat是java開發的,因此須要java虛擬機環境,在Linux節點中安裝JDK是必須的。
在這裏插入圖片描述java

1.2 放開相關端口

  在主從節點上都放開對端口3306的訪問,或者直接關閉防火牆node

# 臨時關閉
service iptables stop
service iptables start
# 永久關閉
chkconfig iptables on
chkconfig iptables off
# 查看防火牆狀態
service iptables status

  
  
  

 
複製代碼

1.3 root帳號

  MyCat是咱們的數據庫中間件,那麼MyCat必然要可以訪問對應的主從數據庫,因此在主從數據庫中咱們須要分別建立訪問的帳號。mysql

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;

  
  
  

 
複製代碼

2.安裝MyCat

2.1 下載安裝軟件

官網地址:www.mycat.io/程序員

在這裏插入圖片描述

2.2 上傳解壓安裝

  將下載的文件上傳到/usr/local目錄下,並解壓算法

在這裏插入圖片描述

2.3 目錄介紹

  解壓後的目錄結構以下:sql

在這裏插入圖片描述

目錄 描述
bin 目錄裏是啓動腳本
conf 目錄裏是配置文件
catlet 爲 MyCat 的一個擴展功能
lib 目錄裏是 MyCat 和它的依賴 jar
logs 目錄裏是 console.log 用來保存控制檯日誌,和 MyCat.log 用來保存 MyCat 的 log4j日誌

2、相關配置文件介紹

  MyCat的架構其實很好理解,MyCat是代理,MyCat後面就是物理數據庫。和Web服務器的 Nginx相似。對於使用者來講,訪問的都是 MyCat,不會接觸到後端的數據庫。數據庫

在這裏插入圖片描述

注意:MyCat的主要配置文件都在conf目錄下。咱們給你們來介紹下介個核心的配置文件express

配置文件 說明
server.xml MyCat 的配置文件,設置帳號、參數等
schema.xml MyCat 對應的物理數據庫和數據庫表的配置
rule.xml MyCat 分片(分庫分表)規則

2.1 server.xml

  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 中的用戶,用戶能夠訪問的邏輯庫,能夠訪問的邏輯表,服務的端口號等
說明:上面的默認的配置表示 建立的有兩個用戶rootuser帳號
  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><!-- 要分片的數據庫節點數量,必須指定,不然無法分片 -->
    		<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文件中,核心的標籤就兩個tableRulefunction,咱們分別來介紹下

    2.3.1 tableRule

      是用來聲明table的分片規則的,相關屬性及標籤的含義以下

    節點 描述
    name 屬性指定惟一的名字,用於標識不一樣的分片規則。內嵌的
    rule 標籤則指定對物理表中的哪一列進行拆分和使用什麼分片算法
    columns 指定要拆分的列名字
    algorithm 使用 function 標籤中的 name 屬性。鏈接表規則和具體分片算法。 table 標籤內使用。讓邏輯表使用這個規則進行分片

    2.3.2 function

      指定分片規則的算法的具體實現

    節點 描述
    name 指定算法的名字
    class 制定分片算法具體的類名字
    property 爲具體算法須要用到的一些屬性

    ok~MyCat的安裝及相關配置介紹就介紹到此,下篇咱們介紹經過MyCat來具體實現讀寫分離



    關注微信公衆號【程序員的夢想】,專一於Java,SpringBoot,SpringCloud,微服務,Docker以及先後端分離等全棧技術。

    在這裏插入圖片描述
    相關文章
    相關標籤/搜索