數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn)
Mycat 是一個開源的分布式數(shù)據(jù)庫系統(tǒng)笆豁,但是由于真正的數(shù)據(jù)庫需要存儲引擎言缤,而 Mycat 并沒有存 儲引擎璧坟,所以并不是完全意義的分布式數(shù)據(jù)庫系統(tǒng)本冲。 那么 Mycat 是什么?Mycat 是數(shù)據(jù)庫中間件撤缴,就是介于數(shù)據(jù)庫與應(yīng)用之間,進行數(shù)據(jù)處理與交互的中間服 務(wù)叽唱。
MyCAT 是使用 JAVA 語言進行編寫開發(fā)屈呕,使用前需要先安裝 JAVA 運行環(huán)境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必須在 JDK7 以上的版本上運行棺亭。
部署環(huán)境
-
下載 jdk
封封丷
shell> wget --no-cookies \
--no-check-certificate \
--header \
"Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u181-\
b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-\
x64.tar.gz
// --no-check-certificate 表示不校驗SSL證書虎眨,因為中間的兩個302會訪問https,會涉及到證書的問題镶摘,不校驗?zāi)芸煲稽c嗽桩,影響不大.
- 解壓文件
shell> tar -xf jdk-8u181-linux-x64.tar.gz -C /usr/local/
shell> ln -s /usr/local/jdk1.8.0_181/ /usr/local/java
- 配置環(huán)境變量
shell> vi /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
注意 CLASSPATH 中有個點 .
不要省略
- 使環(huán)境變量生效
// 立刻在當(dāng)前的 shell 會話中生效
shell> source /etc/profile
全部生效需要重啟機器
部署 MyCat
下載
根據(jù)瀏覽下下方的提示,下載對應(yīng)的版本
shell> wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
解壓
shell> tar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
shell> ls /usr/local/mycat/
bin catlet conf lib logs version.txt
認識MyCat 中的概念
邏輯架構(gòu)圖
DBA 或者運維人員對數(shù)據(jù)進行分片處理之后凄敢,從原有的一個庫碌冶,被切分為多個分片數(shù)據(jù)庫,所有的分片數(shù)據(jù)庫集 群構(gòu)成了整個完整的數(shù)據(jù)庫存儲涝缝。
如上圖所表示扑庞,數(shù)據(jù)被分到多個分片數(shù)據(jù)庫后,應(yīng)用如果需要讀取數(shù)據(jù)拒逮,就要需要處理多個數(shù)據(jù)源的數(shù)據(jù)罐氨。 如果沒有數(shù)據(jù)庫中間件,那么應(yīng)用將直接面對分片集群消恍,數(shù)據(jù)源切換岂昭、事務(wù)處理以现、數(shù)據(jù)聚合都需要應(yīng)用直接處 理狠怨,原本該是專注于業(yè)務(wù)的應(yīng)用,將會花大量的工作來處理分片后的問題邑遏,最重要的是每個應(yīng)用處理將是完全的 重復(fù)造輪子佣赖。 所以有了數(shù)據(jù)庫中間件,應(yīng)用只需要集中與業(yè)務(wù)處理记盒,大量的通用的數(shù)據(jù)聚合憎蛤,事務(wù),數(shù)據(jù)源切換都由中間 件來處理纪吮,中間件的性能與處理能力將直接決定應(yīng)用的讀寫性能俩檬,所以一款好的數(shù)據(jù)庫中間件至關(guān)重要。
邏輯庫(schema)
通常對實際應(yīng)用來說碾盟,并不需要知道中間件的存在棚辽,業(yè)務(wù)開發(fā)人員只需要知道 數(shù)據(jù)庫的概念,所以數(shù)據(jù)庫中間件可以被看做是一個或多個數(shù)據(jù)庫集群構(gòu)成的邏輯庫冰肴。
在云計算時代屈藐,數(shù)據(jù)庫中間件可以以多租戶的形式給一個或多個應(yīng)用提供服務(wù)榔组,每個應(yīng)用訪問的可能是一個 獨立或者是共享的物理庫,常見的如阿里云數(shù)據(jù)庫服務(wù)器 RDS联逻。
邏輯表(table)
既然有邏輯庫搓扯,那么就會有邏輯表,分布式數(shù)據(jù)庫中包归,對應(yīng)用來說锨推,讀寫數(shù)據(jù)的表就是邏輯表。邏輯表箫踩,可 以是數(shù)據(jù)切分后爱态,分布在一個或多個分片庫中,也可以不做數(shù)據(jù)切分境钟,不分片锦担,只有一個表構(gòu)成。
分片規(guī)則(rule)
數(shù)據(jù)切分慨削,一個大表被分成若干個分片表洞渔,就需要一定的規(guī)則,這樣按照某種業(yè)務(wù)規(guī)則把數(shù)據(jù)分到 某個分片的規(guī)則就是分片規(guī)則缚态,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要磁椒,將極大的避免后續(xù)數(shù)據(jù)處理的難度。
配置 MyCat
認識配置文件
MyCAT 目前主要通過配置文件的方式來定義邏輯庫和相關(guān)配置:
-
/usr/local/mycat/conf/server.xml
定義用戶以及系統(tǒng)相關(guān)變量玫芦,如端口等浆熔。其中用戶信息是前端應(yīng)用程序連接 mycat 的用戶信息。
-
/usr/local/mycat/conf/schema.xml
定義邏輯庫桥帆,表医增、分片節(jié)點等內(nèi)容。
-
/usr/local/mycat/conf/rule.xml
中定義分片規(guī)則老虫。
配置 server.xml
以下為代碼片段
下面的用戶和密碼是應(yīng)用程序連接到 MyCat 使用的叶骨,可以自定義配置
而其中的schemas
配置項所對應(yīng)的值是邏輯數(shù)據(jù)庫的名字,也可以自定義祈匙,但是這個名字需要和后面 schema.xml
文件中配置的一致忽刽。
shell> vim server.xml
<user name="mycatdb">
<property name="password">123456</property>
<property name="schemas">schema_shark_db</property>
<!-- 表級 DML 權(quán)限設(shè)置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<!--下面是另一個用戶,并且設(shè)置的訪問 TESTED 邏輯數(shù)據(jù)庫的權(quán)限是 只讀
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
-->
==上面的配置中夺欲,假如配置了用戶訪問的邏輯庫跪帝,那么必須在 schema.xml
文件中也配置這個邏輯庫,否則報錯些阅,啟動 mycat 失敗==
配置 schema.xml
以下是配置文件中的每個部分的配置塊兒
邏輯庫和分表設(shè)置
<schema name="schema_shark_db" // 邏輯庫名稱
checkSQLschema="false" // 不檢查
sqlMaxLimit="100" // 最大連接數(shù)
dataNode='dn1'> // 數(shù)據(jù)節(jié)點名稱
<!--這里定義的是分表的信息-->
</schema>
數(shù)據(jù)節(jié)點
<dataNode name="dn1" // 此數(shù)據(jù)節(jié)點的名稱
dataHost="localhost1" // 主機組
database="shark_db"> // 真實的數(shù)據(jù)庫名稱
</dataNode>
主機組
<dataHost name="localhost1"
maxCon="1000" minCon="10" // 連接
balance="0" // 負載均衡
writeType="0" // 寫模式配置
dbType="mysql" dbDriver="native" // 數(shù)據(jù)庫配置
switchType="1" slaveThreshold="100">
<!--這里可以配置關(guān)于這個主機組的成員信息伞剑,和針對這些主機的健康檢查語句-->
</dataHost>
健康檢查
<heartbeat>select user()</heartbeat>
讀寫配置
<writeHost host="hostM1" url="172.16.153.10:3306"
user="root" password="123">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="172.16.153.11:3306"
user="root" password="123" /></writeHost>
以下是組合為完整的配置文件,適用于一主一從的架構(gòu)
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="schema_shark_db"
checkSQLschema="false"
sqlMaxLimit="100"
dataNode='dn1'>
<!--這里定義的是分庫分表的信息-->
</schema>
<!--下面是配置讀寫分離的信息-->
<dataNode name="dn1"
dataHost="localhost1" database="shark_db">
</dataNode>
<dataHost name="localhost1"
maxCon="1000" minCon="10"
balance="0" writeType="0"
dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="172.16.153.10:3306"
user="root" password="123">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="172.16.153.11:3306"
user="root" password="123" />
</writeHost>
</dataHost>
</mycat:schema>
配置 log4j2.xml
<!--設(shè)置日志級別為 debug , 默認是 info-->
<asyncRoot level="debug" includeLocation="true">
啟動 mycat
shell> /usr/local/mycat/bin/mycat start
支持一下參數(shù)
start | restart |stop | status
在真實的 master 數(shù)據(jù)庫上給用戶授權(quán)
mysql> grant all on shark_db.* to root@'%' identified by '123';
mysql> flush privileges;
假如你通過遠程連接登錄到 mysql 后扑眉,給用戶進行授權(quán)操作纸泄,提示
mysql> grant all on *.* to root@'172.16.153.%' identified by '123';
ERROR 1045 (28000): Access denied for user ...略...
請檢查Grant_priv
的值是否是 N
mysql> select * from mysql.user where user='root' \G
... 略 ...
Host: mysql-master1
User: root
Grant_priv: N
... 略 ...
解決辦法
嘗試通過本地等錄到 mysql 后赖钞,再進行授權(quán)操作
shell> mysql -uroot -p'123' -hlocalhost
mysql> grant all on *.* to root@'172.16.153.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
測試
在 mycat 的機器上測試用戶權(quán)限有效性
測試是否能正常登錄上 主服務(wù)器
shell> mysql -uroot -p'123' -h172.16.153.10
繼續(xù)測試是否能登錄上從服務(wù)器
shell> mysql -uroot -p'123' -h172.16.153.11
通過客戶端進行測試是否能登錄到 mycat 上
172.16.153.162 是 mycat 的主機地址
注意端口號是 8066
shell> mysql -umycatdb -p123456 -P8066 -h172.16.153.162
mysql> show databases;
+-----------------+
| DATABASE |
+-----------------+
| schema_shark_db |
+-----------------+
1 row in set (0.00 sec)
繼續(xù)測試讀寫分離策略
使用 mysql
客戶端工具使用 mycat
的賬戶和密碼登錄 mycat
,
之后執(zhí)行 select
語句。
之后查詢 mycat
主機上 mycat
安裝目錄下的 logs/mycat.log
日志聘裁。
在日志重搜索查詢的語句或者查詢 從庫的 ip 地址雪营,應(yīng)該能搜索到。
完