數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn)
Mycat 是一個開源的分布式數(shù)據(jù)庫系統(tǒng)疫稿,但是由于真正的數(shù)據(jù)庫需要存儲引擎燎悍,而 Mycat 并沒有存 儲引擎,所以并不是完全意義的分布式數(shù)據(jù)庫系統(tǒng)蔫浆。 那么 Mycat 是什么梗肝?Mycat 是數(shù)據(jù)庫中間件,就是介于數(shù)據(jù)庫與應用之間航背,進行數(shù)據(jù)處理與交互的中間服 務喉悴。
MyCAT 是使用 JAVA 語言進行編寫開發(fā),使用前需要先安裝 JAVA 運行環(huán)境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性沃粗,所以要求必須在 JDK7 以上的版本上運行粥惧。
部署環(huán)境
-
下載 jdk
image
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最盅,會涉及到證書的問題突雪,不校驗能快一點,影響不大.
- 解壓文件
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)境變量生效
// 立刻在當前的 shell 會話中生效
shell> source /etc/profile
全部生效需要重啟機器
部署 MyCat
下載
根據(jù)瀏覽下下方的提示涡贱,下載對應的版本
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ù)庫后激挪,應用如果需要讀取數(shù)據(jù)辰狡,就要需要處理多個數(shù)據(jù)源的數(shù)據(jù)。 如果沒有數(shù)據(jù)庫中間件垄分,那么應用將直接面對分片集群宛篇,數(shù)據(jù)源切換、事務處理薄湿、數(shù)據(jù)聚合都需要應用直接處 理叫倍,原本該是專注于業(yè)務的應用,將會花大量的工作來處理分片后的問題豺瘤,最重要的是每個應用處理將是完全的 重復造輪子吆倦。 所以有了數(shù)據(jù)庫中間件,應用只需要集中與業(yè)務處理坐求,大量的通用的數(shù)據(jù)聚合蚕泽,事務,數(shù)據(jù)源切換都由中間 件來處理桥嗤,中間件的性能與處理能力將直接決定應用的讀寫性能赛糟,所以一款好的數(shù)據(jù)庫中間件至關(guān)重要派任。
邏輯庫(schema)
通常對實際應用來說,并不需要知道中間件的存在璧南,業(yè)務開發(fā)人員只需要知道 數(shù)據(jù)庫的概念,所以數(shù)據(jù)庫中間件可以被看做是一個或多個數(shù)據(jù)庫集群構(gòu)成的邏輯庫师逸。
在云計算時代司倚,數(shù)據(jù)庫中間件可以以多租戶的形式給一個或多個應用提供服務,每個應用訪問的可能是一個 獨立或者是共享的物理庫篓像,常見的如阿里云數(shù)據(jù)庫服務器 RDS动知。
邏輯表(table)
既然有邏輯庫,那么就會有邏輯表员辩,分布式數(shù)據(jù)庫中盒粮,對應用來說,讀寫數(shù)據(jù)的表就是邏輯表奠滑。邏輯表丹皱,可 以是數(shù)據(jù)切分后,分布在一個或多個分片庫中宋税,也可以不做數(shù)據(jù)切分摊崭,不分片,只有一個表構(gòu)成杰赛。
分片規(guī)則(rule)
數(shù)據(jù)切分呢簸,一個大表被分成若干個分片表,就需要一定的規(guī)則乏屯,這樣按照某種業(yè)務規(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)變量蛤迎,如端口等。其中用戶信息是前端應用程序連接 mycat 的用戶信息伞芹。
-
/usr/local/mycat/conf/schema.xml
定義邏輯庫忘苛,表、分片節(jié)點等內(nèi)容唱较。
-
/usr/local/mycat/conf/rule.xml
中定義分片規(guī)則扎唾。
配置 server.xml
以下為代碼片段
下面的用戶和密碼是應用程序連接到 MyCat 使用的,可以自定義配置
而其中的schemas
配置項所對應的值是邏輯數(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)限設置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<!--下面是另一個用戶汉形,并且設置的訪問 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
以下是配置文件中的每個部分的配置塊兒
邏輯庫和分表設置
<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
<!--設置日志級別為 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)限有效性
測試是否能正常登錄上 主服務器
shell> mysql -uroot -p'123' -h172.16.153.10
繼續(xù)測試是否能登錄上從服務器
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 地址,應該能搜索到