架構成長之路:Mycat分庫分表核心技術分析
Mycat原理:
Mycat原理中最重要的一個動詞就是“攔截”,它攔截了使用者發過來的sql語句,首先對sql語句做一些特定的分析:如分片分析,路由分析,讀寫分離分析,快取分析等,然後將此sql發往後端真實資料庫,並將返回的結果做適當的處理,最終再返回給使用者。
分片規則:分片欄位(sharding column)+分片函式(rule function)。
Mycat應用場景:
-
單純的讀寫分離,此時配置最為簡單,支援讀寫分離,主從切換
-
分表分庫,對於超過 1000 萬的表進行分片,最大支援 1000 億的單表分片
-
多租戶應用,每個應用一個庫,但應用程式只連線 Mycat,從而不改造程式本身,實現多租戶化
-
報表系統,藉助於 Mycat 的分表能力,處理大規模報表的統計
-
替代 Hbase,分析大資料
-
作為海量資料實時查詢的一種簡單有效方案,比如 100 億條頻繁查詢的記錄需要在 3 秒內查詢出來結果, 除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時 Mycat 可能是最簡單有效的選擇。
Linux環境部署mycat日誌分析:
Wrapper日誌:
目前 Mycat 的啟動是經過 warapper 封裝成啟動指令碼,所以日誌也會有其相關的日誌檔案: ${MYCAT_HOME}/logs/warapper.log,再啟動時候如果系統環境配置錯誤或缺少配置時,導致 Mycat 無法啟動可以通過檢視 warrpper.log 檢視具體錯誤原因。
Mycat日誌:
可以看到配置的資料來源相關資訊,上面是兩個資料來源連線 datahost,Mycat 的快取資訊及動態類載入資訊,Mycat 執行緒池、buffer、連線池等等所有的配置資訊,通過該啟動項可以得知當前執行的 Mycat 個引數調整情況,生產環境下需要做部分引數調整,可以根據該日誌分析引數情況,Mycat 啟動埠,Mycat後端連線池的初始化過程,心跳檢測到連線異常關閉後端連線的日誌,可以通過該日誌檢視後端資料連線狀態。
Debug模式下分析sql執行:
通過該日誌可以看到 Mycat 整個執行的計劃。 其中最重要的是 sql 路由的計劃,可以看到 sql 具體被分配到那個分片執行,如果日誌異常原因為 sql 錯誤導致 sql 解析器無法解析 sql,通過分析錯誤日誌可以找到具體的出錯原因。 Mycat 日誌很重要,當發現 SQL 執行有異常的時候,大多數情況下,都可以通過分析 Mycat 日誌來定位錯誤。
動態資料來源核心配置:
在Spring 2.0.1中引入了AbstractRoutingDataSource, 該類充當了DataSource的路由中介, 能有在執行時, 根據某種key值來動態切換到真正的DataSource上。
步驟:
1.專案中需要整合多個數據源分別為讀和寫的資料來源,繫結不同的key。
2.採用AOP技術進行攔截業務邏輯層方法,判斷方法的字首是否需要寫或者讀的操作
3.如果方法的字首是寫的操作的時候,直接切換為寫的資料來源,反之切換為讀的資料來源
也可以自己定義註解進行封裝
動態資料來源與多數資料來源區別:
-
多資料來源---以分包形式
-
動態資料在jvm進行不斷地進行切換
-
資料庫叢集如何考慮資料庫自增唯一性
Mycat分片叢集分表分庫策略
在資料庫叢集環境下,預設自增方式存在問題,因為都是從1開始自增,可能會存在重複,應該設定每臺節點自增步長不同。
查詢自增的步長
SHOW VARIABLES LIKE 'auto_inc%'
修改自增的步長
SET @@auto_increment_increment=10;
修改起始值
SET @@auto_increment_offset=5;
假設有兩臺mysql資料庫伺服器
節點①自增1 3 5 7 9 11 ….
節點②自增2 4 6 8 10 12 ….
注意:在最開始設定好了每臺節點自增方式步長後,確定好了mysql叢集數量後,無法擴充套件新的mysql,不然生成步長的規則可能會發生變化。
資料庫分表分庫策略:
垂直拆分:
就是根據不同的業務,分為不同的資料庫,比如會員資料庫、訂單資料庫、支付資料庫等,垂直拆分在大型電商系統中用的非常常見。
優點:
拆分後業務清晰,拆分規則明確,系統之間整合或擴充套件容易。
缺點:
部分業務表無法join,只能通過介面方式解決,提高了系統複雜度存在分散式事務問題。
水平拆分:
相對於垂直拆分,水平拆分不是將表的資料做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料。簡單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中 的某些行切分到一個數據庫,而另外的某些行又切分到其他的資料庫中
主要有分表,分庫兩種模式
該方式提高了系統的穩定性跟負載能力,但是跨庫join效能較差。