自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

掌握6大模塊、7個(gè)核心概念!幫你搞定Mycat中間件

開(kāi)發(fā) 前端
本文從分布式數(shù)據(jù)存儲(chǔ)入手,描述了Mycat在分布式數(shù)據(jù)庫(kù)中起到了怎樣的作用。然后介紹了Mycat的六大模塊:通信協(xié)議、SQL執(zhí)行、路由解析、數(shù)據(jù)庫(kù)連接、結(jié)果集處理、監(jiān)控管理,是如何工作的。

[[378586]]

本文轉(zhuǎn)載自微信公眾號(hào)「石杉的架構(gòu)筆記」,作者崔皓 。轉(zhuǎn)載本文請(qǐng)聯(lián)系石杉的架構(gòu)筆記公眾號(hào)。  

開(kāi)篇

近今年里隨著經(jīng)濟(jì)的飛速發(fā)展,企業(yè)的業(yè)務(wù)也在不斷膨脹,作為業(yè)務(wù)支撐的信息系統(tǒng)特別是數(shù)據(jù)庫(kù)系統(tǒng)也面臨前所未有的壓力,行業(yè)應(yīng)用所產(chǎn)生的數(shù)據(jù)呈爆炸式地增長(zhǎng)。數(shù)據(jù)從原來(lái)的GB級(jí)別迅速增常到TB甚至是PB的規(guī)模,已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)傳統(tǒng)計(jì)算技術(shù)的要求,原來(lái)集中式的存儲(chǔ)方式已經(jīng)無(wú)法滿(mǎn)足數(shù)據(jù)存儲(chǔ)的要求,此時(shí)分布式數(shù)據(jù)存儲(chǔ)由于良好的透明性、數(shù)據(jù)冗余性、擴(kuò)展性、自治性逐漸進(jìn)入人們的視野。為了更好的使用和管理分布式數(shù)據(jù)庫(kù),業(yè)內(nèi)推出了不少優(yōu)秀的分布式數(shù)據(jù)庫(kù)中間件,Mycat就是其中之一,今天就來(lái)看看Mycat的架構(gòu)和實(shí)現(xiàn)原理。本篇文章會(huì)學(xué)到以下內(nèi)容:

分布式數(shù)據(jù)存儲(chǔ)與Mycat

  • Mycat架構(gòu)介紹
  • Mycat核心概念及配置
  • 分布式數(shù)據(jù)存儲(chǔ)與Mycat

眾所周知,在分布式數(shù)據(jù)庫(kù)的使用場(chǎng)景下,數(shù)據(jù)的存儲(chǔ)不像集中式數(shù)據(jù)庫(kù)那樣都存放在一臺(tái)服務(wù)器的一個(gè)數(shù)據(jù)庫(kù)中,而是會(huì)分布在不同的服務(wù)器的不同數(shù)據(jù)庫(kù)中。而應(yīng)用程序的會(huì)根據(jù)不同的數(shù)據(jù)庫(kù)進(jìn)行訪(fǎng)問(wèn),如圖1 所示,應(yīng)用程序需要根據(jù)訪(fǎng)問(wèn)的數(shù)據(jù)庫(kù)不同:數(shù)據(jù)庫(kù)1、數(shù)據(jù)庫(kù)2、數(shù)據(jù)庫(kù)3使用不同的數(shù)據(jù)庫(kù)連接,如果說(shuō)某張數(shù)據(jù)表在三個(gè)數(shù)據(jù)庫(kù)中都存在,也需要使用特定的方式對(duì)其進(jìn)行訪(fǎng)問(wèn),可以說(shuō)在應(yīng)用程序這端訪(fǎng)問(wèn)起來(lái)是比較麻煩的。

圖1

分布式的數(shù)據(jù)庫(kù)隊(duì)增加了應(yīng)用程序訪(fǎng)問(wèn)的復(fù)雜度

正因?yàn)閼?yīng)用程序在訪(fǎng)問(wèn)分布式數(shù)據(jù)庫(kù)的時(shí)候會(huì)遇到類(lèi)似的問(wèn)題,所以引入了數(shù)據(jù)庫(kù)中間件來(lái)簡(jiǎn)化應(yīng)用程序需要面對(duì)的問(wèn)題。如圖2所示,在應(yīng)用程序和數(shù)據(jù)庫(kù)中間引入Mycat數(shù)據(jù)庫(kù)中間件以后,讓?xiě)?yīng)用程序的編程更加方便,它不用在面對(duì)分布式的數(shù)據(jù)庫(kù),而只用針對(duì)Mycat中間件進(jìn)行數(shù)據(jù)庫(kù)編程就能完成對(duì)應(yīng)的數(shù)據(jù)操作,并且適用于以下幾種場(chǎng)景:

  • 讀寫(xiě)分離:可以通過(guò)Mycat針對(duì)數(shù)據(jù)庫(kù)1進(jìn)行寫(xiě)操作,而對(duì)數(shù)據(jù)庫(kù)2和3進(jìn)行讀操作。如果在寫(xiě)服務(wù)器出現(xiàn)宕機(jī)的情況,Mycat可以將寫(xiě)的請(qǐng)求暫時(shí)轉(zhuǎn)移到其他的數(shù)據(jù)庫(kù)服務(wù)器上,保證數(shù)據(jù)庫(kù)的可用性。
  • 垂直分表分庫(kù):將訂單表存放到數(shù)據(jù)庫(kù)1和2中,將商品表存放到數(shù)據(jù)庫(kù)3中。也就是把不同的表放在不同的庫(kù)中。
  • 水平分表分庫(kù):將訂單表的不同記錄通過(guò)分片算法(例如:hash取模)分表存放到數(shù)據(jù)庫(kù)1和2中。也就是將相同表的不同數(shù)據(jù)放到不同庫(kù)的表中。
  • 訪(fǎng)問(wèn)不同的數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)1和2對(duì)應(yīng)訪(fǎng)問(wèn)的就是MySQL數(shù)據(jù)庫(kù),而數(shù)據(jù)庫(kù)3訪(fǎng)問(wèn)的是Oracle數(shù)據(jù)庫(kù)。
  • 控制應(yīng)用程序到數(shù)據(jù)庫(kù)的連接數(shù)量:每一個(gè)數(shù)據(jù)庫(kù)連接都會(huì)占用數(shù)據(jù)庫(kù)服務(wù)器的資源,每個(gè)數(shù)據(jù)庫(kù)服務(wù)器能夠連接的請(qǐng)求也是有限的,這里Mycat可以控制前端應(yīng)用請(qǐng)求數(shù)據(jù)庫(kù)服務(wù)器的連接數(shù)量,保證數(shù)據(jù)庫(kù)服務(wù)器的高可用。

換句話(huà)說(shuō),當(dāng)應(yīng)用程序發(fā)起一條SQL語(yǔ)句的時(shí)候,不用關(guān)心數(shù)據(jù)庫(kù)存放在哪個(gè)服務(wù)器,以及數(shù)據(jù)庫(kù)表是否做了分表分庫(kù),只用將要查的數(shù)據(jù)告訴Mycat就可以了,Mycat在考慮上述場(chǎng)景之后將結(jié)果返回給應(yīng)用程序,讓開(kāi)發(fā)者更加方便快捷地操作數(shù)據(jù)。

圖2

引入Mycat協(xié)助應(yīng)用程序?qū)崿F(xiàn)讀寫(xiě)分離、分表分庫(kù)操作

上面描述的這些數(shù)據(jù)操作如果在沒(méi)有Mycat中間件的情況需要在應(yīng)用程序端維護(hù)大量的代碼,而有了Mycat之后應(yīng)用程序只需要針對(duì)Mycat進(jìn)行配置,并且對(duì)其變成就能完成這些操作。

Mycat是一個(gè)開(kāi)源的面相企業(yè)應(yīng)用開(kāi)發(fā)的數(shù)據(jù)庫(kù)中間件,支持大數(shù)據(jù)庫(kù)集群、事物、ACID。適用于高可用性、數(shù)據(jù)庫(kù)讀寫(xiě)分離、數(shù)據(jù)分級(jí)存儲(chǔ)保障、大型數(shù)據(jù)庫(kù)的分表分庫(kù)以及并行計(jì)算、數(shù)據(jù)庫(kù)路由以及整合諸如MySQL、Oracle、SQL Server 等數(shù)據(jù)庫(kù)。由于Mycat開(kāi)源中間件有一個(gè)發(fā)展的過(guò)程,每個(gè)版本的迭代都會(huì)遇到一些問(wèn)題,目前已經(jīng)更新到了Mycat 2.0是一個(gè)相對(duì)穩(wěn)定的版本。

如果有條件的同學(xué)盡量使用最新版本,或者使用Mycat 1.6.5 以上的版本,其修正了一些常用SQL函數(shù)的問(wèn)題。不過(guò)Mycat 也不是萬(wàn)能的依舊會(huì)存在一些問(wèn)題,我們這里把它的優(yōu)缺點(diǎn)列出如下表格方便大家參考。


優(yōu)點(diǎn)

缺點(diǎn)

拆分后業(yè)務(wù)清晰,拆分規(guī)則明確

部分業(yè)務(wù)表無(wú)法join,只能通過(guò)接口調(diào)用

系統(tǒng)之間容易擴(kuò)展和整合

跨庫(kù)事務(wù)難以處理

數(shù)據(jù)維護(hù)簡(jiǎn)單

垂直切分后某些業(yè)務(wù)數(shù)據(jù)過(guò)于龐大,仍然存在單體性能瓶頸

解決了單庫(kù)大數(shù)據(jù)、高并發(fā)的性能瓶頸

拆分規(guī)則很難抽象

拆分規(guī)則封裝好,對(duì)應(yīng)用端幾乎透明,開(kāi)發(fā)人員無(wú)需關(guān)心拆分細(xì)節(jié)

分片事務(wù)一致性難以解決,需要通過(guò)XA或者借助其他分布式事務(wù)方式,例如:Redis、Zookeeper。

提高了系統(tǒng)的穩(wěn)定性和負(fù)載能力

二次擴(kuò)展時(shí),數(shù)據(jù)遷移、維護(hù)難度大


Mycat架構(gòu)介紹

上面講到了Mycat在分布式數(shù)據(jù)庫(kù)中起到的作用,讓?xiě)?yīng)用程序的開(kāi)發(fā)專(zhuān)注于業(yè)務(wù)本身,把分表分庫(kù)、讀寫(xiě)分離、訪(fǎng)問(wèn)不同數(shù)據(jù)以及控制數(shù)據(jù)庫(kù)連接的問(wèn)題都交給Mycat來(lái)處理。那么Mycat是通過(guò)怎樣的架構(gòu)實(shí)現(xiàn)上述功能的呢,下面就和我一起來(lái)看看Mycat的組件和架構(gòu)。

從邏輯上劃分以下六個(gè)模塊。

  1. 通信協(xié)議模塊:主要負(fù)責(zé)底層通信功能,例如收發(fā)數(shù)據(jù)、線(xiàn)程回調(diào)等工作。采用Reactor、Proctor模式,在網(wǎng)絡(luò)IO架構(gòu)中實(shí)現(xiàn)了NIO和AIO的方式。
  2. SQL執(zhí)行模塊:顧名思義,其接受到要執(zhí)行的SQL 以后通過(guò)數(shù)據(jù)庫(kù)連接模塊連接到數(shù)據(jù)庫(kù),通過(guò)連接池獲取目標(biāo)數(shù)據(jù)庫(kù),再經(jīng)由SQL路由解析把SQL語(yǔ)句分發(fā)到數(shù)據(jù)庫(kù)節(jié)點(diǎn)中進(jìn)行執(zhí)行。
  3. 路由解析模塊:當(dāng)Mycat實(shí)現(xiàn)分表分庫(kù)功能的時(shí)候,路由就顯得非常重要了。該模塊當(dāng)收到應(yīng)用程序請(qǐng)求的查詢(xún)語(yǔ)句以后,會(huì)連接后端的數(shù)據(jù),通過(guò)配置文件的規(guī)則設(shè)置,將請(qǐng)求路由到對(duì)應(yīng)的數(shù)據(jù)庫(kù)的表中進(jìn)行查詢(xún)。同時(shí)該模塊還肩負(fù)SQL解析的職能,需要對(duì)SQL語(yǔ)句的EXPLAIN、SET、SHOW、SELECT等命令進(jìn)行解析,從而獲取表名、條件、字段列表等信息。同時(shí)還可以對(duì)SQL語(yǔ)句進(jìn)行改寫(xiě)。
  4. 數(shù)據(jù)庫(kù)連接模塊:主要負(fù)責(zé)創(chuàng)建、管理、維護(hù)后端的數(shù)據(jù)庫(kù)以及對(duì)應(yīng)的數(shù)據(jù)庫(kù)連接池。并且通過(guò)連接池機(jī)制對(duì)數(shù)據(jù)庫(kù)連接的生命周期進(jìn)行管理。
  5. 結(jié)果集處理模塊:當(dāng)查詢(xún)結(jié)果返回之前需要將其進(jìn)行匯總、排序。特別是針對(duì)數(shù)據(jù)分片的情況,返回的數(shù)據(jù)來(lái)自不同的數(shù)據(jù)庫(kù)服務(wù)器和表,需要將這些數(shù)據(jù)進(jìn)行必要的匯總才能返回給應(yīng)用程序。
  6. 監(jiān)控管理模塊:主要對(duì)Mycat中的連接、內(nèi)存等資源進(jìn)行監(jiān)控和管理。監(jiān)控參數(shù)包括:連接數(shù)、緩存命中數(shù)等。

上面六個(gè)模塊看上去比較抽象,如果理清邏輯順序記憶起來(lái)還是比較方便的。通訊協(xié)議模塊接受到應(yīng)用程序的SQL請(qǐng)求,會(huì)將其交給SQL執(zhí)行模塊,執(zhí)行模塊解析SQL之后需要知道訪(fǎng)問(wèn)哪些節(jié)點(diǎn)上的數(shù)據(jù)庫(kù)。于是,它請(qǐng)求路由解析模塊,再了解需要訪(fǎng)問(wèn)哪些數(shù)據(jù)庫(kù)以后,通過(guò)數(shù)據(jù)庫(kù)連接模塊建立數(shù)據(jù)庫(kù)連接,并且分發(fā)SQL到對(duì)應(yīng)數(shù)據(jù)庫(kù)上執(zhí)行,將返回的數(shù)據(jù)通過(guò)結(jié)果集處理模塊,匯總、排序,最后返回給應(yīng)用程序。監(jiān)控管理模塊就好像一個(gè)大管家監(jiān)視Mycat中的連接、內(nèi)存等資源使用情況。

如果將上面的組件通過(guò)Mycat的處理流程展示的話(huà):

圖3

Mycat 數(shù)據(jù)處理流程

如圖3所示,整個(gè)圖由上、中、下3步部分組成。

上面的部分代表客戶(hù)端,其承載多個(gè)應(yīng)用程序會(huì)向處在中間的Mycat服務(wù)發(fā)起SQL請(qǐng)求。中間Mycat服務(wù),包含了上述的六大組件,負(fù)責(zé)對(duì)應(yīng)用程序請(qǐng)求進(jìn)行處理和響應(yīng)。下面的存儲(chǔ)層可以對(duì)接不同的數(shù)據(jù)源,為Mycat提供存儲(chǔ)服務(wù)。整個(gè)請(qǐng)求處理流程分為請(qǐng)求和響應(yīng)兩個(gè)部分,分別由“從上往下”和“從下往上”的兩個(gè)箭頭代表,這里我們將Mycat的處理分為六個(gè)步驟給大家介紹如下:

1. 在客戶(hù)端的應(yīng)用程序向Mycat服務(wù)發(fā)起SQL請(qǐng)求的時(shí)候,通信協(xié)議模塊會(huì)通過(guò)NIO/AIO的方式將請(qǐng)求提交給路由解析模塊。

2. 路由解析模塊包含SQL解析、優(yōu)化和路由的功能。主要功能是將SQL進(jìn)行解析成要執(zhí)行的命令,并且對(duì)其進(jìn)行優(yōu)化,之后通過(guò)路由規(guī)則找到要執(zhí)行的數(shù)據(jù)庫(kù)服務(wù)器。

3. 之后請(qǐng)求會(huì)交給SQL執(zhí)行模塊,根據(jù)路由解析的結(jié)果分發(fā)到數(shù)據(jù)庫(kù)服務(wù)器上執(zhí)行。

4. 在執(zhí)行之前需要通過(guò)數(shù)據(jù)庫(kù)連接模塊獲取數(shù)據(jù)庫(kù)對(duì)應(yīng)的連接,同時(shí)需要對(duì)數(shù)據(jù)庫(kù)連接池進(jìn)行管理。

5. 同樣,在分發(fā)執(zhí)行SQL的時(shí)候也需要通信協(xié)議模塊進(jìn)行信息的傳遞。

6. 當(dāng)執(zhí)行完SQL請(qǐng)求以后,數(shù)據(jù)庫(kù)會(huì)將數(shù)據(jù)通過(guò)結(jié)果處理模塊進(jìn)行聚合、排序、匯總的操作,最后將數(shù)據(jù)返回給客戶(hù)端的應(yīng)用程序,完成整個(gè)請(qǐng)求過(guò)程。

Mycat核心概念及配置

在描述完Mycat 的架構(gòu)和工作流程以后,相信大家對(duì)Mycat的執(zhí)行機(jī)制和結(jié)構(gòu)都有一定的了解。站在架構(gòu)的高度對(duì)下面的核心概念的理解會(huì)有一些幫助,如果說(shuō)上面講的是Mycat邏輯架構(gòu),那么下面介紹的核心概念及配置就涉及到具體操作的范疇。

畢竟Mycat需要提供配置工具完成開(kāi)發(fā)者的功能,然后再通過(guò)架構(gòu)來(lái)執(zhí)行這些規(guī)則,最后實(shí)現(xiàn)對(duì)分布式數(shù)據(jù)庫(kù)開(kāi)發(fā)的透明性。接下來(lái)要介紹的就是在使用Mycat過(guò)程中遇到的核心概念,以及這些概念對(duì)應(yīng)的配置方式和對(duì)應(yīng)的配置文件。方便我們落地Mycat中間件的應(yīng)用。

圖4

Mycat核心概念圖

如圖4所示,改圖描述了Mycat 核心概念之間的關(guān)系,并且描述了這些核心概念在哪些配置文件中進(jìn)行配置。

我們從上往下跟著序號(hào)來(lái)看這些概念:

  1. Mycat中的系統(tǒng)信息和用戶(hù)信息都在Server.xml文件中進(jìn)行配置,其中對(duì)于user(用戶(hù))的配置包含了,用戶(hù)基本信息和所能夠訪(fǎng)問(wèn)schema(邏輯庫(kù))的權(quán)限。
  2. Schema.xml包含了Mycat對(duì)于數(shù)據(jù)的定義,Schema(邏輯庫(kù))會(huì)包含一個(gè)或者多個(gè)table(邏輯表)。
  3. Table(邏輯表)會(huì)通過(guò)包含的datanode(數(shù)據(jù)節(jié)點(diǎn))來(lái)描述數(shù)據(jù)存放的服務(wù)器和物理數(shù)據(jù)庫(kù)。
  4. 在datanode中包含了datahost和database。其中datahost表示數(shù)據(jù)庫(kù)所在的服務(wù)器集群,而database是對(duì)物理數(shù)據(jù)庫(kù)的描述。
  5. 針對(duì)每個(gè)table的分片定義規(guī)則,在rule.xml文件中進(jìn)行定義,rule在定義規(guī)則的時(shí)候會(huì)調(diào)用function對(duì)規(guī)則算法進(jìn)行描述。

上面我們將Mycat核心概念以及它們對(duì)應(yīng)的配置文件給大家做了整體介紹,接下來(lái)將對(duì)上面的概念做深入的描述。

1.用戶(hù)(User)

Mycat中的用戶(hù)是一個(gè)邏輯上的用戶(hù),他定義了用來(lái)連接Mycat中間件的用戶(hù)信息,并且將這些信息存放在server.xml文件中。如圖5所示,這是server.xml 文件中對(duì)user 信息的定義。

圖5

用戶(hù)的定義Server.xml文件

可以看到定義了用戶(hù)名為“test”,密碼“password”是123456.在schemas 標(biāo)簽里面定義了“test_db” 這是該用戶(hù)可以訪(fǎng)問(wèn)的邏輯數(shù)據(jù)庫(kù)。在privileges標(biāo)簽中定義了true說(shuō)明還會(huì)用戶(hù)對(duì)邏輯庫(kù)的具體使用權(quán)限。這里定義對(duì)“test_db”的dml到操作用的是四位數(shù)字表示,分別是“0110”。

實(shí)際上每一位都表示一種操作,四位對(duì)應(yīng)的操作分別是“insert、update、select、delete”,如果對(duì)應(yīng)的位數(shù)上是“1”表示支持該操作,如果是“0”表示不支持對(duì)應(yīng)的操作。

“0110”就表示,不支持insert操作、支持update操作、支持select操作,不支持delete操作。以此類(lèi)推在schema標(biāo)簽下面還有一個(gè)table標(biāo)簽,可以設(shè)置對(duì)邏輯表的權(quán)限,例如:table01的dml是0000,也就是不能進(jìn)行四種操作的意思。

2.邏輯庫(kù)(schema)

開(kāi)發(fā)人員在進(jìn)行數(shù)據(jù)庫(kù)開(kāi)發(fā)的時(shí)候都需要對(duì)某個(gè)具體的數(shù)據(jù)庫(kù)進(jìn)行操作,例如:查找、更新、刪除等等。但是到了分布式數(shù)據(jù)庫(kù)的時(shí)代,數(shù)據(jù)庫(kù)以分布式的方式部署在不同的服務(wù)器節(jié)點(diǎn)中,此時(shí)再去訪(fǎng)問(wèn)這些數(shù)據(jù)庫(kù)難度就增加了。有Mycat介入以后,引入了邏輯庫(kù)的概念,邏輯庫(kù)是一個(gè)概念上的定義,其背后對(duì)應(yīng)的是一個(gè)或者多個(gè)實(shí)體數(shù)據(jù)庫(kù),它的定義是在schema.xml文件中進(jìn)行的。

如圖6所示:

圖6

邏輯庫(kù)在schema.xml文件中的定義

定義了名為“test_db”的邏輯數(shù)據(jù)庫(kù)。

sqlMaxLimit 用來(lái)限制每次查詢(xún)數(shù)據(jù)能否返回的最大行數(shù),這里設(shè)置的是“1000”,當(dāng)為“-1”的時(shí)候就沒(méi)有限制。

checkSQLschema 是一個(gè)是否通過(guò)庫(kù)名和表名方式訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的開(kāi)關(guān),默認(rèn)情況下是“fasle”。

3.邏輯表(table)

既然有邏輯庫(kù)就一定有邏輯表,通常意義上邏輯表會(huì)和物理表進(jìn)行對(duì)應(yīng),有可能是一個(gè)邏輯表對(duì)應(yīng)多個(gè)分布在不同數(shù)據(jù)節(jié)點(diǎn)的物理表;也有可能對(duì)應(yīng)一張沒(méi)有進(jìn)行分片的物理表。同樣這些配置都是在schema.xml配置文件中完成的。

如圖7 所示:

圖7

在邏輯庫(kù)中定義邏輯表

  • 在上面定義的邏輯庫(kù)“test_db”中定義了一個(gè)邏輯表,表的名字叫做“order” ,邏輯表的名字需要和物理表的名字保持一致。因?yàn)樵贛ycat不會(huì)再定義邏輯表與物理表之間的關(guān)系了,因此使用這種隱性的方式讓它們進(jìn)行對(duì)應(yīng)。
  • “primaryKey”標(biāo)簽是定義邏輯表的主鍵,邏輯表的主鍵和物理表的主鍵也是保持一致的。設(shè)置主鍵的目的是,如果在數(shù)據(jù)分片時(shí)沒(méi)有選擇主鍵,Mycat會(huì)通過(guò)這個(gè)定義主鍵的定義對(duì)物理表進(jìn)行查詢(xún),從而提高查詢(xún)的效率。
  • 在“dataNode”標(biāo)簽中 定義了物理數(shù)據(jù)庫(kù)的名字。如果一張物理表分片存儲(chǔ)在多個(gè)物理數(shù)據(jù)庫(kù),那么每個(gè)物理數(shù)據(jù)庫(kù)需要通過(guò)逗號(hào)進(jìn)行分割。這里物理節(jié)點(diǎn)的順序也就是索引的順序。如圖中顯示的“orderdb01”的索引就是0,“orderdb02”的索引就是1。
  • 最后在Rule標(biāo)簽中定義的是水平分片的規(guī)則,具體的定義方式在后面進(jìn)行詳細(xì)講解。

4.數(shù)據(jù)節(jié)點(diǎn)(DataNode)

定義邏輯存儲(chǔ)對(duì)應(yīng)的物理數(shù)據(jù)庫(kù),這里包含兩個(gè)重要的信息:

  • 保存數(shù)據(jù)的數(shù)據(jù)庫(kù)主機(jī)(集群)的名字
  • 物理數(shù)據(jù)庫(kù)的名稱(chēng)

同樣在schema.xml配置文件的dataNode標(biāo)簽下配置。

如圖8 所示:

圖8

數(shù)據(jù)節(jié)點(diǎn)定義

“dataHost”標(biāo)簽描述了物理數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)服務(wù)器(服務(wù)器節(jié)點(diǎn)/集群)。

“database”標(biāo)簽描述了客戶(hù)端物理數(shù)據(jù)庫(kù)的名字,在服務(wù)器節(jié)點(diǎn)上必須存在這個(gè)數(shù)據(jù)庫(kù)。

從兩個(gè)數(shù)據(jù)節(jié)點(diǎn)(“orderdb01”,“orderdb02”)都定義到一個(gè)“mysql01”的datahost可以看出,它們的數(shù)據(jù)庫(kù)都存放在同一個(gè)數(shù)據(jù)庫(kù)集群中。

5.數(shù)據(jù)主機(jī)集群(DataHost)

數(shù)據(jù)主機(jī)集群主要是描述存放數(shù)據(jù)庫(kù)的主機(jī)信息,通常來(lái)說(shuō)是描述一個(gè)數(shù)據(jù)庫(kù)服務(wù)器的集群。

如圖9 所示:

圖9

數(shù)據(jù)主機(jī)集群

dataHost中定義了“mysql01”的數(shù)據(jù)庫(kù)主機(jī)集群,其中包括“maxCon”(最大連接數(shù)),“minCon”(最小連接數(shù)),“balance”(讀寫(xiě)分離開(kāi)關(guān)),“dbType”(數(shù)據(jù)庫(kù)類(lèi)型)等標(biāo)簽。

重要的是,在這個(gè)集群中定義了三臺(tái)數(shù)據(jù)庫(kù)的服務(wù)器。”192.168.0.1”這臺(tái)是寫(xiě)服務(wù)器,與之對(duì)應(yīng)有一臺(tái)讀服務(wù)器,它是“192.168.0.2”。另外,還有一臺(tái)寫(xiě)服務(wù)器是”192.168.0.3”。

6.分片規(guī)則(TableRule)&函數(shù)(Function)

在schema.xml文件中基本都是數(shù)據(jù)方面的定義,其中在邏輯表中有針對(duì)rule的定義,這種情況是用來(lái)定義分片規(guī)則的,一般而言分片規(guī)則的定義在rule.xml文件中完成。

如圖10所示:

圖10

tableRule和function 定義

  • tableRule中定義了分片規(guī)則為“mod_3_order_id”,這個(gè)名字是給邏輯表中的rule標(biāo)簽使用的。從名字的含義可以看出,通過(guò)對(duì)3取模的方式對(duì)order_id這個(gè)字段進(jìn)行計(jì)算,從而實(shí)現(xiàn)分片操作。
  • 在columns標(biāo)簽中定義了order_id作為取模的字段。
  • 在algorithm標(biāo)簽中定義了具體的分片算法。這里的算法名稱(chēng)可以從下面的function節(jié)點(diǎn)中找到對(duì)應(yīng)的定義。
  • Function中的name 對(duì)應(yīng)上面tablerule中的算法名稱(chēng),同樣是”mod_3”,也就是通過(guò)對(duì)3進(jìn)行取模。
  • 在class 標(biāo)簽中定義了算法實(shí)現(xiàn)的Class 類(lèi)的namespace和對(duì)應(yīng)的類(lèi)名。
  • Count 標(biāo)簽定義的3就是具體取模的數(shù)字,這里是對(duì)3進(jìn)行取模。

根據(jù)上面給出的配置規(guī)則的定義,可以得到圖11所示分片規(guī)則。

圖11

分片規(guī)則定義路由選擇

  1. 當(dāng)應(yīng)用程序發(fā)起一個(gè)對(duì)order表的SQL查詢(xún),查詢(xún)order_id=1的數(shù)據(jù)。
  2. 當(dāng)請(qǐng)求提交給Mycat以后,針對(duì)簡(jiǎn)單取模的方式把order_id對(duì)3進(jìn)行取模得到1。
  3. 由于order表被分片存放在DB0、DB1、DB2三個(gè)庫(kù)中,通過(guò)取模的值路由到DB1的order表中并且執(zhí)行SQL語(yǔ)句,完成這次分布式的查詢(xún)。

總結(jié)

本文從分布式數(shù)據(jù)存儲(chǔ)入手,描述了Mycat在分布式數(shù)據(jù)庫(kù)中起到了怎樣的作用。然后介紹了Mycat的六大模塊:通信協(xié)議、SQL執(zhí)行、路由解析、數(shù)據(jù)庫(kù)連接、結(jié)果集處理、監(jiān)控管理,是如何工作的。

最后通過(guò)介紹Mycat七大核心概念:用戶(hù)、邏輯庫(kù)、邏輯表、數(shù)據(jù)節(jié)點(diǎn)、數(shù)據(jù)主機(jī)集群、分片規(guī)則、分片函數(shù),以及對(duì)應(yīng)的三個(gè)配置文件:Server.xml、Schema.xml 和Rule.xml文件是如何幫助應(yīng)用程序使用好Mycat中間件的。

 

責(zé)任編輯:武曉燕 來(lái)源: 石杉的架構(gòu)筆記
相關(guān)推薦

2024-01-24 08:19:02

Stream應(yīng)用場(chǎng)景注解

2021-12-14 10:39:12

中間件ActiveMQRabbitMQ

2021-06-15 10:01:02

應(yīng)用系統(tǒng)軟件

2019-12-13 10:32:56

開(kāi)源消息中間件

2017-07-26 09:41:28

MyCATSQLMongoDB

2022-11-18 07:54:02

Go中間件項(xiàng)目

2011-10-28 09:20:36

dorado

2017-07-18 17:35:16

數(shù)據(jù)庫(kù)MyCATPreparedSta

2022-10-25 08:01:17

洋蔥模型Koa

2021-02-11 08:21:02

中間件開(kāi)發(fā)CRUD

2011-05-24 15:10:48

2011-12-15 01:10:03

ibmdw

2018-07-29 12:27:30

云中間件云計(jì)算API

2018-02-01 10:19:22

中間件服務(wù)器系統(tǒng)

2016-11-11 21:00:46

中間件

2011-05-26 17:19:05

中間件

2017-07-18 17:07:40

數(shù)據(jù)庫(kù) MyCATJoin

2022-04-11 09:15:44

中間件開(kāi)源

2023-06-29 10:10:06

Rocket MQ消息中間件

2023-10-24 07:50:18

消息中間件MQ
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)