您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何掌握Mycat中間件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何掌握Mycat中間件”吧!
分布式數(shù)據(jù)存儲與Mycat
Mycat架構(gòu)介紹
Mycat核心概念及配置
分布式數(shù)據(jù)存儲與Mycat
眾所周知,在分布式數(shù)據(jù)庫的使用場景下,數(shù)據(jù)的存儲不像集中式數(shù)據(jù)庫那樣都存放在一臺服務(wù)器的一個數(shù)據(jù)庫中,而是會分布在不同的服務(wù)器的不同數(shù)據(jù)庫中。而應(yīng)用程序的會根據(jù)不同的數(shù)據(jù)庫進行訪問,如圖1 所示,應(yīng)用程序需要根據(jù)訪問的數(shù)據(jù)庫不同:數(shù)據(jù)庫1、數(shù)據(jù)庫2、數(shù)據(jù)庫3使用不同的數(shù)據(jù)庫連接,如果說某張數(shù)據(jù)表在三個數(shù)據(jù)庫中都存在,也需要使用特定的方式對其進行訪問,可以說在應(yīng)用程序這端訪問起來是比較麻煩的。
圖1
分布式的數(shù)據(jù)庫隊增加了應(yīng)用程序訪問的復(fù)雜度
正因為應(yīng)用程序在訪問分布式數(shù)據(jù)庫的時候會遇到類似的問題,所以引入了數(shù)據(jù)庫中間件來簡化應(yīng)用程序需要面對的問題。如圖2所示,在應(yīng)用程序和數(shù)據(jù)庫中間引入Mycat數(shù)據(jù)庫中間件以后,讓應(yīng)用程序的編程更加方便,它不用在面對分布式的數(shù)據(jù)庫,而只用針對Mycat中間件進行數(shù)據(jù)庫編程就能完成對應(yīng)的數(shù)據(jù)操作,并且適用于以下幾種場景:
讀寫分離:可以通過Mycat針對數(shù)據(jù)庫1進行寫操作,而對數(shù)據(jù)庫2和3進行讀操作。如果在寫服務(wù)器出現(xiàn)宕機的情況,Mycat可以將寫的請求暫時轉(zhuǎn)移到其他的數(shù)據(jù)庫服務(wù)器上,保證數(shù)據(jù)庫的可用性。
垂直分表分庫:將訂單表存放到數(shù)據(jù)庫1和2中,將商品表存放到數(shù)據(jù)庫3中。也就是把不同的表放在不同的庫中。
水平分表分庫:將訂單表的不同記錄通過分片算法(例如:hash取模)分表存放到數(shù)據(jù)庫1和2中。也就是將相同表的不同數(shù)據(jù)放到不同庫的表中。
訪問不同的數(shù)據(jù)庫:數(shù)據(jù)庫1和2對應(yīng)訪問的就是MySQL數(shù)據(jù)庫,而數(shù)據(jù)庫3訪問的是Oracle數(shù)據(jù)庫。
控制應(yīng)用程序到數(shù)據(jù)庫的連接數(shù)量:每一個數(shù)據(jù)庫連接都會占用數(shù)據(jù)庫服務(wù)器的資源,每個數(shù)據(jù)庫服務(wù)器能夠連接的請求也是有限的,這里Mycat可以控制前端應(yīng)用請求數(shù)據(jù)庫服務(wù)器的連接數(shù)量,保證數(shù)據(jù)庫服務(wù)器的高可用。
換句話說,當應(yīng)用程序發(fā)起一條SQL語句的時候,不用關(guān)心數(shù)據(jù)庫存放在哪個服務(wù)器,以及數(shù)據(jù)庫表是否做了分表分庫,只用將要查的數(shù)據(jù)告訴Mycat就可以了,Mycat在考慮上述場景之后將結(jié)果返回給應(yīng)用程序,讓開發(fā)者更加方便快捷地操作數(shù)據(jù)。
圖2
引入Mycat協(xié)助應(yīng)用程序?qū)崿F(xiàn)讀寫分離、分表分庫操作
上面描述的這些數(shù)據(jù)操作如果在沒有Mycat中間件的情況需要在應(yīng)用程序端維護大量的代碼,而有了Mycat之后應(yīng)用程序只需要針對Mycat進行配置,并且對其變成就能完成這些操作。
Mycat是一個開源的面相企業(yè)應(yīng)用開發(fā)的數(shù)據(jù)庫中間件,支持大數(shù)據(jù)庫集群、事物、ACID。適用于高可用性、數(shù)據(jù)庫讀寫分離、數(shù)據(jù)分級存儲保障、大型數(shù)據(jù)庫的分表分庫以及并行計算、數(shù)據(jù)庫路由以及整合諸如MySQL、Oracle、SQL Server 等數(shù)據(jù)庫。由于Mycat開源中間件有一個發(fā)展的過程,每個版本的迭代都會遇到一些問題,目前已經(jīng)更新到了Mycat 2.0是一個相對穩(wěn)定的版本。
如果有條件的同學盡量使用最新版本,或者使用Mycat 1.6.5 以上的版本,其修正了一些常用SQL函數(shù)的問題。不過Mycat 也不是萬能的依舊會存在一些問題,我們這里把它的優(yōu)缺點列出如下表格方便大家參考。
優(yōu)點 | 缺點 |
拆分后業(yè)務(wù)清晰,拆分規(guī)則明確 | 部分業(yè)務(wù)表無法join,只能通過接口調(diào)用 |
系統(tǒng)之間容易擴展和整合 | 跨庫事務(wù)難以處理 |
數(shù)據(jù)維護簡單 | 垂直切分后某些業(yè)務(wù)數(shù)據(jù)過于龐大,仍然存在單體性能瓶頸 |
解決了單庫大數(shù)據(jù)、高并發(fā)的性能瓶頸 | 拆分規(guī)則很難抽象 |
拆分規(guī)則封裝好,對應(yīng)用端幾乎透明,開發(fā)人員無需關(guān)心拆分細節(jié) | 分片事務(wù)一致性難以解決,需要通過XA或者借助其他分布式事務(wù)方式,例如:Redis、Zookeeper。 |
提高了系統(tǒng)的穩(wěn)定性和負載能力 | 二次擴展時,數(shù)據(jù)遷移、維護難度大 |
Mycat架構(gòu)介紹
上面講到了Mycat在分布式數(shù)據(jù)庫中起到的作用,讓應(yīng)用程序的開發(fā)專注于業(yè)務(wù)本身,把分表分庫、讀寫分離、訪問不同數(shù)據(jù)以及控制數(shù)據(jù)庫連接的問題都交給Mycat來處理。那么Mycat是通過怎樣的架構(gòu)實現(xiàn)上述功能的呢,下面就和我一起來看看Mycat的組件和架構(gòu)。
從邏輯上劃分以下六個模塊。
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
通信協(xié)議模塊:主要負責底層通信功能,例如收發(fā)數(shù)據(jù)、線程回調(diào)等工作。采用Reactor、Proctor模式,在網(wǎng)絡(luò)IO架構(gòu)中實現(xiàn)了NIO和AIO的方式。
SQL執(zhí)行模塊:顧名思義,其接受到要執(zhí)行的SQL 以后通過數(shù)據(jù)庫連接模塊連接到數(shù)據(jù)庫,通過連接池獲取目標數(shù)據(jù)庫,再經(jīng)由SQL路由解析把SQL語句分發(fā)到數(shù)據(jù)庫節(jié)點中進行執(zhí)行。
路由解析模塊:當Mycat實現(xiàn)分表分庫功能的時候,路由就顯得非常重要了。該模塊當收到應(yīng)用程序請求的查詢語句以后,會連接后端的數(shù)據(jù),通過配置文件的規(guī)則設(shè)置,將請求路由到對應(yīng)的數(shù)據(jù)庫的表中進行查詢。同時該模塊還肩負SQL解析的職能,需要對SQL語句的EXPLAIN、SET、SHOW、SELECT等命令進行解析,從而獲取表名、條件、字段列表等信息。同時還可以對SQL語句進行改寫。
數(shù)據(jù)庫連接模塊:主要負責創(chuàng)建、管理、維護后端的數(shù)據(jù)庫以及對應(yīng)的數(shù)據(jù)庫連接池。并且通過連接池機制對數(shù)據(jù)庫連接的生命周期進行管理。
結(jié)果集處理模塊:當查詢結(jié)果返回之前需要將其進行匯總、排序。特別是針對數(shù)據(jù)分片的情況,返回的數(shù)據(jù)來自不同的數(shù)據(jù)庫服務(wù)器和表,需要將這些數(shù)據(jù)進行必要的匯總才能返回給應(yīng)用程序。
監(jiān)控管理模塊:主要對Mycat中的連接、內(nèi)存等資源進行監(jiān)控和管理。監(jiān)控參數(shù)包括:連接數(shù)、緩存命中數(shù)等。
上面六個模塊看上去比較抽象,如果理清邏輯順序記憶起來還是比較方便的。通訊協(xié)議模塊接受到應(yīng)用程序的SQL請求,會將其交給SQL執(zhí)行模塊,執(zhí)行模塊解析SQL之后需要知道訪問哪些節(jié)點上的數(shù)據(jù)庫。于是,它請求路由解析模塊,再了解需要訪問哪些數(shù)據(jù)庫以后,通過數(shù)據(jù)庫連接模塊建立數(shù)據(jù)庫連接,并且分發(fā)SQL到對應(yīng)數(shù)據(jù)庫上執(zhí)行,將返回的數(shù)據(jù)通過結(jié)果集處理模塊,匯總、排序,最后返回給應(yīng)用程序。監(jiān)控管理模塊就好像一個大管家監(jiān)視Mycat中的連接、內(nèi)存等資源使用情況。
如果將上面的組件通過Mycat的處理流程展示的話:
圖3
Mycat 數(shù)據(jù)處理流程
如圖3所示,整個圖由上、中、下3步部分組成。
上面的部分代表客戶端,其承載多個應(yīng)用程序會向處在中間的Mycat服務(wù)發(fā)起SQL請求。中間Mycat服務(wù),包含了上述的六大組件,負責對應(yīng)用程序請求進行處理和響應(yīng)。下面的存儲層可以對接不同的數(shù)據(jù)源,為Mycat提供存儲服務(wù)。整個請求處理流程分為請求和響應(yīng)兩個部分,分別由“從上往下”和“從下往上”的兩個箭頭代表,這里我們將Mycat的處理分為六個步驟給大家介紹如下:
1. 在客戶端的應(yīng)用程序向Mycat服務(wù)發(fā)起SQL請求的時候,通信協(xié)議模塊會通過NIO/AIO的方式將請求提交給路由解析模塊。
2. 路由解析模塊包含SQL解析、優(yōu)化和路由的功能。主要功能是將SQL進行解析成要執(zhí)行的命令,并且對其進行優(yōu)化,之后通過路由規(guī)則找到要執(zhí)行的數(shù)據(jù)庫服務(wù)器。
3. 之后請求會交給SQL執(zhí)行模塊,根據(jù)路由解析的結(jié)果分發(fā)到數(shù)據(jù)庫服務(wù)器上執(zhí)行。
4. 在執(zhí)行之前需要通過數(shù)據(jù)庫連接模塊獲取數(shù)據(jù)庫對應(yīng)的連接,同時需要對數(shù)據(jù)庫連接池進行管理。
5. 同樣,在分發(fā)執(zhí)行SQL的時候也需要通信協(xié)議模塊進行信息的傳遞。
6. 當執(zhí)行完SQL請求以后,數(shù)據(jù)庫會將數(shù)據(jù)通過結(jié)果處理模塊進行聚合、排序、匯總的操作,最后將數(shù)據(jù)返回給客戶端的應(yīng)用程序,完成整個請求過程。
Mycat核心概念及配置
在描述完Mycat 的架構(gòu)和工作流程以后,相信大家對Mycat的執(zhí)行機制和結(jié)構(gòu)都有一定的了解。站在架構(gòu)的高度對下面的核心概念的理解會有一些幫助,如果說上面講的是Mycat邏輯架構(gòu),那么下面介紹的核心概念及配置就涉及到具體操作的范疇。
畢竟Mycat需要提供配置工具完成開發(fā)者的功能,然后再通過架構(gòu)來執(zhí)行這些規(guī)則,最后實現(xiàn)對分布式數(shù)據(jù)庫開發(fā)的透明性。接下來要介紹的就是在使用Mycat過程中遇到的核心概念,以及這些概念對應(yīng)的配置方式和對應(yīng)的配置文件。方便我們落地Mycat中間件的應(yīng)用。
圖4
Mycat核心概念圖
如圖4所示,改圖描述了Mycat 核心概念之間的關(guān)系,并且描述了這些核心概念在哪些配置文件中進行配置。
我們從上往下跟著序號來看這些概念:
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
Mycat中的系統(tǒng)信息和用戶信息都在Server.xml文件中進行配置,其中對于user(用戶)的配置包含了,用戶基本信息和所能夠訪問schema(邏輯庫)的權(quán)限。
Schema.xml包含了Mycat對于數(shù)據(jù)的定義,Schema(邏輯庫)會包含一個或者多個table(邏輯表)。
Table(邏輯表)會通過包含的datanode(數(shù)據(jù)節(jié)點)來描述數(shù)據(jù)存放的服務(wù)器和物理數(shù)據(jù)庫。
在datanode中包含了datahost和database。其中datahost表示數(shù)據(jù)庫所在的服務(wù)器集群,而database是對物理數(shù)據(jù)庫的描述。
針對每個table的分片定義規(guī)則,在rule.xml文件中進行定義,rule在定義規(guī)則的時候會調(diào)用function對規(guī)則算法進行描述。
上面我們將Mycat核心概念以及它們對應(yīng)的配置文件給大家做了整體介紹,接下來將對上面的概念做深入的描述。
1.用戶(User)
Mycat中的用戶是一個邏輯上的用戶,他定義了用來連接Mycat中間件的用戶信息,并且將這些信息存放在server.xml文件中。如圖5所示,這是server.xml 文件中對user 信息的定義。
圖5
用戶的定義Server.xml文件
可以看到定義了用戶名為“test”,密碼“password”是123456.在schemas 標簽里面定義了“test_db” 這是該用戶可以訪問的邏輯數(shù)據(jù)庫。在privileges標簽中定義了true說明還會用戶對邏輯庫的具體使用權(quán)限。這里定義對“test_db”的dml到操作用的是四位數(shù)字表示,分別是“0110”。
實際上每一位都表示一種操作,四位對應(yīng)的操作分別是“insert、update、select、delete”,如果對應(yīng)的位數(shù)上是“1”表示支持該操作,如果是“0”表示不支持對應(yīng)的操作。
“0110”就表示,不支持insert操作、支持update操作、支持select操作,不支持delete操作。以此類推在schema標簽下面還有一個table標簽,可以設(shè)置對邏輯表的權(quán)限,例如:table01的dml是0000,也就是不能進行四種操作的意思。
2.邏輯庫(schema)
開發(fā)人員在進行數(shù)據(jù)庫開發(fā)的時候都需要對某個具體的數(shù)據(jù)庫進行操作,例如:查找、更新、刪除等等。但是到了分布式數(shù)據(jù)庫的時代,數(shù)據(jù)庫以分布式的方式部署在不同的服務(wù)器節(jié)點中,此時再去訪問這些數(shù)據(jù)庫難度就增加了。有Mycat介入以后,引入了邏輯庫的概念,邏輯庫是一個概念上的定義,其背后對應(yīng)的是一個或者多個實體數(shù)據(jù)庫,它的定義是在schema.xml文件中進行的。
如圖6所示:
圖6
邏輯庫在schema.xml文件中的定義
定義了名為“test_db”的邏輯數(shù)據(jù)庫。
sqlMaxLimit 用來限制每次查詢數(shù)據(jù)能否返回的最大行數(shù),這里設(shè)置的是“1000”,當為“-1”的時候就沒有限制。
checkSQLschema 是一個是否通過庫名和表名方式訪問數(shù)據(jù)庫的開關(guān),默認情況下是“fasle”。
3.邏輯表(table)
既然有邏輯庫就一定有邏輯表,通常意義上邏輯表會和物理表進行對應(yīng),有可能是一個邏輯表對應(yīng)多個分布在不同數(shù)據(jù)節(jié)點的物理表;也有可能對應(yīng)一張沒有進行分片的物理表。同樣這些配置都是在schema.xml配置文件中完成的。
如圖7 所示:
圖7
在邏輯庫中定義邏輯表
在上面定義的邏輯庫“test_db”中定義了一個邏輯表,表的名字叫做“order” ,邏輯表的名字需要和物理表的名字保持一致。因為在Mycat不會再定義邏輯表與物理表之間的關(guān)系了,因此使用這種隱性的方式讓它們進行對應(yīng)。
“primaryKey”標簽是定義邏輯表的主鍵,邏輯表的主鍵和物理表的主鍵也是保持一致的。設(shè)置主鍵的目的是,如果在數(shù)據(jù)分片時沒有選擇主鍵,Mycat會通過這個定義主鍵的定義對物理表進行查詢,從而提高查詢的效率。
在“dataNode”標簽中 定義了物理數(shù)據(jù)庫的名字。如果一張物理表分片存儲在多個物理數(shù)據(jù)庫,那么每個物理數(shù)據(jù)庫需要通過逗號進行分割。這里物理節(jié)點的順序也就是索引的順序。如圖中顯示的“orderdb01”的索引就是0,“orderdb02”的索引就是1。
最后在Rule標簽中定義的是水平分片的規(guī)則,具體的定義方式在后面進行詳細講解。
4.數(shù)據(jù)節(jié)點(DataNode)
定義邏輯存儲對應(yīng)的物理數(shù)據(jù)庫,這里包含兩個重要的信息:
保存數(shù)據(jù)的數(shù)據(jù)庫主機(集群)的名字
物理數(shù)據(jù)庫的名稱
同樣在schema.xml配置文件的dataNode標簽下配置。
如圖8 所示:
圖8
數(shù)據(jù)節(jié)點定義
“dataHost”標簽描述了物理數(shù)據(jù)庫的數(shù)據(jù)庫服務(wù)器(服務(wù)器節(jié)點/集群)。
“database”標簽描述了客戶端物理數(shù)據(jù)庫的名字,在服務(wù)器節(jié)點上必須存在這個數(shù)據(jù)庫。
從兩個數(shù)據(jù)節(jié)點(“orderdb01”,“orderdb02”)都定義到一個“mysql01”的datahost可以看出,它們的數(shù)據(jù)庫都存放在同一個數(shù)據(jù)庫集群中。
5.數(shù)據(jù)主機集群(DataHost)
數(shù)據(jù)主機集群主要是描述存放數(shù)據(jù)庫的主機信息,通常來說是描述一個數(shù)據(jù)庫服務(wù)器的集群。
如圖9 所示:
圖9
數(shù)據(jù)主機集群
dataHost中定義了“mysql01”的數(shù)據(jù)庫主機集群,其中包括“maxCon”(最大連接數(shù)),“minCon”(最小連接數(shù)),“balance”(讀寫分離開關(guān)),“dbType”(數(shù)據(jù)庫類型)等標簽。
重要的是,在這個集群中定義了三臺數(shù)據(jù)庫的服務(wù)器?!?92.168.0.1”這臺是寫服務(wù)器,與之對應(yīng)有一臺讀服務(wù)器,它是“192.168.0.2”。另外,還有一臺寫服務(wù)器是”192.168.0.3”。
6.分片規(guī)則(TableRule)&函數(shù)(Function)
在schema.xml文件中基本都是數(shù)據(jù)方面的定義,其中在邏輯表中有針對rule的定義,這種情況是用來定義分片規(guī)則的,一般而言分片規(guī)則的定義在rule.xml文件中完成。
如圖10所示:
圖10
tableRule和function 定義
tableRule中定義了分片規(guī)則為“mod_3_order_id”,這個名字是給邏輯表中的rule標簽使用的。從名字的含義可以看出,通過對3取模的方式對order_id這個字段進行計算,從而實現(xiàn)分片操作。
在columns標簽中定義了order_id作為取模的字段。
在algorithm標簽中定義了具體的分片算法。這里的算法名稱可以從下面的function節(jié)點中找到對應(yīng)的定義。
Function中的name 對應(yīng)上面tablerule中的算法名稱,同樣是”mod_3”,也就是通過對3進行取模。
在class 標簽中定義了算法實現(xiàn)的Class 類的namespace和對應(yīng)的類名。
Count 標簽定義的3就是具體取模的數(shù)字,這里是對3進行取模。
根據(jù)上面給出的配置規(guī)則的定義,可以得到圖11所示分片規(guī)則。
圖11
分片規(guī)則定義路由選擇
當應(yīng)用程序發(fā)起一個對order表的SQL查詢,查詢order_id=1的數(shù)據(jù)。
當請求提交給Mycat以后,針對簡單取模的方式把order_id對3進行取模得到1。
由于order表被分片存放在DB0、DB1、DB2三個庫中,通過取模的值路由到DB1的order表中并且執(zhí)行SQL語句,完成這次分布式的查詢。
到此,相信大家對“如何掌握Mycat中間件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。