12.25 《MyCat數據庫的基礎配置及使用》


《MyCat數據庫的基礎配置及使用》

一、為什麼需要分佈式數據據庫

隨著計算機和信息技術的迅猛發展,行業應用系統的規模迅速擴大,行業應用所產生的數據量呈爆炸式增長,動輒達到數百TB甚至數百PB的規模,已遠遠超出傳統計算技術和信息系統的處理能力,集中式數據庫面對大規模數據處理逐漸表現出其侷限性。因此,人們希望尋找一種能快速處理數據和及時響應用戶訪問的方法,也希望對數據進行集中分析、管理和維護。這已經成為迫切需求。

分佈式數據庫是在集中式數據庫的基礎上發展起來的,是計算機技術和網絡技術結合的產物。分佈式數據庫是指數據在物理上分佈而在邏輯上集中管理的數據庫系統。物理上分佈是指數據分佈在物理位置不同並由網絡連接的節點或站點上;邏輯上集中是指各數據庫節點之間的邏輯上是一個整體,並由統一的數據庫管理系統管理。不同的節點分佈可以跨不同的機房、城市甚至國家。

二、分佈式數據庫的特點

分佈式數據庫具有透明性、數據冗餘性、易於擴展性、自治性等特點,還具有經濟、性能優越、響應速度更快、靈活的體系結構、易於集成現有系統等特點。

分佈式數據庫儘管有著天生的高貴血統,但它依賴調整網絡,對事務的處理遠沒有傳統數據庫成熟,在很長一段時間內分佈式數據存儲將與傳統數據存儲共存。

三、MyCat數據庫中間件簡介

MyCat是一個徹底開源的面向企業應用開發的大數據庫集群,支持事務、ACID,是可以替代MySQL的加強版數據庫。MyCat被視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群,它是整合了內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server,是結合了傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品,也是一個優秀的數據庫中間件。

MyCat是通過Cobar改良而生。MyCat支持Oracle、PostgreSQL,從1.3版本開始支持NoSQL(SequoiaDB及MongoDB)並引入了Druid解析器。2016年MyCat發佈了1.5版本,2018年發佈了 1.6.6版本 。目前MyCat2.0項目已經啟動,核心代碼已經提交(https://github.com/MyCatApache/MyCat2.git)。

四、MyCat核心概念詳解

4.1 邏輯庫(schema)

通常在實際應用中,業務開發人員並不需要知道中間件的存在,只需要關注數據庫,所以數據庫中間件可以被當作一個或多個數據庫集群構成的邏輯庫。

《MyCat數據庫的基礎配置及使用》

4.2 邏輯表(table)

既然有邏輯庫,就會有邏輯表。在分佈式數據庫中,對於應用來說,讀寫數據的表就是邏輯表。邏輯表可以分佈在一個或多個分片庫中,也可以不分片。

1)分片表

分片表是指將數據量很大的表切分到多個數據庫實例中,所有分片組合起來構成了一張完整的表。例如在MyCat上配置t_node的分片表,數據按照規則被切分到dn1、dn2兩個節點。

<code><tablename>/<code>

2)非分片表

並非所有的表在數量很大時都需要進行分片。非分片表是相對分片表而言的,不需要進行數據切分的表。如下面配置中的t_node只存在於節點dn1上。

<code><tablename>/<code>

3)ER表

關係型數據庫是基於實體關係模型(Entity Relationship Model)的,MyCat中的ER表便來源於此。基於此思想,MyCat提出了基於E-R關係的數據分片策略,子表的記錄與其所關聯的父表的記錄存放在同一個數據分片上,即子表依賴於父表,通過表分組(Table Group)保證數據關聯查詢不會跨庫操作。

表分組是解決跨分片數據關聯查詢的一種很好的思路,也是數據切分的一條重要規則。

4)全局表

在一個真實的業務場景中往往存在大量類似的字典表,這些字典表中的數據變動不頻繁,而且數據規模不大,很少有超過數十萬條的記錄。

當業務表因為規模進行分片後,業務表與這些附屬的字典表之間的關聯查詢就成了比較棘手的問題,所以在MyCat中通過數據冗餘來解決這類表的關聯查詢,即所有分片都複製了一份數據,我們把這些冗餘數據的表定義為全局表。

數據冗餘是解決跨分片數據關聯查詢的一種很好的思路,也是數據切分規劃的另一條重要規則。

4.3 分片節點(dataNode)

將數據切分後,一個大表被分到不同的分片數據庫上,每個表分片所在的數據庫是分片節點。

4.4 節點主機(dataHost)

將數據切分後,每個分片節點不一定會獨佔一臺機器,同一臺機器上可以有多個分片數據庫,這樣一個或多個分片節點所在的機器就是節點主機。為了規避單節點主機併發數量的限制,儘量將讀寫壓力高的分片節點均勻地放在不同的節點主機上。

五、MyCat原理介紹

MyCat原理中最重要的一個動詞是“攔截”,它攔截了用戶發送過來的SQL語句,首先對SQL語句做了一些特定的分析,例如分片分析、路由分析、讀寫分離分析、緩存分析等,然後將此SQL語句發往後端的真實數據庫,並將返回的結果做適當的處理,最終再返回給用戶。

《MyCat數據庫的基礎配置及使用》

MyCat收到一條SQL語句時,首先解析SQL語句涉及的表,接著查看此表的定義,如果該表存在分片規則,則獲取SQL語句裡分片字段的值,並匹配分片函數,得到該SQL語句對應的分片列表,然後將SQL語句發送到相應的分片去執行,最後處理所有分片返回的數據並返回給客戶端。

六、MyCat配置

schema.xml是MyCat的重要配置文件,它管理著邏輯庫、分片表、分片節點和分片主機等信息。

service.xml是系統參數的配置文件,掌握MyCat優化方法,必須熟悉該文件的配置項。

sequence是全局序列的配置文件。

6.1 server.xml配置文件

server.xml配置文件包含了MyCat的系統配置信息,對應的源碼是SystemConfig.java。它有兩個重要的標籤,分別是user、system。掌握system標籤的各項配置屬性是MyCat調優的關鍵。

<code><serverxmlns><system><propertyname>0<propertyname>1<propertyname>0 
<propertyname>0<propertyname>2<propertyname>false<propertyname>0<propertyname>0<propertyname>1<propertyname>64k<propertyname>1k<propertyname>0<propertyname>384m<propertyname>false<propertyname>false<propertyname>true/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<propertyname>/<system>
<username><propertyname>123456<propertyname>TESTDB<username><propertyname>user<propertyname>TESTDB<propertyname>true/<propertyname>/<propertyname>/<propertyname>/<username>/<propertyname>/<propertyname>/<username>/<serverxmlns>/<code>

6.2 schema.xml配置文件

schema.xml 作為MyCat中重要的配置文件之一,涵蓋了MyCat的邏輯庫、表、分片規則、分片節點及數據源。

1)schema 標籤

<code><schemaname>/<code>

schema標籤用於定義MyCat實例中的邏輯庫。MyCat可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。可以使用schema標籤來劃分不同的邏輯庫,如果有配置schema標籤,則所有的表配置都會屬於同一個默認的邏輯庫。

<code><schemaname><tablename><schemaname><tablename>/<schemaname>/<schemaname>/<code>

如上所示配置了兩個不同的邏輯庫,邏輯庫的概念等同於MySQL數據庫中的Database概念,我們在查詢邏輯庫中的表時,需要切換到該邏輯庫下才可以查詢其中的表。

checkSQLschema屬性,當把該值設置為true時,如果我們執行語句 select * from TESTDB.travelrecord;,則MyCat會把schema字符去掉,把SQL語句修改為select * from travelrecord;可避免發送到後端數據庫執行時報錯。

SqlMaxLimit屬性,當該屬性設置為某個值時,每次執行的SQL語句如果沒有加上limit語句,MyCat也會自動在limit語句後加上對應的值。如果不設置該值,則MyCat會把查詢到的信息全部返回。

2)table 標籤

<code><tablename>/<code>

table標籤定義了MyCat中的邏輯表,所有需要拆分的的表都需要在table標籤中定義。

table標籤的主要屬性見下表,具體介紹參見MyCat官方網站 http://www.MyCat.io 。

屬性名值數量限制nameString1dataNodeString1..*ruleString0..1ruleRequiredboolean0..1primaryKeyString1typeString0..1autoIncrementboolean0..1subTablesString1needAddLimitBoolean0..1

3)childTable 標籤

childTable標籤用於定義 E-R 分片的子表,通過標籤上的屬性與父表進行關聯。

4)dataNode標籤

dataNode標籤定義了MyCat中的數據節點,也就是我們通常所說的數據分片。一個dataNode標籤就是一個獨立的數據分片。

5)dataHost標籤

dataHost標籤在MyCat邏輯庫中作為底層標籤存在,直接定義了具體的數據庫實例,讀寫分離和心跳語句。

Heartbeat標籤用來配置心跳檢查語句,Mysql可以使用select user(),Oracle可以使用select 1 from dual 等。

writeHost和readHost是讀寫的配置,一個dataHost內可以配置多個讀和寫。但如果writeHost指定的後端數據庫宕機,那麼這個writeHost綁定的所有readHost也將不可用;另一方面,MyCat會自動檢測到writeHost宕機,並切換到備用的writeHost上。

七、MyCat分片

在MyCat中將表分為兩種大的概念:數據量小且不需要做數據切分的表,稱為非分片表;數據量大到單庫性能、容量不足以支撐,數據需要通過水平切分均勻分佈到不同的數據庫中的表,稱為分片表。而中間件最終需要處理的事情是對數據切分、聚合。

7.1 ER關係分片表

ER模型是實體關係模型,廣泛採用概念模型設計方法,基本元素是實體、關係和屬性。MyCat將它引入數據切分規則中,使得有互相依賴的表能夠按照某一規則切分到相同的節點上,避免跨庫Join關聯查詢。具體詳情配置內容在這裡不做描述請參考官方文檔。

八、功能與優勢

8.1 常用命令

  • MyCat提供類似數據管理監控方式,可以通過MySQL命令行登錄管理端口(9066)執行相應的SQL語句進行管理,也可以通過JDBC方式進行遠程連接管理。
  • Reload @@config命令用於更新配置文件運行該命令,不用重啟即可進行配置文件更新。
  • Reload @@sqlstat用來關閉和開啟SQL監控分析。
  • Show @@database命令用來顯示MyCat數據庫列表,運行結果對應schema.xml配置文件的schema子節點。
  • Show @@datanode用來顯示MyCat數據節點,運行結果對應schema.xml配置文件的dataNode節點。
  • Show @@heartbeat用於報告心跳狀態。
  • Show @@connection用來獲取MyCat的前端連接狀態。
  • Kill @@connection id,id,id 用來關閉連接。
  • Show @@ cache用來查看緩存。
  • Show @@datasource 用來查看數據源狀態,如果配置了主從或多主,則可以切換。
  • Switch @@ datasource name:index 用於切換數據源。
  • Show @@syslog limit 用於顯示系統日誌。
  • Show @@sql 顯示在MyCat中執行過的語句。
  • Show @@shl.show 顯示慢SQL語句。
  • Show @@sql.sum 顯示SQL語句的整體執行情況、讀寫比例等。

8.2 侷限性

delete操作不支持沒有主鍵的表。沒有主鍵的表在不同節點的順序不同,如果執行 select ...limit...,則將出現不同的結果集。

不支持XA事務,在提交上可能回滾。

由於集群是樂觀的併發控件,事務commit可能在該階段中止,所以如果有兩個事務向集群中的不同節點的同一行寫入並提交,則失敗的節點將中止。對於集群級別的中止,集群返回死鎖錯誤。

整個集群的寫入吞吐量由最弱的節點限制,如果有一個節點變得緩慢,那麼整個集群將變得緩慢。

集群內部按照id自增長機制寫入數據,比如集群中有三臺可能是3,6,9這樣的遞增。

8.3 與Sharding-JDBC對比Sharding-JDBC

MyCat是一箇中間件的第三方應用,sharding-jdbc是一個jar包。因為MyCat是單獨部署,所以使用MyCat就像是訪問數據庫一樣,而sharding-jdbc的邏輯都是需要在工程裡寫的。

如果只是單獨應用可以使用輕量級的Sharding-JDBC,如果多個服務都需要操作數據庫則使用MyCat更合適。因為用Sharding-JDBC需要在每一個工程裡邊都配置上相應的分片等邏輯,而MyCat只需要配置一份單獨部署。

文末福利:為了讓學習變得輕鬆、高效,今天給大家免費分享一套阿里架構師傳授的一套教學資源。幫助大家在成為架構師的道路上披荊斬棘。

這套視頻課程詳細講解了(Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構)等這些成為架構師必備的內容!

《MyCat數據庫的基礎配置及使用》

而且還把框架需要用到的各種程序進行了打包,根據基礎視頻可以讓你輕鬆搭建分佈式框架環境,像在企業生產環境一樣進行學習和實踐。

領取方式:關注作者,私信關鍵詞 (資料)即可!


領取方式:關注作者,私信關鍵詞 (資料)即可!


領取方式:關注作者,私信關鍵詞 (資料)即可!


分享到:


相關文章: