TiDB:支援MySQL協議的分散式資料庫解決方案
【編者按】TiDB 是國內 PingCAP 團隊開發的一個分散式 SQL 資料庫。其靈感來自於 Google 的 F1,TiDB 支援包括傳統 RDBMS 和 NoSQL 的特性。在國內ITOM 管理平臺OneAPM 舉辦的技術公開課中,TiDB的高階工程師劉奇從HBase特性、TiDB的優勢和系統架構等方面進行了詳細闡述。以下為演講整理:
HBase簡介
眾所周知,在SQL方面處於頂級的有兩個公司,一個是Oracle,他們已經積累了大量的經驗,另一個是谷歌,谷歌 F1在2012年釋出了一篇論文,個人認為它是全球最優秀的SQL OLTP資料庫。
1978年左右,資料庫剛剛發展時出現了SQL RDBMS。2000年左右,國內開始流行網際網路,網際網路對Oracle資料庫也產生較大的衝擊。現在,傳統的資料庫大部分是集中在傳統領域,網際網路方面用得比較多的是MySQL,其次HBase等 NoSQL 也吸引了大量的使用者。
為什麼會出現NoSQL?最開始所有人都用SQL Database,那時比較高階有Oracle,開源的還有MySQL、PostgreSQL。可是隨著業務的迅速發展,資料庫成為了瓶頸,於是促使了NoSQL的誕生,NoSQL將Scale放在第一位。如果業務快速發展,擴容會成為亟待解決的首要問題。這時,大多數人會選擇放棄事務一致性。什麼是一致性?比如使用微信時,如果我加你為好友,這是一個雙向關係,對應到資料庫中至少是兩個操作,第一是在好友列表裡把你加進來,第二個是你的好友列表裡把我加進去。如果這兩個列表的資料庫放在不同的機器上,就需要保證一致性。否則可能會出現我是你的好友,但你的好友中卻找不到我的這種情況。但這中間可能會出現多種情況,比如我把你加為好友,然後修改資料的時候Crush掉了,這個時候傳統方案是會引入一個訊息佇列,有的還需要做一些補償,這些問題在NoSQL裡處理起來相對麻煩。
國內最大的HBase使用者是小米公司,有幾個HBase的Committer,所以經過一些修改後可以支援分散式事務,於是能夠解決之前的問題。為什麼在面臨諸多選擇時,小米會選擇HBase呢?就目前情況來說,主要還是技術選型和人才儲備上的考慮。MongoDB大家應該不陌生,但用到一定程度後,總會出現各種問題,甚至有文章呼籲大家放棄MongoDB。但所有資料庫都不是“十全十美”的,沒有最好,選擇最適合的尤為重要。
很多時候產品都有其特性,在滿足其特性或者規格的情況下,使用起來可能非常順手,否則十之八九都遇到各種麻煩。比如小米使用HBase就非常順手,但其他的公司則不一定。道理很簡單,如果不熟悉其使用場景,也不知道在相應場景下配什麼引數,所以會出現各種各樣的問題。
事實上,HBase有非常好的特性,目前在小米公司可以每秒跑一百萬OPS,最近Pinterest公佈他們的HBase每秒可以跑三百萬個OPS,這個數量級可以遠超很多網際網路公司。HBase在讀寫一致性方面非常出色,有很好的自動Scale的能力,通過Block Cache和Bloom Filters可以很好的解決查詢問題,是否在磁碟上也可以通過Bloom Filters來判定。
另一方面,Oracle把一部分邏輯會放在CPU/硬體裡,對應的HBase也會把一部分邏輯下推到對應的RegionServer 上。對於一個分佈系統來說,如果需要查詢一個條件,可以直接把這個簡單調節推到對應的RegionServer上執行。再比如求和運算,現在有一百億資料,甚至一千億條資料,分佈在10個節點上,最快的求和方法是讓所有節點同時運算,將這個條件下推得到所有對應資料的和,最後收集到10個數據的和即可。其實還可以繼續往下推,這是比較複雜的資料庫優化技術,實際情況還會更復雜。這在 HBase 裡面依賴 Coprocessor 來實現。
大家應該對MVCC比較熟悉,也就是多版本,它的優點在於可以多次讀取而不會block。然後還有一個很好的特性,假設你用的Database,MVCC在你沒有做compaction之前可以回到任何時間的資料。現在雲服務上也可以每隔半小時做一次快照,實際上如果使用MVCC回到任意一秒的話,可以完全不需要快照。
TiDB的優勢
下面再介紹一下我們的產品 TiDB,Ti是元素週期表裡的元素。大家如果瞭解我們團隊的程式設計師,就知道他們都比較 Geek,取名字要麼在希臘神話裡選一個神的名字,或者在數學裡找一個希臘字母, 但是看了一圈,好坑都已經被占上了。於是,我們在化學元素週期表裡找了一個金屬作為專案名稱,對於Database而言,它必須是高速穩定的,剛好鈦金屬有很強的防腐蝕性,所以選擇了鈦(Ti)。
因為TiDB的目標是谷歌F1,所以自然會滿足以上特性。首先是可以滿足分散式一致,也就是說對於應用來說,不用關心後面分成多少個機器,事務的一致性是必須保證的,比如我們之前提到的A關注B,兩個互相加好友或者轉帳,可以直接利用一條SQL搞定,而無需擔心中間過程。另外一個特性是相容MySQL協議,國內大概有70% 的網際網路公司都在使用MySQL,為了考慮大家的遷移成本,我們會相容MySQL協議。同時,由於已經很多APP在MySQL上執行,為我們提供了充足的測試樣本。TiDB的測試有五百多萬個,每次提交一行程式碼時,後面大概有6個機器並行地跑Test,五百多萬Test所需時間大約是十分鐘。為了照顧各種引擎愛好者,我們還支援了LevelDB 、RocksDB、LMDB、BoltDB等。TiDB主要是採用 Go 語言開發的,其程式碼簡單、易於理解,而且效能非常高。
系統架構
任何用MySQL協議寫的程式都可以直接使用TiDB,其中間是MySQL協議相關的內容,再往下是SQL Layer。其次是事務KV層,這正是F1和Spanner構造得最為精密的地方。最底層的構造是從KV開始,在KV基礎上架一個分散式的KV層用於支援事務,然後再讓SQL語句直接對映到KV層上。
接下來,向大家介紹 現階段 TiDB 使用的分散式事務是如何在HBase上實現的,早期版本中,我們參考的是 Google 的 Percolator 的模型。首先假設有一個Client,先為其分配一個 Timestamp,在Google論文中叫做Time Oracle,用來分配時間戳。分配之後可以做讀寫操作,根據時間戳進行快照讀。最後提交之前要先Prepare,Prepare的時候會檢測是否衝突,最後提交時會得到Commit,如果整個過程沒有任何衝突就可以提交。
上圖代表了一個例項,最初帳戶情況是Bob有10美金,而Joe有5美金。前面的數字代表其版本,當前是第6個版本,指向的是第5個版本,為10美金,Joe是2美金。
假設Bob要轉4美金給Joe。第一步,要先轉出去4美金,10美金變成6美金,由於被扣掉4美金,然後會標註一下自己是主鎖。
Joe當前是第7個版本,因為他得到了4美金,所以餘額變成了6美金,同時標記自己指向另外一個主鎖Bob。
到第八個版本時,主鎖會指向現在的7,這時可以把主鎖刪掉。如果訪問的時候發現主鎖被刪除,那麼主鎖衝突已不存在,可以進行提交。同時,它會把自己的鎖刪掉,中間還有一些其它的清理過程。
整個事務模型中會有單點,從Time Oracle分配一個時間戳,單點決定了整個系統的效能。Google論文裡有一個對應描述,可以跑到兩百萬每秒。因為事務開始和結束的時候都需要取一個Timestamp,所以他們最快讀寫事務的速度是一百萬每秒,他們已經在論文中實現。實際上,現在有更好的方式可以提高速度,如HLC和一些Time Oracle的改進演算法。
關於Spanner,我們重點參考物件是谷歌Spanner和F1。由於Spanner高度依賴於時鐘,所以谷歌有一套原子鐘和GPS時鐘,GPS訊號可以給出地理位置和時間。為什麼需要原子鐘呢?由於GPS時鐘特別容易受到干擾,比如天氣惡劣時GPS時鐘就不能執行,而原子鐘仍然適用。
上圖是谷歌F1的一些資訊,其中單獨標記了谷歌F1的這篇論文,大家有興趣的話不妨細讀一番,目前整個TiDB所做的都是在實現這篇論文。假設有一千億資料,你現在要給某一列加索引時,在傳統資料庫上應該如何操作?比如說在分散式環境下,你用MySQL給一列新增一個索引,這幾乎很難實現,而且還必須保證index的一致性。更多細節請參考論文。
TiDB是如何從SQL遷移到KV上的呢?由基礎知識可知,傳統的 RDBMS資料庫底下一般是一個B-Tree。對於分散式關係型資料庫,站在更上層一點看,比如谷歌的F1,資料庫底層都是KV層,都在KV層邏輯下操作。如果有一個User Table,在TiDB裡假設你的Table的結構是由uid、name和email構成。在TiDB裡有一個隱藏列叫做RowID,所有的操作包括行鎖都是鎖的RowID。假設RowID是1,uid是XX,Name是Bob,Email是[email protected],這都屬於元資訊。即便你的Column name很長,但最後在資料庫裡儲存的是原資訊。在TiDB中, 每一列都有唯一的UID。
假設Table的ID是1,uid的 ID 是2,name的ID是3,email的ID是4。在資料庫中儲存為一個KV結構,然後對TableID、RowID 、ColumnID進行重新編碼,直接將這個表的一行切成4個KV。這時候如果進行select,Email等於某一個值的話,於是可以直接取出來相應的值,速度非常快。
相容MySQL
TiDB對MySQL協議有很好的相容性。有一些比較知名的MySQL應用和管理工具,比如WordPress、PhpMyAdmin, MySQL Workbench,都可以直接基於TiDB執行。而且資料可以無限擴充套件,不再是單機資料庫。其次,TiDB還相容各種ORM,比如XORM、Beego ORM等,能夠支援很多MySQL的應用。每一次程式碼更新,這些ORM Test會自動執行一次,從而保證與MySQL的相容性,雖然還有一些比較細微的特性暫時沒有支援。現在已經支援非同步的 Schema 變更,對於 DDL 操作,不會阻塞線上的業務。
關於社群
目前 TiDB 完全開源在Github上面。開源和開放的概念是兩回事,很多大公司,所謂的開源只是把程式碼上傳一下,國內比較知名的案例也挺多的,大家知道很多專案都已經放棄了維護。但是我們是打算完全以一個開放的心態來做整個事情,全部的程式碼,全部的討論, Code Review,Bug Tracking,Roadmap 都是開源的,畢竟通用的分散式 OLTP 關係型資料庫是一個非常前沿而且極端重要的領域,未來是雲上的 DBaaS 的重要組成部分,但是在這塊目前整個技術社群,即使全球來看都沒有一個太成熟開源解決方案,TiDB也目前也處於早期,從架構上來看,我們將 SQL 層和 KV 層做了很徹底的分離,這也是我們希望更多開發者能根據自己的需要更方便的進行定製,我們也想得很清楚,依靠某一家公司,或者某幾個人的力量是不夠的,我們 PingCAP 只是將這一把火點起來,將框架搭好,制定好透明和公平的規則,吸引更多的合作公司和獨立開發者,一起將 TiDB 做成中國第一個世界頂級的開源專案,實現共贏。
好的專案可以由社群進行推動,就比如HBase,HBase不屬於任何一個公司,但是社群一直推動它進步。目前我們在GitHub狀態是有3200+的Star,有32個Contributors,算是開了一個好頭,非常感謝大家,希望大家都能參與進來。
相關推薦
TiDB:支援MySQL協議的分散式資料庫解決方案
【編者按】TiDB 是國內 PingCAP 團隊開發的一個分散式 SQL 資料庫。其靈感來自於 Google 的 F1,TiDB 支援包括傳統 RDBMS 和 NoSQL 的特性。在國內ITOM 管理平臺OneAPM 舉辦的技術公開課中,TiDB的高階工程師劉奇從HBas
Informatica支援 MySQL Community 版本的解決方案
Informatica Power Center 是一個 ETL 工具,提供強大的資料整合軟體和服務,一般用於大資料的抽取、轉換、載入,常應用於資料倉庫、BI 等領域,並支援各種主流的資料來源,如 Oracle、SQL Server、SaleForce、MySQL 等。本文主
MYSQL讀寫分離解決方案:MariaDB MaxScale部署實錄
maxscaleMASTER(KING01)[root@king01 ~]# mysql -uroot -pabcd.1234 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 173 S
MYSQL讀寫分離解決方案:MYCAT部署實錄
mysql mycat 讀寫分離 MASTER (KING01)[root@king01 ~]# mysql -uroot -pabcd.1234 mysql> show master status; +------------------+----------+--------------
更多免費初級中級高階大資料java視訊教程下載 加(微***信((號keepper,請備註java或掃下面2二3維4碼第31: 2017年7月最新微服務架構的分散式事務解決方案價值1399
更多免費初級中級高階大資料java視訊教程下載 加(微***信((號keepper,請備註java或掃下面2二3維4碼第31: 2017年7月最新微服務架構的分散式事務解決方案價值1399java視訊教程01 課程介紹.wmvjava視訊教程02 解決方案的效果演示(結合支付系統真實應用場景).mp4java
mysql服務無法啟動,workbench 連線不到本地資料庫-解決方案
軟體複用課上需要用到mysql,結果開啟workbench顯示no connection,開啟控制面板啟動此服務也沒用,顯示mysql啟動後停止。。。。。百度了很多種方案,終於解決,以下是我的解決方案: 1.找到安裝mysql的資料夾,我的是:D:\MySQL\
黃東旭:“Cloud-Native與分散式資料庫” – 運維派
由工業和資訊化部指導,中國資訊通訊研究院主辦,業界知名組織雲端計算開源產業聯盟(OSCAR)承辦的2017全球雲端計算開源大會於4月19日-20日在北京國家會議中心順利召開。本文為本屆大會嘉賓分享的大會演講速記內容,敬請瀏覽。 嘉賓介紹:黃東旭 公司職務:PingCAP CTO 大會演講速記
搞懂分散式技術11:分散式session解決方案與一致性hash
session一致性架構設計實踐 原創: 58沈劍 架構師之路 2017-05-18 一、緣起 什麼是session? 伺服器為每個使用者建立一個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同一個上下文。 Web開發中,web-server可以自動為同
.NET Core 事件匯流排,分散式事務解決方案:CAP
背景 相信前面幾篇關於微服務的文章也介紹了那麼多了,在構建微服務的過程中確實需要這麼一個東西,即便不是在構建微服務,那麼在構建分散式應用的過程中也會遇到分散式事務的問題,那麼 CAP 就是在這樣的背景下誕生的。 最初打算做這個東西是在去年(2016)年底,最初是為了解決分散式系統中的分散式事務的問題,然後當時
SQLyog 報錯2058 :連線 mysql 8.0.11 解決方法
今天閒來無事,下載新版的 mysql 8.0.11 安裝。為了方便安裝檢視,我下載了sqlyog 工具 連線 mysql配置新連線報錯:錯誤號碼 2058,分析是 mysql 密碼加密方法變了。解決方法:windows 下cmd 登入 mysql -u root -p 登入你
Socket.IO:支援WebSocket協議、用於實時通訊和跨平臺的框架
WebSocket是HTML5的一種新通訊協議,它實現了瀏覽器與伺服器之間的雙向通訊。而Socket.IO是一個完全由JavaScript實現、基於Node.js、支援WebSocket的協議用於實時通訊、跨平臺的開源框架,它包括了客戶端的JavaScript和伺服器端的
實現div的背景圖片在各個瀏覽器上自適應顯示:即backgroun-size屬性不支援低版本ie的解決方案
筆者在進行div下的背景圖片顯示時,發現一個問題:圖片在div中自適應 background-size:cover顯示時,使用backgroun-size屬性可以很好的在其它瀏覽器上顯示,但低於IE8的瀏覽器不支援!!比較鬱悶的搞了大半天,先把解決方案陳列如下:
曹工雜談:分散式事務解決方案之基於本地訊息表實現最終一致性
# 曹工雜談:分散式事務解決方案之基於本地訊息表實現最終一致性 # 前言 為什麼寫這個?其實我這邊的業務場景,嚴格來說,不算是典型的分散式事務,需求是這樣說的:因為我這邊負責的一個服務消費者consumer,是使用者登入的入口;正常情況下,登入時候要走使用者中心,這是個單獨的服務;如果使用者中心掛了,我這
SQL Server On Linux:基於實際專案案例,總結功能支援情況及相關問題解決方案,講如何快速完成遷移
上個月,有個朋友問我說Sql Sever向Mysql遷移有什麼好的經驗分享,他們公司客戶明確提出不再提供Windows伺服器,現在計劃Mysql遷移。我說Mysql遷移成本太高了,不妨可以瞭解一下SQL Server On Linux再做決定。於是,我把之前給運維分享的Word文件發給了他,告訴他,如果可
業余草 maven異常:Updating Maven Project 的統一解決方案
fonts nbsp illegal intern ring 工作空間 text 所在 ont 現在使用maven的公司和團隊越來越多,雖然沒有Gradle那麽靈活,但是現對於以前的項目構建方式還是很有優勢的,下面分享一個maven update 時的異常統一解決方案:
小內存linux啟動Kakfka報錯: commit_memory(0x00000000c0000000, 1073741824, 0) failed ..解決方案
bin server spa opts 內存配置 內存 默認 xms start 報錯原因: Kafka默認使用的JVM內存配置: export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" 如果服務
第一篇:安裝Android Studio問題及其解決方案
.com 及其 pla try onf posit blog chmod 提示 ubuntu18.04配置android studio3.2.1環境 1.JDK安裝與配置:https://www.cnblogs.com/yuanbo123/p/5819564.html(按照
下拉菜單:‘點擊外面關閉’的解決方案
下拉菜單 bsp urn ret top 解決方案 .html list medium 一般遇到這種問題網上的說法都是: 給點擊開啟下拉菜單的Dom元素方法中添加 e.stopPropagation() 阻止事件冒泡 再給document添加一個監聽點擊的事件: docum
Android手機上瀏覽器不支援帶埠號wss解決方案
首先抄個示例過來,命名為wss-test.html,然後傳到伺服器: <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html"
[轉載]使用訊息佇列實現分散式事務-公認較為理想的分散式事務解決方案
前陣子從支付寶轉賬1萬塊錢到餘額寶,這是日常生活的一件普通小事,但作為網際網路研發人員的職業病,我就思考支付寶扣除1萬之後,如果系統掛掉怎麼辦,這時餘額寶賬戶並沒有增加1萬,資料就會出現不一致狀況了。 上述場景在各個型別的系統中都能找到相似影子,比如在電商系統中,當有使用者下單後,除了在訂單表插