mysql 讀寫引擎_揭秘MySQL存儲引擎spider

轉自:興趣部落?buluo.qq.com

導讀: Spider是為MySQL/MariaDB開發的一個特殊引擎,具有內嵌分片功能。現在它已經被集成到MariaDB10.0及以上版本中,作為MariaDB的一個新的主要性。Spider的主要功能是將數據分散到多個后端節點,它的作用類似于一個代理。

1. 表鏈接

Spider的表鏈接的技術參考ISO/IEC 9075-9:2008 SQL/MED標準。利用spider的這個特性,你可以像操作本地MariaDB實例的表一樣來操作遠程MariaDB實例上的表,也可以像操作本地MariaDB實例的表一樣來操作分布在多個MariaDB實例上的表。當創建一個spider存儲引擎的表時,該表指向遠程服務器上對應的一張表或者多個實例上的表,就像UNIX/Linux中的軟鏈接一樣。遠程服務器上的表可以是任何存儲引擎的表。

在執行CREATE TABLE命令創建spider引擎的表時,需要添加COMMENT或CONNECTION語法來指定遠程服務器的地址等信息。例如,在遠程服務器(該服務器是數據節點,假設IP為192.168.0.1)上創建了如下一張表:

spider節點創建一張表指向該表:

spider節點,表字段定義可以忽略。Spider第一次訪問表的時候,如果發現沒有表字段定義,會從后端節點拉取相關元數據,然后緩存在本地。

Spider的系統表spider_tables記錄了各個數據分片的位置信息,類似于編程語言中指針作用。該系統表可以便利spider跨節點的join操作:訪問數據所在的機器,然后把數據拉取到本地進行join操作;如果進行join操作字段不是分片字段,那么需要廣播SQL語句將數據拉取到spider節點進行join操作。Spider_tables類似圖1所示。

圖1. Spider表鏈接

2.事務

Spider分別針對單機事務與XA事務實現了相應的操作事務的方法。圖2列出了部分實現的方法。

圖2. Spider部分實現的事務接口

Spider參照分布式事務DTP/XA模型實現了分布式XA事務(見圖3)。在這個模型中,存在RM(Resource Manager,資源管理器)、TM(Transaction Manager, 事務管理器)以及AP(Application, 應用程序)三種角色。AP通過RM API來操作和管理資源,通過TM接口開啟/終止/結束事務。RM與TM之間需要實現XA接口。XA接口定義了兩階段提交的必要步驟,以及RM與TM之間需要進行的交互。Spider扮演的是TM角色,而后端的數據節點扮演的是RM的角色。

圖3. 分布式DTP/XA模型

為了使用分布式XA事務,業界定義的XA命令如下:

Spider會在系統表spider_xa中記錄XA事務的狀態,同時在另外一張系統表 spider_xa_members 中記錄參與該XA事務的節點,以便進行操作。在spider中,XA事務分別有四種狀態,如圖4所示,對應于NOT YET, PREPAED, ROLLBACK 以及 COMMITTED。 Spider在開始PREPARE階段之際會在系統表 spider_xa中標記該XA事務的狀態為NOT YET。在所有數據節點都接收到PREPARE消息以后, 該 XA事務的狀態進入到PREPARED階段。假如在PREPARE階段,某一個數據節點發生故障,那么spider會回滾該事務。相應地,事務的狀態變成ROLLBACK。最后,如果所有參與事務的節點都返回PREPARE OK,該事務進入提交階段。圖5給出了對應上述命令的每一個步驟,spider向后端節點發送的消息。

圖4. Spider XA事務狀態轉換

圖5. 執行XA事務,Spider與后端節點的交互

從圖5可以看到spider向后端節點發送XA START命令的時候會設置會話級別的事務特性,同時將XA事務ID發送到后端節點。因為XA事務ID由三部分組成,spider會 將這三個部分的解析出來,然后拼接成對應的字符串發送到后端節點。為了節省網絡開銷,Spider將XA END與XA PREPARE命令合并起來一起發送。也就是在這個 階段初始,spider在系統表里面記錄事務的狀態。如果所有的RM都返回OK,那么spider進入PREPARED 狀態,準備提交事務。否則,事務進入到回滾狀態。

3.插撥式引擎

MySQL最強大的功能之一以及區別于其他關系型數據庫系統的一個主要的特色是不同的表能夠采用不同的存儲引擎。每一個存儲引擎都有其優缺點,用戶能夠根據自己的需要定制MySQL的存儲引擎。存儲引擎能夠控制在哪里以及如何存放、獲取數據。它代表了下面物理層提供的抽象邏輯接口,也是數據庫執行實際I/O操作的地方。這是一個組件體系結構。在這個結構中,handler類定義了存儲引擎提供的接口和功能。因為所有的存儲引擎從基類handler繼承而來,所以它們能夠提供相同的功能。總的來說,handler類和handlerton結構在整個體系結構中扮演了中間層的角色。你所編寫的存儲引擎只有滿足了handler的要求后,才能順利插入到運行的MySQL服務器中。所有的網絡連接、安全認證、解析和優化由MySQL服務器本身完成,與存儲引擎無關。

Spider作為MySQL的一個可插拔引擎,實現了handler類定義的相應的存取方法。Spider本身并不存放數據,而是類似一個代理的功能將訪問請求路由到后端的數據節點。Spider提供了兩種途徑訪問后端節點存儲的數據。如圖6所示,spider可以遵循MySQL傳統的查詢處理流程來訪問數據,也開發了自有的一套來加速數據訪問。在傳統的查詢處理方式下,SQL查詢請求經過查詢解析、查詢重寫、查詢優化等步驟。按照生成的查詢執行計劃,spider從后端節點拉取數據,交給MySQL服務器處理。Spider在這種查詢處理框架之下的一個缺點是不能很好地利用后端節點可并行化特性,同時需要對SQL查詢進行兩次解析,帶來的性能損耗問題比較嚴重。在我們的測試中,性能損耗約50%左右。基于這個原因,為了加速聚集、統計等查詢,spider開發團隊提供了DirectSQL方式執行查詢。DirectSQL的原理類似于Map Reduce方案,將查詢直接下發到后端節點,無需在MySQL服務器層進行解析(Map階段);后端節點將結果返回給spider,由spider合并結果集。(Reduce階段)。這個方式很好地利用后端節點可并行處理查詢的特點,消除重復解析SQL語句的行為。

圖6. MySQL體系下的spider

上面已經談到,spider本身并不存儲數據,因此需要將數據訪問請求轉換成其它方式,例如Handler、Handler Socket以及SQL方式。前面兩種訪問方式更像是一種NoSQL的數據訪問方式,允許查詢繞過SQL layer層。Spider允許后端的數據節點可以是不同的數據庫系統,通過2PC保證事務提交的原子性。

4.讀寫流程

為了更清楚地了解spider的讀寫流程,我們有必要研究一下數據庫系統的查詢執行模型以及MySQL的插拔式引擎如何跟這個模型對接的。數據庫系統基本都采用迭代器模型處理查詢,也叫volcano查詢執行引擎(發明這個詞的學者大概是因為查詢執行計劃樹看起來像一座火山,如圖7)。執行計劃樹的上層節點通過get_next方法驅動子節點獲取一條元組,子節點遞歸調用。在葉子節點也就是基本表將數據返回。這個模型的一個好處就是實現起來很優雅,同時數據流與控制流結合在一起方便程序的調試。這個模型的缺點是函數的大量調用使得進程/線程上下文切換頻繁,程序的局部性受到損害。因此,后來針對OLAP場景,采用了向量查詢執行模型來減少進程上下文的切換以及保證保證高速緩存的命中率。再次以圖7為例子,圖中的SQL語句的功能是查詢一個部門的平均薪資。假如在職工表EMP的員工ID字段Dno上存在索引,MySQL在Server層針對該查詢語句生成的查詢計劃如下:順序掃描部門表,通過索引訪問職工表,然后在兩表join操作之后進行投影操作。下一個階段為分組排序操作。上層的操作算子(例如join),驅動子節點調用get_next方法(表掃描方法)獲取一條元組。底層操作算子(表訪問方法,handler接口定義)將數據返回。至此,我們可以總結一下MySQL體系的工作原理:查詢執行計劃由MySQL server層生成,存儲引擎受執行計劃驅動而訪問表。MySQL的handler已經定義好表的訪問方法,實現了這些訪問方法的存儲引擎就可以作為MySQL的插件式引擎而存在。

下面我們對spider的讀寫流程結合server層代碼進行分析。

圖7. 查詢計劃樹示例

4.1 SELECT操作

上面提到spider的作用類似一個proxy,本身并不存儲數據。因此spider處理SELECT語句(UPDATE與DELETE類似)首先需要根據查詢解析的信息生成一個SELECT語句,發送到查詢涉及的后端節點,將數據從遠端拉到本地,然后進行處理。函數spider_db_append_select_columns根據查詢涉及的讀集以及寫集獲取相應的字段,構造一個SQL語句從后端節點拉取數據到本地。如果涉及多個分片, spider將從不同實例獲取過來的結果集存放在不同的結果集spider_db_result中。類spider_db_fetch 提供了fetch_next, current_row等方法供上層方法調用。Server層調用get_next方法驅動引擎層獲取下一條數據。對于表訪問方法,MySQL 實現了索引掃描(ha_index_read)與隨機訪問(ha_rnd_next)的方法。對于切分為多個分片的DB,索引掃描需要借助優先隊列。索引掃描需要區分是否是第一次調用該方法。如果是第一次調用該方法,需要遍歷所有的分片讀取一條記錄,然后插入到優先隊列。對應到spider,如果第一次調用訪問遠端實例表的方法,需要生成SELECT語句,將遠端實例的數據拉到本地存放。在使用索引掃描的情況,MySQL 為每個分片保留一個key buffer以及record buffer。server利用隊列頭部的m_top_entry 獲得訪問的分片ID。接著,調用get_next方法獲取相應的元組,將返回的數據存放在record buffer,并插入到優先隊列。函數最后將元組從優先隊列返回。為緩解內存等資源的壓力,spider實現全表掃描的方法是逐個分片串行掃描(為了加速,spider也提供了并行掃描數據節點的選項)。圖8給出了spider對于上述兩種表訪問方法的實現機制。

圖8-1.索引掃描實現

圖8-2. 全表掃描

4.2 INSERT操作

MySQL的handler類對于INSERT操作提供的接口函數的名字是write_row。存儲引擎想要支持INSERT操作就必須實現write_row方法。Spider對于write_row方法的實現是簡單地根據查詢解析的信息拼接一條INSERT語句,發往后端節點處理。如果是批量插入操作則需要與MySQL Server層配合,將INSERT語句批量發到后端節點。圖9結合一條批量插入的INSERT語句給出MySQL中INSERT操作的具體實現。mysql_insert調用write_row執行具體的插入操作(第8行)。這是存儲引擎必須實現的方法。對應于spider,spider根據查詢涉及到的列(field)拼成一條INSERT語句(如果是分片數據庫,VALUSE中的列必須包含分區鍵,分區鍵是自增列的情況除外)。圖8中的QUERY將用戶ID(ID)和用戶名(Name)插入到user表,其中ID是分區鍵。mysql_insert根據VALUES包含的元組數目,判斷是否需要進行批量插入操作。該例子的QUERY的VALUES包含4條元組,所有需要進行批量插入操作。MySQL循環調用write_row方法觸發spider生成INSERT語句。Spider的write_row方法實現中會根據分區鍵將INSERT語句進行分組(第5行~第9行)。圖8給出的實例只有兩個數據分片,所以SQL語句被分成兩組。處理完VALUES以后,spider的INSERT語句也拼接完成。ha_end_bulk_insert方法通知spider完成VALUES處理。此時,spider將INSERT發送到后端節點進行處理(第11行)。

圖9. spider中INSERT操作的實現

4.3 DELETE實現

Spider想要支持DELETE操作必須實現MySQL handler類提供的ha_delete_row方法。與INSERT操作不同,DELETE操作需要生成一條SELECT語句將查詢涉及的分區鍵拉到spider節點。這是因為MySQL Server層的“once-a-tuple”的查詢執行模型(實際上基本所有的關系數據庫系統都采用該模型)會驅動spider逐個拼接DELETE語句,然后發往后端節點。這時候,spider需要知道對應的DELETE語句該往哪個后端節點發送。為了減少網絡開銷,spider提供了批量發送DELETE語句的功能。

圖10給出了spider中delete的實現。MySQL server層首先確定表的訪問方法:采用索引掃描或者全部掃描(第5行)。DELETE方法需要執行一次查找操作,調用get_next方法(info.read_record)獲取一條元組(第10行)。Spider需要判斷是否第一次調用get_next方法。如果是的話,則需要生成SELECT語句,將數據節點的數據拉到本地。否則,spider直接從本地返回數據給上層調用者。接下來,server層調用ha_delete_row方法將數據刪除。這是存儲引擎需要具體實現的方法。由于Spider本身并不存儲數據的緣故,其實現delete操作的主要思想是利用從后端節點拉取過來的數據(分區鍵,過濾條件等),拼接成一條DELETE語句。然后,發送該請求到數據節點。Spider為了優化網絡開銷,提供了批量發送DELETE語句的選項。

UPDATE操作的實現類似DELETE,都需要spider生成SELECT語句從后端節點拉取數據。只不過,UPDATE在更新區分鍵的時候,可能需要多一次DELETE操作(刪除原來分區的數據,將新的數據插入到不同的分區)。

圖10. DELETE實現

5.總結

Spider的最大亮點是為MySQL的使用者提供分庫分表的中間件解決方案,同時在SQL語法上兼容MySQL。這得益于spider作為MySQL的插拔式引擎而存在。 Spider 是一個proxy,其本身并沒有存儲數據,因此上層的讀寫表請求需要轉換成SQL語句,重新路由到后端的數據節點。相比其它的中間件解決方案,spider的查詢解析次數都是兩次,并沒有過多開銷。此外,spider還針對聚集、排序等操作提供了MAP REDUCE的解決方案。總而言之,從兼容性、性能上衡量,spider是MySQL分庫分表的一個不錯的選項。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383031.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中的與或非_「Python基礎」 While 循環語句

Python 編程中 while 語句用于循環執行程序,即在某條件下,循環執行某段程序,以處理需要重復處理的相同任務。其基本形式為:while 判斷條件:執行語句……執行語句可以是單個語句或語句塊。判斷條件可以是任何表達式&…

lamp mysql大小限制_LAMP 調優之:MySQL 服務器調優

關于 MySQL 調優有 3 種方法可以加快 MySQL 服務器的運行速度,效率從低到高依次為:替換有問題的硬件。對 MySQL 進程的設置進行調優。對查詢進行優化。替換有問題的硬件通常是我們的第一考慮,主要原因是數據庫會占用大量資源。不過這種解決方…

go定時器 每天重復_Go語言學習基礎-定時器、計時器

Timer計時器如果希望在將來的某個時間點執行Go代碼,或者在某個時間間隔重復執行Go代碼,使用Go內置的timer和ticker功能。先看定時器timer,然后再看計時器ticker。定時器代表未來的單個事件。告訴定時器需要等待多長時間,它返回一個…

html類名定義規則_HTML入門筆記1

HTML 是誰發明的?Tim Berners-LeeHTML起手式&#xff1a;HTML起手式 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

mysql主從虛擬機_虛擬機centos7Mysql實現主從配置

環境搭建在虛擬機上和創建兩個一模一樣的centos7系統&#xff0c;并安裝相同版本的mysql(可以先創建一個再克隆)在master上操作登錄mysqlmysql -u root -p使用mysqluse mysql;創建用戶CREATE USER lystbc1% IDENTIFIED BY Lys135426tbc;給用戶授權GRANT REPLICATION SLAVE ON *…

怎樣檢測mysql5.5安裝成功_64位wiN7系統中裝配MySQL5.5.17(測試安裝成功哦!)

64位wiN7系統中安裝mysql5.5.17(測試安裝成功哦&#xff01;&#xff01;~~)下載地址&#xff1a;[url] http://www.mysql.com/downloads/mysql/[/url]下載的話需要登錄,你只需按照要求注冊一個賬號,然后下載即可.我下載的是mysql-5.5.17-winx64.msi版本.安裝步驟:Step 1. Mysq…

xcode 創建模擬器_Xcode編譯WebKit

下載WebKit源碼1)進入https://webkit.org/2)點擊頁面的 Get Started 進入新頁面&#xff0c;如下圖所示3)點擊 Getting the code 進入新頁面&#xff0c;如下圖所示4)在源碼下載頁面&#xff0c;有多種下載方式&#xff0c;包括直接下載代碼zip包&#xff0c;通過SVN下載&#…

mysql iscsi_iscsi共享存儲的簡單配置和應用

1、環境介紹SCSI(Small Computer System Interface)是塊數據傳輸協議&#xff0c;在存儲行業廣泛應用&#xff0c;是存儲設備最基本的標準協議。從根本上說&#xff0c;iSCSI協議是一種利用IP網絡來傳輸潛伏時間短的SCSI數據塊的方法&#xff0c;ISCSI使用以太網協議傳送SCSI命…

request mysql 接口_TP5接口開發

開啟debug調試模式(正式上線建議關閉)config.php// 應用調試模式app_debug > true,設置輸出類型index.phpnamespace app\index\controller;class Index{public function index(){$data [name > steven, age > 24];return json([code > 0, msg > 操作成功, data…

django和mysql寫注冊_Django電商項目---完成注冊頁面和用戶登錄

完成基本的創建項目、用戶注冊、登錄、注銷功能創建Django項目,創建df_user的App創建靜態文件夾static(跟manage.py保持在同一級別下)復制靜態文件(css images js)到static路徑下修改settings.py文件修改templates路徑修改數據庫新添加靜態文件加載路徑Pycharm連接mysql數據庫…

命令行進入指定目錄_VIM學習筆記 操作目錄(Manipulate Directory)

在目錄間移動使用以下命令&#xff0c;可以顯示當前所在的目錄&#xff1a;:pwd使用以下命令&#xff0c;在Linux下可以進入HOME目錄&#xff0c;而在Windows下則顯示當前所在目錄&#xff1a;:cd使用以下命令&#xff0c;可以進入指定的目錄&#xff1a;:cd D:tepm使用以下命令…

mysql cluster雙機_GitHub - sophys/mysqlha: 博客“Mysql-cluster數據庫集群雙機HA研究”測試代碼...

mysqlha本代碼是基于博客Mysql-cluster數據庫集群雙機HA研究所寫的。測試采用的是32位環境&#xff0c;linux環境為debian&#xff0c;如果是其他系列只需修改部分指令即可。mysql-cluster版本位&#xff1a;mysql-cluster-gpl-7.2.7-linux2.6-i686.tar.gz&#xff0c;可自行去…

mysql gtid基礎_MySQL 基礎知識梳理學習(四)----GTID

在日常運維中&#xff0c;GTID帶來的最方便的作用就是搭建和維護主從復制。GTID的主從模式代替了MySQL早期版本中利用二進制日志文件的名稱和日志位置的做法&#xff0c;使用GTID使操作和維護都變得更加簡潔和可高。1.GTID的優點(1)基于GTID搭建主從復制根據簡單。(2)可以確保每…

k8s pod MySQL環境變量_Kubernetes 配置Pod和容器(一)定義容器環境變量

此頁展示了如何給運行在Kubernetes Pod中的容器定義環境變量。開始之前必須有一個Kubernets集群&#xff0c;和一個能和集群溝通的kubectl命令行工具。如果你還沒有集群&#xff0c;你可以用Minikube建立一個集群。給容器定義環境變量當你建立了一個Pod,你可以給你運行在Pod中的…

koa2 mysql 中間件_Koa2第二篇:中間件

第一篇介紹了生成器目錄設計。xyzcoding&#xff1a;Koa2第一篇&#xff1a;詳解生成器?zhuanlan.zhihu.com接下來學習Koa2的中間件。Koa2本身只能算一個極簡的HTTP服務器&#xff0c;自身不內置中間件&#xff0c;但是提供中間件內核。中間件是Koa2的核心&#xff0c;因此需要…

mysql命令行如何建庫_MySQL心得2--命令行方式建庫和表

1.創建使用create database或create schema命令可以創建數據庫。create database 庫名create database if not exists 庫名(創建庫并檢驗創建的庫是否存在&#xff0c;不存在則建&#xff0c;存在就不建了)MySQL不允許兩個數據庫使用相同的名字&#xff0c;使用ifnot exists從句…

python 少兒趣味編程下載_PYTHON少兒趣味編程

章認識Python11.1編程語言和Python11.1.1程序設計和編程語言11.1.2Python簡介21.2Python的安裝41.2.1Windows下的Python安裝41.2.2MAC下的Python安裝81.3個程序HelloWorld111.4開發工具IDLE121.4.1IDLE簡介121.4.2用IDLE編寫程序121.4.3IDLE的其他功能161.5小結18第2章變量、數…

rs485數據線接反_終于有人把RS485通訊的正確接線方式講明白了,網友:這下好辦了...

RS485是一個定義平衡數字多點系統中的驅動器和接收器的電氣特性的標準,該標準由電信行業協會和電子工業聯盟定義。使用該標準的數字通信網絡能在遠距離條件下以及電子噪聲大的環境下有效傳輸信號。RS485使得廉價本地網絡以及多支路通信鏈路的配置成為可能。那么RS485通訊的正確…

騎馬與砍殺python代碼_GitHub - yunwei1237/scottish-fold: 一個關于騎馬與砍殺的劇本制作工具...

scottish-fold一個關于騎馬與砍殺的劇本簡單快速的制作工具前言?在很久以前的時候&#xff0c;也就是剛開始玩騎砍的時候就想著能夠制作一個自己的劇本&#xff0c;用于書寫自己想要的故事。當我懷著遠大的夢想去這么做的時候才發現&#xff0c;原來制作劇本沒有自己想象的那么…

java tomcat 監控_java程序監控tomcat實現項目宕機自動重啟并發送郵件提醒

最近由于老項目頻繁掛掉&#xff0c;由于項目經過多批人之手&#xff0c;短時間難以定位問題&#xff0c;所以只好寫一個監控程序。 時間比較緊半天時間&#xff0c;而且水平有限大神勿噴&#xff0c;有好的方法還請賜教。 1、問題描述&#xff1a;分兩種情況1.1、tomcat 徹底掛…