關於mycat的連接:
Mycat官網
Mycat下載連接
Mycat官方文檔,百度網盤官方文檔下載連接,提取碼:f9nq。
Mycat簡略文檔前端
能夠在開始以前,閱讀Mycat簡略文檔,對其有個大概瞭解。java
注:MyCAT 支持多種數據庫接入,分別有:mongodb、oracle、sqlserver 、hive 、db2 、 postgresql。node
在mycat中有如下三個比較重要的專業術語,這裏簡單寫一下:mysql
- Schema:邏輯庫,與MySQL中的databases(數據庫)對應,一個邏輯庫中定義了所包括的table。
- table:邏輯表,就是物理數據庫中存儲的某一張表,與傳統的數據庫不一樣,這裏的表格要聲明其所存儲的邏輯數據節點datanode,再次能夠指定表的分片規則。
- datanode:mycat的邏輯數據節點,是存放table的具體物理節點,也稱之爲分片節點,經過datasource來關聯到後端某個具體數據庫上。
- datasource:定義某個物理庫的訪問地址,用於捆綁到datanode上。
本博文實現功能以下:linux
上述環境相似於web羣集,前端nginx代理(這裏是mycat),後端兩個MySQL服務,slave服務器用來讀數據,master服務器用來寫數據。nginx
系統 | IP | 主機名 | 服務 |
---|---|---|---|
Centos 7.5 | 192.168.20.2 | mysql01 | MySQL 5.7.24 |
Centos 7.5 | 192.168.20.3 | mysql02 | MySQL 5.7.24 |
Centos 7.5 | 192.168.20.4 | mycat | Mycat |
mycat的安裝部署須要jdk1.7及以上版本,mysql建議是5.5及以上版本。git
自行部署兩臺MySQL的主從,能夠參考博文:MySQL高可用方案——雙主(注:只須要參考博文作出主從效果便可,並不須要雙主,也不須要keepalived來作高可用)。github
[root@mycat ~]# java -version #查看jdk版本是否合適 openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode) #若是上述指令返回錯誤,能夠執行下面的命令安裝jdk環境 [root@mycat ~]# yum -y install java
下載的mycat包,直接解壓便可使用。web
#下載並解壓 [root@mycat src]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz [root@mycat src]# tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/ #查看解壓後的目錄結構 [root@mycat src]# tree -L 1 /usr/local/mycat/ /usr/local/mycat/ ├── bin ├── catlet ├── conf ├── lib ├── logs └── version.txt
其中:sql
- bin:啓動目錄;
- lib:mycat自身的jar包或依賴的jar包的存放目錄;
- logs:mycat日誌的存放目錄,日誌存放在logs/log中,天天一個文件;
- conf:配置目錄,用於存放配置文件
- --server.xml:是Mycat服務器參數調整和用戶受權的配置文件。
- --schema.xml:是邏輯庫定義和表以及分片定義的配置文件。
- --rule.xml: 是分片規則的配置文件,分片規則的具體一些參數信息單獨存放爲文件,也在這個目錄下,配置文件修改須要重啓MyCAT。
- --log4j.xml: 日誌存放在logs/log中,天天一個文件,日誌的配置是在conf/log4j.xml中,根據本身的須要能夠調整輸出級別爲debug debug級別下,會輸出更多的信息,方便排查問題。
- --autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相關的id分片規則配置文件
下面的圖片描述了mycat最重要的3大配置文件:
#指定client鏈接mycat的用戶名及密碼,此處的帳號密碼與MySQL數據庫無關 [root@mycat mycat]# vim conf/server.xml #定位到80行左右,修改以下 <user name="mycat" defaultAccount="true"> #mycat爲用戶名 <property name="password">pwd@123</property> #此處爲密碼 <property name="schemas">teset_mycat</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>
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!--下面的schema必須和第一個文件中的schema name(邏輯庫名)一致。--> <schema name="teset_mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database="test" /> <!--這裏的database是指定要鏈接後端的哪一個數據庫,這裏鏈接的是test庫--> <!--下面是指定後端真實的MySQL主機,關於下面的balance值,有三個可選值,將在下面寫下來--> <dataHost name="host1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <!--指定後端哪臺主機用來寫數據--> <writeHost host="hostM1" url="192.168.20.2:3306" user="root" password="123.com"> <!-- can have multi read hosts --> <!--指定後端哪臺主機用來讀數據--> <readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" /> </writeHost> </dataHost> </mycat:schema>
注:上面提到的dataHost字段balance負載均衡類型,目前的取值有如下4 種:
- balance="0", 不開啓讀寫分離機制,全部讀操做都發送到當前可用的 writeHost 上(默認值)。
- balance="1",所有的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,而且 M1 與 M2 互爲主備),正常狀況下,M2,S1,S2 都參與 select 語句的負載均衡。
- balance="2",全部讀操做都隨機的在 writeHost、readhost 上分發。
- balance="3",全部讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,注意 balance=3 只在 1.4 及其之後版本有,1.3 沒有。
writeTyep字段有如下3中取值:
一、writeType="0", 全部寫操做發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個 writeHost,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties 。
二、writeType="1",全部寫操做都隨機的發送到配置的 writeHost,1.5 之後廢棄不推薦。switchType 屬性
- -1 表示不自動切換。
- 1 默認值,自動切換。
- 2 基於 MySQL 主從同步的狀態決定是否切換。
#複製一個mysql命令 [root@mycat mycat]# scp root@192.168.20.2:/usr/local/mysql/bin/mysql /usr/local/bin/ #對後端兩臺數據庫進行登陸測試 [root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.2 [root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.3 #確保執行上述指令登陸數據庫時,能夠登陸成功。 #若是沒有登陸成功,則要考慮數據庫的root用戶是否有遠程登陸的權限,或者防火牆的問題。
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> <!-- 1爲開啓實時統計、0爲關閉 --> <property name="useGlobleTableCheck">0</property> <!-- 1爲開啓全加班一致性檢測、0爲關閉 --> <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> <user name="mycat" > <property name="password">pwd@123</property> <property name="schemas">teset_mycat</property> </user> </mycat:server>
conf/schema.xml文件內容以下:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="teset_mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database="test" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.20.2:3306" user="root" password="123.com"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" /> </writeHost> </dataHost> </mycat:schema>
- ./mycat start 啓動
- ./mycat stop 中止
- ./mycat console 前臺運行
- ./mycat install 添加到系統自動啓動(暫未實現)
- ./mycat remove 取消隨系統自動啓動(暫未實現)
- ./mycat restart 重啓服務
- ./mycat pause 暫停
- ./mycat status 查看啓動狀態
#建立命令軟鏈接 [root@mycat mycat]# ln -sf /usr/local/mycat/bin/mycat /usr/local/bin/ #啓動mycat [root@mycat mycat]# mycat start #更建議使用mycat console前臺啓動,若是有錯誤,就會直接輸出到屏幕,方便排錯 #待調試正常後,再使用mycat start後臺啓動便可。 Starting Mycat-server... [root@mycat conf]# ss -lnp | grep 8066 #若是端口沒有在監聽,則表示啓動失敗,自行查看日誌排查吧。 tcp LISTEN 0 100 :::8066 :::* users:(("java",pid=62070,fd=78)) #使用server.xml文件中定義的用戶名及密碼進行登陸查看 [root@mycat conf]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066 mysql> show databases; #下面的teset_mycat庫對應的就是後端的test庫 +-------------+ | DATABASE | +-------------+ | teset_mycat | +-------------+ 1 row in set (0.00 sec) mysql> use teset_mycat #庫中全部的表數據和後端數據庫是對應的 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t1 | +----------------+ 1 row in set (0.00 sec) mysql> select * from t1; +------+------+ | id | name | +------+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +------+------+
至此,已經成功接入了mycat來鏈接後端數據庫,可是mycat的主要功能尚未展現,我將繼續更新後面的內容。其實更推薦去閱讀Mycat官方文檔。官方文檔也比較通俗易懂。