Mycat資料庫中介軟體
Mycat介紹
中介軟體:代理;
面向企業的開源的資料庫叢集,效能極高;淘寶正在使用;
京東,美團;
資料庫中介軟體歷史:
amoeba:變形蟲
分散式高可用結構不穩定
cobar:Mycat前身
資料庫中介軟體原理
cober容易出現後端的物理伺服器假死現象;
Mycat特點
1、高效能的讀寫分離
2、100億級別的大表水平分片,叢集平行計算
3、整合多種資料來源的輸入和輸出
Mycat核心概念
1、Mycat核心元件的概念
邏輯庫(對應資料庫):Mycat中間提供客戶端傳入sql,攔截sql根據配置解析
翻譯要到物理庫執行的真正sql語句;
客戶端在連線Mycat後可以操作資料庫語句,表格語句等等;
客戶端在連線Mycat看到的資料庫叫做邏輯庫
(並不是真正的資料庫,資料可以來源一個物理庫,也可以來源於多個物理庫)
邏輯庫在Mycat中需要使用<schema>標籤完成配置,在schema.xml檔案中配置
邏輯表:邏輯庫資料的細分分配
分片表:
表格的整體資料量過大時,mycat將會使用多個物理庫中的真實表格對應做邏輯分片表
的資料分片儲存,這種表格在mycat叫做分片表
非分片表
資料儲存時,整體資料量不夠海量時,可以使用非分片表儲存,相對來說
非分片表比分片表配置簡單;
全域性表
企業中一些工具表格,字典表,它們的共同特點是:資料變動穩定,資料量不大,這種表格
需要和業務表做非常多的關聯查詢,為了底層資料查詢時不做過多的跨庫操作,global全域性
表示為每個物理庫中都複製一份
工具表、字典表:
業務中很多邏輯,都不是用字元表示的
通訊成功:200狀態碼
通訊異常:500
通訊成功:400
數字代表特殊含義的情況,可以記錄在資料庫中某個工具表或字典表中;
ER表
mycat獨有
分片表的一種特殊情況,多個分片表有關係的時候,經常做關聯查詢,如果多個分片表格
中相關的資料,但是切分到的儲存物理庫不同,會導致關聯查詢/相關資料查詢時造成底層的非常大量的
跨庫操作;
以訂單和訂單商品為例,一旦分片表格設定完成,很有可能2個表格相關的資料被切分到了不同的物理庫,
相關資料查詢時,mycat底層誇庫操作非常多,造成查詢的效率非常低下;
mycat就全球第一次提出ER表的概念;
ER表根據相關內容的設定主表(t_order)使用table標籤配置,從表不能使用純粹的分片表格設定
需要在table下指定(childtable),根據主表的切分邏輯完成從表的切分;
Mycat中的配置檔案
配置檔案
根目錄的conf中有兩個核心的配置檔案,配置內容實現:
讀寫分離、高可用替換、分散式儲存、ER分片表邏輯。
server.xml
包括2個重要標籤
system:配置mycat啟動時佔用的系統的一些資源屬性(註釋掉的不需要動,保持預設)
user:指定當前登陸的使用者資訊;
屬性:
name表示登入當前的mycat的使用者名稱
password表示登入密碼
schemas表示當前這個使用者可以檢視的邏輯庫,以“,”分隔
這裡的名稱必須和schema.xml中的schema標籤名稱對應
readOnly表示當前使用者只讀,不能操作寫
quarantine標籤:安全措施可以設定白名單黑名單
whitehost:白名單列表
blacklist:黑名單列表
schema.xml:當前mycat代理的資料庫叢集的設定
邏輯庫,分片/非分片表,ER表,讀寫分離,高克用替換
標籤結構
schema:邏輯庫
table:邏輯表
childtable:邏輯表的從邏輯表
dataNode:資料分片節點的配置,一個數據分片node對應的資料庫結構可能很簡單
也可能很複雜,指向一個dataHost
dataHost:
heartbeat:心跳檢測,語句不一樣,替換邏輯可能不同
writeHost:寫操作的資料庫節點(也可以讀)
readHost:與當前writeHost相關的(主從)讀節點(只讀)
每個標籤的屬性
schema:name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"
name:邏輯庫名稱
checkSQLschema:例如sql語句“select * from tb_item”,mycat攔截,將其表格名稱根據當前屬性的設定進行修改,
false不會自動檢查邏輯庫名稱,不拼接邏輯庫名字“select * from tb_item”,
可能會導致無法找到邏輯庫執行後續邏輯,true自動檢測,
會拼接邏輯庫名字“select * from TESTDB.tb_item”
sqlMaxLimit:一種查詢的保護措施,執行查詢語句時,自動配置的分頁資料,只差前100條,在沒有limit時
table:<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" type="global"/>
name:邏輯表名稱,配置和真實資料庫的表名最好相同
dataNode:對應一個,多個數據庫節點的標籤,多個值表示分片,單個值表示非分片
rule:資料分片的計算規則,auto-sharding-long,利用long整型的id值進行範圍劃分
(0-500萬(index0),500萬-1000萬(index1),1000萬-1500萬(index2))
primaryKey:指向表格的主鍵,最好與真實欄位一致
type:表格型別,預設不是global
childtable:從表
<childTable name="orders" primaryKey="ID" joinKey="order_id"parentKey="id">
name:從表名稱,保持和資料庫真是表格一致
primaryKey:主鍵名稱
joinKey:從表中外來鍵欄位;必須和真實資料庫的從表外來鍵欄位名一致
parentKey:主表的欄位名,必須和主表與從表的外來鍵相關,對應主表的欄位名稱
dataNode標籤:資料節點
<dataNode name="dn1" dataHost="localhost1" database="db1" />
name:表示名稱,邏輯庫,邏輯表指向的依據
dataHost:指向真實管理資料庫的標籤名稱dataHost
database:真實資料庫名稱,邏輯庫和所有真實資料庫名稱一致
dataHost:管理資料分片的真實資料庫的標籤,內不包含真實資料庫資訊
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql"
dbDriver="native" switchType="1" slaveThreshold="100">
name:名稱,與datanode指向對應
maxCon:底層資料庫的連線最大數
minCon:底層資料庫的連線最小數
balance:值是0,1,2,3,分別表示對當前dataHost中維護的資料庫門的讀操作邏輯
0:不開啟讀寫分離,所有的讀寫操作都在最小的索引號的writeHost(第一個)
1:全部的readHost和備用的writeHost都參與讀資料的平衡,去過讀的請求過多,
負責寫的第一個writeHost也分擔一部分
2:所有的讀操作,都隨機的在所有的writeHost和readHost上進行
3:所有的讀操作,都到writeHost對應的readHost上進行(備用的writeHost不參加了)
在叢集中沒有配置readHost的情況下,讀都到第一個writeHost完成
writeType:控制當前dataHost維護的資料叢集的寫操作
0:所有的寫操作都在第一個writeHost標籤的資料庫進行
1:所有的寫操作,都隨機分配到所有的writeHost(mycat1.5完全不建議配置了)
dbtype:資料庫型別(不同資料庫配置不同名稱,mysql)
dbDriver:資料庫驅動,native,動態獲取
switchType:切換的邏輯
0:故障不切換;
1:故障切換,當前寫操作的writeHost故障,進行切換,切換到下一個writeHost
slaveThreshold:標籤中的<heartbeat>用來檢測後端資料庫的心跳sql語句;
本屬性檢查從節點與主節點的同步情況(延遲時間數)
配合心跳語句show slave status;
讀寫分離時,所有的readHost的資料都可靠。
Mycat的安裝
1 基於jdk執行(雲主機略)
2 獲取安裝包
/home/resources
#cp /home/resources/Mycat***.tar.gz ./
將檔案拷貝到software
3 解壓
#tar -xf Mycat***.tar.gz
4 測試執行
mycat的根目錄中bin儲存了mycat的核心執行命令檔案
mycat
#mycat console