目錄
What is Mycat?
1.概念?
Mycat 是數據庫中間件,就是介於數據庫與應用之間,進行數據處理與交互的中間服務。
2. 同類產品?
mycat、TDDL、Sharding-JDBC、cobar
3. 解決了什麼問題?
超大容量問題
性能問題
多租戶問題:多租戶技術也叫多重租憑技術,就是在確保用戶間數據隔離的前提下實現在多用戶環境中共用相同系統或程序等軟硬件資源的一種軟件架構技術。
4.如何解決的? 拆分
5. 拆分策略
等
6.拆分帶來的問題及如何解決
How to use Mycat?
mycat中的核心概念及配置文件分析
1.schema.xml
涵蓋了MyCat的邏輯庫、表、分片規則、分片節點及數據源。
邏輯表(邏輯數據庫中的表)
配置文件標籤的含義
2. rule.xml
定義的各種分片規則
3.server.xml
server.xml 包含mycat的系統配置信息,它有兩個標籤,分別是user和system,掌握system標籤的各項配置屬性是mycat調優的關鍵。
Demo
我們現在做一個主從、讀寫分離,簡單分表的示例。
服務器 | IP | 說明 |
---|---|---|
Mycat | 192.168.0.2 | mycat服務器,連接數據庫時,連接此服務器 |
database1 | 192.168.0.3 | 物理數據庫1,真正存儲數據的數據庫 |
database2 | 192.168.0.4 | 物理數據庫2,真正存儲數據的數據庫 |
Mycat作爲主數據庫中間件,肯定是與代碼弱關聯的,所以代碼是不用修改的,使用Mycat後,連接數據庫是不變的,默認端口是8066。連接方式和普通數據庫一樣,如:jdbc:mysql://192.168.0.2:8066/
server.xml示例
<user name="test">
<property name="password">test</property>
<property name="schemas">lunch</property>
<property name="readOnly">false</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 | 登錄的用戶名,也就是連接Mycat的用戶名 |
--password | 登錄的密碼,也就是連接Mycat的密碼 |
--schemas | 數據庫名,這裏會和schema.xml中的配置關聯,多個用逗號分開,例如需要這個用戶需要管理兩個數據庫db1,db2,則配置db1,dbs |
--privileges | 配置用戶針對表的增刪改查的權限,具體見文檔吧 |
我這裏配置了一個賬號test 密碼也是test,針對數據庫lunch,讀寫權限都有,沒有針對表做任何特殊的權限。
schema.xml:schema.xml是最主要的配置項,首先看我的配置文件。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 數據庫配置,與server.xml中的數據庫對應 -->
<schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
<table name="lunchmenu" dataNode="dn1" />
<table name="restaurant" dataNode="dn1" />
<table name="userlunch" dataNode="dn1" />
<table name="users" dataNode="dn1" />
<table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long" />
</schema>
<!-- 分片配置 -->
<dataNode name="dn1" dataHost="test1" database="lunch" />
<dataNode name="dn2" dataHost="test2" database="lunch" />
<!-- 物理數據庫配置 -->
<dataHost name="test1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">
</writeHost>
</dataHost>
<dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
參數 | 說明 |
---|---|
schema | 數據庫設置,此數據庫爲邏輯數據庫,name與server.xml中schema對應 |
dataNode | 分片信息,也就是分庫相關配置 |
dataHost | 物理數據庫,真正存儲數據的數據庫 |
每個節點的屬性逐一說明:
schema:
屬性 | 說明 |
---|---|
name | 邏輯數據庫名,與server.xml中的schema對應 |
checkSQLschema | 數據庫前綴相關設置,建議看文檔,這裏暫時設爲false |
sqlMaxLimit | select 時默認的limit,避免查詢全表 |
table:
屬性 | 說明 |
---|---|
name | 表名,物理數據庫中表名 |
dataNode | 表存儲到哪些節點,多個節點用逗號分隔。節點爲下文dataNode設置的name |
primaryKey | 主鍵字段名,自動生成主鍵時需要設置 |
autoIncrement | 是否自增 |
rule | 分片規則名,具體規則下文rule詳細介紹 |
dataNode
屬性 | 說明 |
---|---|
name | 節點名,與table中dataNode對應 |
datahost | 物理數據庫名,與datahost中name對應 |
database | 物理數據庫中數據庫名 |
dataHost
屬性 | 說明 |
---|---|
name | 物理數據庫名,與dataNode中dataHost對應 |
balance | 均衡負載的方式 |
writeType | 寫入方式 |
dbType | 數據庫類型 |
heartbeat | 心跳檢測語句,注意語句結尾的分號要加。 |
小結
小編建議,理論不能脫離實踐,要去切身的體驗不斷地提高才可!