目錄
1.介紹?
概述
拆分策略
垂直拆分?
水平拆分?
實現技術?
MyCat:
2.Mycat概述
環境準備?
分片配置
schema.xml?
server.xml
啟動服務?
分片測試?
3.MyCat配置
schema.xml?
schema標簽
datanode標簽
?datahost標簽?
rule.xml
server.xml
4.垂直拆分(分庫)
場景
準備
配置
schema標簽
server標簽
測試
多表聯查?
解決?
5.水平拆分?
6.分片規則
6.1范圍分片?
6.2取模分片?
6.3一致性哈希
6.4枚舉
6.5應用指定算法
6.6固定分片hash算法
6.7字符串哈希解析
6.8 按日期(天)分片
6.9 按日期(月)分片
7.MyCat管理與監督
1.介紹
概述
隨著互聯網及移動互聯網的發展,應用系統的數據量也是成指數式增長,若采用單數據庫進行數據存儲,存在以下性能瓶頸:
- IO瓶頸:熱點數據太多,數據庫緩存不足,產生大量磁盤IO,效率較低。請求數據太多,帶寬不夠,網絡IO瓶頸。
- CPU瓶頸:排序、分組、連接查詢、聚合統計等SOL會耗費大量的CPU資源,請求數太多,CPU出現瓶頸。
分庫分表的中心思想都是將數據分散存儲,使得單一數據庫/表的數據量變小來緩解單一數據庫的性能問題,從而達到提升數據庫性能的目的
拆分策略
根據形式不同可以分為垂直拆分和水平拆分。
垂直相當于從中間切開,分庫是把一個庫中多個表拆成幾份存儲到不同數據庫中,所以這些數據庫中的庫結構不一樣。分表是把一個表中的各字段拆分到不同數據庫,各表結構也不同。
水平就是物理切割,只是把各庫中的部分數據存儲到不同數據庫,這些數據庫結構一樣。分表則把表中行部分存在不同數據庫,表結構也相同。
垂直拆分

水平拆分
實現技術
shardingJDBC:
基于AOP原理,在應用程序中對本地執行的SQL進行攔截,解析、改寫、路由處理。需要自行編碼配置實現,只支持java語言,性能較高。
MyCat:
數據庫分庫分表中間件,不用調整代碼即可實現分庫分表,支持多種語言,性能不及前者。
2.Mycat概述
Mycat是開源的、活躍的、基于java語言編寫的MySOL數據庫中間件。可以像使用mysql一樣來使用mycat,對于開發人員來說根本感覺不到mycat的存在。
環境準備
在節點主機中都新增db01的數據庫,后續只對Mycat進行配置。
分片配置
schema.xml
邏輯庫(Schema):邏輯庫是 MyCat 中的一個虛擬數據庫,它對應于 MySQL 中的
DATABASE
。邏輯庫定義了包含的邏輯表和分片規則。邏輯表(Table):邏輯表是 MyCat 中的一個虛擬表,它對應于物理數據庫中的實際表。邏輯表定義了數據如何分布到不同的數據節點
數據節點(DataNode):定義了數據存儲的具體位置。
數據主機(DataHost):定義了數據庫的連接信息和讀寫分離策略。
分片規則(Rule):定義了如何將數據分布到不同的數據節點。
server.xml
readyOnly:只讀權限,ture則表明該用戶只有讀權限。
啟動服務
-
-h
:指定 MySQL 服務器的主機名或 IP 地址。 -
-P
:指定 MySQL 服務器的端口號。 -
-u
:指定連接到 MySQL 服務器的用戶名。 -
-p
:指定連接到 MySQL 服務器的密碼。
Mycat的登錄格式與MySQL類似是由于,其通過以下方式實現與 MySQL 的兼容性:
SQL 解析
MyCat 內置了 SQL 解析器,能夠解析和理解 MySQL 的 SQL 語法。它會攔截和解析客戶端發送的 SQL 語句,然后根據配置的分片規則和路由策略,將 SQL 語句分發到相應的物理數據庫節點。
協議兼容
MyCat 實現了 MySQL 的網絡協議,使得客戶端可以像連接普通 MySQL 數據庫一樣連接 MyCat。這包括支持 MySQL 的二進制協議和文本協議。
?透明代理
MyCat 作為一個透明代理,對客戶端來說,它就像一個普通的 MySQL 數據庫。客戶端發送的 SQL 語句和數據請求都會被 MyCat 攔截和處理,然后轉發到后端的物理數據庫。返回的結果也會被 MyCat 處理后返回給客戶端。
查看已存在schema.xml文件中配置的邏輯庫與邏輯表。
分片測試
在MyCat中通過創建邏輯表該表結構會同步至節點數據庫中,而往其邏輯表插入的數據會根據分片規則散落至各節點數據庫。
3.MyCat配置
schema.xml
schema.xml作為MyCat中最重要的配置文件之一,涵蓋了MyCat的邏輯庫 、邏輯表 、分片規則、分片節點及數據源的配置。
主要包含以下三組標簽:
schema標簽
schema標簽用于定義 MyCat實例中的邏輯庫,一個MyCat實例中,可以有多個邏輯庫,可以通過 schema 標簽來劃分不同的邏輯庫。
MyCat中的邏輯庫的概念 ,等同于MySQL中的database概念,需要操作某個邏輯庫下的表時,也需要切換邏輯庫(use xxx)。
schema標簽<table>標簽定義了MyCat中邏輯庫schema下的邏輯表,所有需要拆分的表都需要在table標簽中定義。
datanode標簽


datahost標簽

rule.xml
rule.xml中定義所有拆分表的規則,在使用過程中可以靈活的使用分片算法,或者對同一個分片算法使用不同的參數,它讓分片過程可配置化。主要包含兩類標簽:tableRule、Function。
tableRule為分片規則,Function為具體配置
server.xml
server.xml配置文件包含了MyCat的系統配置信息,主要有兩個重要的標簽:system、user。
system為一些系統配置的信息。
user配置用戶的信息以及其可以訪問的權限
4.垂直拆分(分庫)
場景
主數據庫中包含4種分類的各表,決定拆分成3個表。
準備
配置
schema標簽
table必須包含所有需要拆分的邏輯表。
這里講邏輯表分為3部分,從上至下,商品相關表關聯分片節點dn1,訂單dn2,用戶dn3.
dataNode配置了分片節點關聯的節點主機。
server標簽
將用戶可訪問的數據庫名稱修改為創建的邏輯庫名稱。
由于是邏輯表還需要在MyCat中執行對應的創建表語句,才能在節點主機看到物理表結構。
測試
多表聯查
聯查表在同一節點主機中,查詢成功
聯查表在不同節點主機中,查詢失敗
解決
將地址信息分片到所有節點,并將type=global聲明為全局表。
5.水平拆分
將一張表中的數據分片到不同節點主機中,表結構相同,內容不同。
本質一樣:schema配置邏輯庫ITCAST中的邏輯表tb_log數據分片在dn4,dn5,dn6的分片節點中,rule指定分片規則。 dataNode配置節點關聯的節點主機。
server配置用戶訪問權限
使用MyCat后所有DDL,DML語句在MyCat中執行。
6.分片規則
6.1范圍分片

rule引用tableRule name中的分片規則,algorithm引用funcion name中的分片算法。
6.2取模分片

6.1與6.2不適用字段值為字符串。
6.3一致性哈希
所謂一致性哈希,相同的哈希因子計算值總是被劃分到相同的分區表中,不會因為分區節點的增加而改變原來數據的分區位置。
6.4枚舉
通過在配置文件中配置可能的枚舉值,指定數據分布到不同數據節點上,本規則適用于按照省份、性別、狀態拆分數據等業務。
6.5應用指定算法
運行階段由應用自主決定路由到那個分片,直接根據字符子串(必須是數字)計算分片號
6.6固定分片hash算法
該算法類似于十進制的求模運算,但是為二進制的操作,例如,取d的二進制低10位與 1111111111進行位&運算。
paritioncount位分片數,length為長度。 前兩個分片節點長度256,第三個長度512.
6.7字符串哈希解析
截取字符串中的指定位置的子字符串,進行hash算法,算出分片。
6.8 按日期(天)分片
6.9 按日期(月)分片
7.MyCat管理與監督
MyCat對SQL語句解析解析,根據rule配置的分片規則對字段進行分片分析后決定路由給哪個節點。
MyCat對查詢到的結果集再合并進行一系列處理后返回給客戶端。
排序等操作都是在MyCat中執行,因為對部分數據處理無意義,采用整合后再處理。