1. Mycat 介紹;
分佈式數據庫系統中間層
- 實現數據庫讀寫分離、讀負載均衡、數據庫延遲等功能
- 通常情況下,如果開發 Java 程序,每個 Java 應用都會實現自己獨立的數據庫鏈接池,如果對同一個應用啓用多個實例的話,那就會有多個數據庫連接池,這樣並不能很好的起到控制數據庫連接的作用。當引入了數據庫中間層之後,可以統一的控制數據庫連接數量
- 另外數據庫中間層還可以屏蔽後端數據庫的一些變更,比如如果對數據庫進行了拆分、水平或者垂直的切分之後,可以通過數據庫中間層來屏蔽一些邏輯的變更,使得對應用造成的影響最小化
- Mycat 除了原生實現了 MySQL 的通訊協議之外,還支持通過 JDBC 連接其它的關係型數據庫產品比如 Oracle、MSSQL 等,同時還能連接非關係型數據庫如 MongoDB。可以通過同樣的方式對後端的關係型、非關係型數據庫來進行相同的操作
數據庫的讀寫分離
- 讀寫分離是數據庫中間件最常被使用到的一個功能
- 前端應用通過向 Mycat 這樣的數據庫中間件產品對後端的一個主從複製集羣的數據庫進行讀寫分離,就是把數據庫寫操作在主數據庫上進行執行,而把讀操作在從數據庫上執行
- Mycat 在支持數據庫讀寫分離的同時、還支持讀數據庫的負載均衡,這種場景較多出現在一主多從的架構上,可以把讀負載在多個從服務器之間進行負載均衡
- Mycat 還支持後端數據庫主從複製集羣的高可用。這裏的高可用並不同於 MHA、MMM 方式實現的複製架構的高可用。在 MHA、MMM 架構中,當主節點宕機後,是可以自動的從多個從節點中選取一個新的主,並且將其它的從節點對這個新的主節點重新同步。但是 Mycat 中不具備這樣的功能,它的高可用指的是可以在配置的時候除了主節點之外,再指定一臺從節點也可以支持寫的功能。當主節點宕機之後,Mycat 就會把寫 SQL 錄入到配置的時候指定的從節點上,並不支持把其它的從節點對新的主節點進行主從同步
數據庫的垂直拆分
- 回顧讀寫分離架構:App 通過 Mycat 讀寫後端的 MySQL 主從複製集羣數據庫。在主從複製集羣中,只有一臺數據庫負責寫操作。這種架構只能分擔數據庫的只讀負載
- 如果寫負載已經大到一臺數據庫服務器無法承擔的時候,這時候就需要對數據庫進行垂直拆分或者水平重啓拆分
- 數據庫的垂直拆分也可以稱爲縱向的切分。可以把數據庫想象成一個大蛋糕,垂直拆分就是把蛋糕從上到下來切成幾塊。放到數據庫系統中來說,可以把一個數據庫中的表按一定規則分攤到多個數據庫實例上去。拿電商實例來說,包括了用戶模塊、訂單模塊、支付模塊三個模塊。本來這三個模塊都集中在單 DB 中,數據庫垂直拆分就可以把這三個並不影響的模塊拆分出來,分別形成用戶庫、訂單庫、支付庫,然後通過 Mycat 來訪問這三個數據庫。對於前端應用來說,可以把它抽象成一個數據庫來使用。通過數據庫中間層極大的簡化了前端應用在數據庫拆分之後所做的變更
數據庫的水平拆分
- 數據庫的水平拆分也就是分庫分表。在經歷了垂直拆分後,如果業務量持續的發展壯大,用戶達到了上千億規模,這時候就要通過一定的規則進行水平拆分
- 繼續拿蛋糕舉例,水平拆分會把這個蛋糕從左到右邊水平的來切分。水平切分就是把原來的一個用戶庫拆成多個用戶庫,通過一定的規則來進行切分。並且這多個庫中的表結構是完全一樣的。前端應用就通過 Mycat 以及切分規則來對後端拆分後的數據庫來進行訪問。Mycat 可以統一實現切分邏輯,而不用在前端應用上來分別實現切分邏輯
應用場景
- 需要進行讀寫分離的場景:在往一臺數據庫服務器上進行讀寫混合操作的時候感到數據庫的性能大幅下降,並且讀負載明顯高於寫負載的時候。Mycat 支持多種後端的 MySQL集羣方案來進行讀寫分離,比如一主一從、一主多從、主主複製、PXC 集羣等
- 需要分庫分表的場景:Mycat 支持對超過 1000 萬的表進行分片、支持 1000 億的單表分片量級
- 多租戶場景:這是一種穩定架構,它的主要目的是在多用戶的環境下、使用不同的數據庫系統的組件,仍可以確保各個用戶之間具有一定的數據隔離性,每一個應用可以訪問用戶、但應用程序只連接 Mycat,不用改造程序本身。最常見的就是雲服務
- 數據庫統計系統:Mycat 的分表能力、處理大規模的報表的系統和統計可以併發的對後端數據庫中數據進行彙總、然後再進行合併,在報表系統中非常適用。同時也可以作爲海量數據實時查詢的簡單有效的方式
- HBASE 的一種替代方案。HBASE 是一款基於 Hadoop 的分佈式列存儲數據庫。常用的關係型數據庫比如 MySQL 都是行存儲,這裏就可以運用 Mycat 的水平和垂直切分的一種特性來實現對數據庫的一種分佈式存儲,後端的存儲還是 MySQL、是行存儲方案。可以近似的用 Mycat 來模擬一種基於 MySQL 的分佈式存儲的一種解決方案
- 需要使用同樣的方式查詢多種數據庫的場景。Mycat 除了原生支持 MySQL 之外,還可以通過 JDBC 來連接多種關係型數據庫和非關係型數據庫比如 MongoDB,這樣對於前端應用來說就可以隱藏後端數據庫的種類,以及通過同樣的方式來使用多種數據庫
Mycat 的優勢
- 基於阿里的 Cobar 系統開發
- 開發社區活躍
- 完全開源可以自定義開發
- 支持多種關係型以及 NoSQL 數據庫
- 使用 JAVA 開發,可以部署在多種系統上
- 具有在多種行業和項目中應用的成功案例
2. Mycat 基礎;
2.1 基本概念;
Mycat 中的數據庫:邏輯庫
- 數據庫中間件的主要作用就是屏蔽了分庫分表後,後端數據庫的複雜性。前端應用可以像使用一個未分片的數據庫一樣使用一個分片的數據庫。所有的分片邏輯和數據庫路由都是由數據庫中間件來實現的
- 邏輯庫就是後端物理數據庫的視圖。邏輯庫的名字可以和後端物理數據庫是不同的
- Mycat 中保存了邏輯庫的定義、而不會保存具體的數據。具體的數據是存儲在後端的物理數據庫中
邏輯表
- 和邏輯庫一樣,前端應用通過 Mycat 看到的表就是邏輯表。一個邏輯表可能對應後端多個物理數據庫中的表
- 如下圖,前端應用通過 Mycat 可以看到 User_db 中有一張表 user_inf,實際上 user_inf 的數據存儲在後端 db01 到 db03 的物理庫中
- 虛線表示邏輯庫。在數據庫水平切分的時候說過,水平切分後數據庫的庫結構和表結構是一樣的。雖然數據庫的名字不一樣,但是物理數據庫 db01 到 db03 的表名是一樣的
- 邏輯表也可以通過視圖的概念理解
2.2 關鍵特性;
支持 SQL92 標準
- 目前大多數關係型數據庫都支持的一個 SQL 標準
- 在這個標準中定義了 SQL 語句的功能和標準的一些事務的特性,比如隔離級別等等
- Mycat 作爲中間件產品爲什麼要支持 SQL92 標準,是因爲 Mycat 在對前端應用所提交的 SQL 語句進行分析之後才能通過分析的一些標準,比如分片的策略來對 SQL 進行路由
支持 MySQL 集羣
- 比如一主多從、一主一從、多主多從等
支持 JDBC 連接數據庫
- 可以連接除 MySQL 之外的多種的關係型數據庫如 MSSQL、Oracle
- 也支持 NoSQL 數據庫比如 MongoDB 等
支持自動故障切換、高可用性 / 支持讀寫分離 / 支持全局表
- 全局表就是一些比較小的字典表。這些表一般變動都會很小,並且會經常和其它一些表關聯來進行使用
- Mycat 可以把同樣的一些數據自動的存儲到多個分片節點上,這樣就可以有效的提高這種關聯的效率
支持獨有的基於 ER 關係的分片策略
- Mycat 唯一支持
- ER 關係就是實體關係模型,這個是關係型數據庫的基礎
- 這種分片策略可以把子表的記錄與所關聯的副表存放在同一個數據分片上,也就是說子表可以依賴於副表進行存儲,這樣就保證子表與副表進行關聯的時候不會跨分片跨庫來進行操作
支持一致性 HASH 分片
- HASH 算法解決了分片、擴容的問題。
- 在實際使用中建議先在同一臺服務器上建立足夠多的分片,當這臺服務器的負載過大而不能滿足業務需求時,可以把一些分片遷移到其它服務器上,這種擴容方式是最簡單也是最高效的擴容方式。
多平臺支持、部署簡單方便 / 支持全局序列號
- 在使用 MySQL 數據庫的時候,可能會使用自增 id 來作爲表的主鍵。一旦把數據庫進行分片之後,不同的分片是在不同的數據庫服務器上的,那麼它的自增 id 是各自進行維護的,這會產生 id 號重複的情況。這時候如果對分片後的表進行查詢就會發現相同的 id 會出現多次,這樣就違反了數據庫一致性的要求。所以就需要全局的序列號來對各個分片中統一來分派數據庫的自增序列。
- Mycat 提供了這麼一個功能,可以管理支持全局序列號的生成。
2.3 安裝 Mycat;
待續