TiDB 在小米的應用實踐

作者:張良,小米 DBA 負責人;潘友飛,小米 DBA;王必文,小米開發工程師。

一、應用場景介紹

MIUI 是小米公司旗下基于 Android 系統深度優化、定制、開發的第三方手機操作系統,也是小米的第一個產品。MIUI 在 Android 系統基礎上,針對中國用戶進行了深度定制,在此之上孕育出了一系列的應用,比如主題商店、小米音樂、應用商店、小米閱讀等。

圖 1 ?MIUI Android 系統界面圖

<center>圖 1 ?MIUI Android 系統界面圖</center>

目前 TiDB 主要應用在:

  • 小米手機桌面負一屏的快遞業務
  • 商業廣告交易平臺素材抽審平臺

這兩個業務場景每天讀寫量均達到上億級,上線之后,整個服務穩定運行;接下來我們計劃逐步上線更多的業務場景,小米閱讀目前正在積極的針對訂單系統做遷移測試。

二、TiDB 特點

TiDB 結合了傳統的 RDBMS 和 NoSQL 的最佳特性,兼容 MySQL 協議,支持無限的水平擴展,具備強一致性和高可用性。

具有如下的特性:

  • 高度兼容 MySQL,大多數情況下無需修改代碼即可從 MySQL 輕松遷移至 TiDB,即使已經分庫分表的 MySQL 集群亦可通過 TiDB 提供的遷移工具進行實時遷移。
  • 水平彈性擴展,通過簡單地增加新節點即可實現 TiDB 的水平擴展,按需擴展吞吐或存儲,輕松應對高并發、海量數據場景。
  • 分布式事務,TiDB 100% 支持標準的 ACID 事務。
  • 真正金融級高可用,相比于傳統主從(M-S)復制方案,基于 Raft 的多數派選舉協議可以提供金融級的 100% 數據強一致性保證,且在不丟失大多數副本的前提下,可以實現故障的自動恢復(auto-failover),無需人工介入。

TiDB 的架構及原理在 官網 里有詳細介紹,這里不再贅述。

圖 2 ?TiDB 基礎架構圖

<center>圖 2 ?TiDB 基礎架構圖</center>

三、背景

跟絕大數互聯網公司一樣,小米關系型存儲數據庫首選 MySQL,單機 2.6T 磁盤。由于小米手機銷量的快速上升和 MIUI 負一屏用戶量的快速增加,導致負一屏快遞業務數據的數據量增長非常快,每天的讀寫量級均分別達到上億級別,數據快速增長導致單機出現瓶頸,比如性能明顯下降、可用存儲空間不斷降低、大表 DDL 無法執行等,不得不面臨數據庫擴展的問題。比如,我們有一個業務場景(智能終端),需要定時從幾千萬級的智能終端高頻的向數據庫寫入各種監控及采集數據,MySQL 基于 Binlog 的單線程復制模式,很容易造成從庫延遲,并且堆積越來越嚴重。

對于 MySQL 來講,最直接的方案就是采用分庫分表的水平擴展方式,綜合來看并不是最優的方案,比如對于業務來講,對業務代碼的侵入性較大;對于 DBA 來講提升管理成本,后續需要不斷的拆分擴容,即使有中間件也有一定的局限性。同樣是上面的智能終端業務場景,從業務需求看,需要從多個業務維度進行查詢,并且業務維度可能隨時進行擴展,分表的方案基本不能滿足業務的需求。

了解到 TiDB 特點之后,DBA 與業務開發溝通確認當前 MySQL 的使用方式,并與 TiDB 的兼容性做了詳細對比,經過業務壓測之后,根據壓測的結果,決定嘗試將數據存儲從 MySQL 遷移到 TiDB。經過幾個月的線上考驗,TiDB 的表現達到預期。

四、兼容性對比

TiDB 支持包括跨行事務、JOIN、子查詢在內的絕大多數 MySQL 的語法,可以直接使用 MySQL 客戶端連接;對于已用 MySQL 的業務來講,基本可以無縫切換到 TiDB。

二者簡單對比如下幾方面:

  • 功能支持

    • TiDB 尚不支持如下幾項:

      • 增加、刪除主鍵
      • 非 UTF8 字符集
      • 視圖(即將支持)、存儲過程、觸發器、部分內置函數
      • Event
      • 全文索引、空間索引
  • 默認設置

    • 字符集、排序規則、sql_mode、lower_case_table_names 幾項默認值不同。
  • 事務

    • TiDB 使用樂觀事務模型,提交后注意檢查返回值。
    • TiDB 限制單個事務大小,保持事務盡可能的小。
  • TiDB 支持絕大多數的 Online DDL。
  • 另,一些 MySQL 語法在 TiDB 中可以解析通過,不會產生任何作用,例如: create table 語句中 engine、partition 選項都是在解析后忽略。
  • 詳細信息可以訪問官網:https://pingcap.com/docs-cn/sql/mysql-compatibility/?。

五、壓測

5.1 目的

通過壓測 TiDB 了解一下其 OLTP 性能,看是否滿足業務要求。

5.2 機器配置

組件實例數量CPU 型號內存磁盤版本操作系統
TiDB3Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz128GSSD Raid 52.0.3CentOS Linux release 7.3.1611
PD3Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz128GSSD Raid 52.0.3CentOS Linux release 7.3.1611
TiKV4Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz128GSSD Raid 52.0.3CentOS Linux release 7.3.1611

5.3 壓測內容以及結果

5.3.1 標準 Select 壓測

ThreadsQPSLatency (avg / .95 / max)
812650.810.63 / 0.90 / 15.62
1621956.210.73 / 1.50 / 15.71
3231534.81.01 / 2.61 / 25.16
64382171.67 / 5.37 / 49.80
12839943.053.20 / 8.43 / 58.60
25640920.646.25 / 13.70 / 95.13

圖 3 ?標準 Select 壓測圖

<center>圖 3 ?標準 Select 壓測圖</center>

5.3.2 標準 OLTP 壓測

ThreadsTPSQPSLatency (avg / .95 / max)
8428.98578.0918.65 / 21.89 / 116.06
16731.6714633.3521.86 / 25.28 / 120.59
321006.4320128.5931.79 / 38.25 / 334.92
641155.4423108.955.38 / 71.83 / 367.53
1281121.5522431114.12 / 161.51 / 459.03
256941.2618825.1271.94 / 369.77 / 572.88

更正-oltp壓測

<center>圖 4 ?標準 OLTP ?壓測圖</center>

5.3.3 標準 Insert 壓測

ThreadsQPSLatency (avg / .95 / max)
83625.752.20 / 2.71 / 337.94
166527.242.45 / 3.55 / 160.84
3210307.663.10 / 4.91 / 332.41
6413662.834.68 / 7.84 / 467.56
12815100.448.47 / 16.41 / 278.23
25617286.8614.81 / 25.74 / 3146.52

圖 5 ?標準 Insert 壓測圖

<center>圖 5 ?標準 Insert 壓測圖</center>

通過壓測發現 TiDB 穩定性上與預期稍有差別,不過壓測的 Load 會明顯高于生產中的業務 Load,參考低 Threads 時 TiDB 的表現,基本可以滿足業務對 DB 的性能要求,決定灰度一部分 MySQL 從庫讀流量體驗一下實際效果。

六、遷移過程

整個遷移分為 2 大塊:數據遷移、流量遷移。

6.1 數據遷移

數據遷移分為增量數據、存量數據兩部分。

  • 對于存量數據,可以使用邏輯備份、導入的方式,除了傳統的邏輯導入外,官方還提供一款物理導入的工具 TiDB Lightning。
  • 對于增量備份可以使用 TiDB 提供的 Syncer (新版已經更名為 DM - Data Migration)來保證數據同步。

Syncer 結構如圖 6,主要依靠各種 Rule 來實現不同的過濾、合并效果,一個同步源對應一個 Syncer 進程,同步 Sharding 數據時則要多個 Syncer 進程。

圖 6? Syncer 結構圖

<center>圖 6? Syncer 結構圖</center>

使用 Syncer 需要注意:

  • 做好同步前檢查,包含 server-id、log_bin、binlog_format 是否為 ROW、binlog_row_image 是否為 FULL、同步相關用戶權限、Binlog 信息等。
  • 使用嚴格數據檢查模式,數據不合法則會停止。數據遷移之前最好針對數據、表結構做檢查。
  • 做好監控,TiDB 提供現成的監控方案。
  • 對于已經分片的表同步到同一個 TiDB 集群,要做好預先檢查。確認同步場景是否可以用 route-rules 表達,檢查分表的唯一鍵、主鍵在數據合并后是否沖突等。

6.2 流量遷移

流量切換到 TiDB 分為兩部分:讀、寫流量遷移。每次切換保證灰度過程,觀察周期為 1~2 周,做好回滾措施。

  • 讀流量切換到 TiDB,這個過程中回滾比較簡單,灰度無問題,則全量切換。
  • 再將寫入切換到 TiDB,需要考慮好數據回滾方案或者采用雙寫的方式(需要斷掉 Syncer)。

七、集群狀況

7.1 配置

集群配置采用官方推薦的 7 節點配置,3 個 TiDB 節點,3 個 PD 節點,4 個 TiKV 節點,其中每個 TiDB 與 PD 為一組,共用一臺物理機。后續隨著業務增長或者新業務接入,再按需添加 TiKV 節點。

7.2 監控

監控采用了 TiDB 的提供的監控方案,并且也接入了公司開源的 Falcon,目前整個集群運行比較穩定,監控如圖 7。 ?????

圖 7? 監控圖

<center>圖 7? 監控圖</center>

八、遇到的問題、原因及解決辦法

問題原因及解決辦法
在一個 DDL 里不能對多個列或者多個索引做操作。ADD/DROP INDEX/COLUMN 操作目前不支持同時創建或刪除多個索引或列,需要拆分單獨執行,官方表示 3.0 版本有計劃改進。
部分操作符查詢優化器支持不夠好,比如 or 操作符會使用 TableScan,改寫成 union all 可避免。官方表示目前使用 or 操作符確實在執行計劃上有可能不準確,已經在改進計劃中,后續 3.0 版本會有優化。
重啟一個 PD 節點的時候,業務能捕捉到 PD 不可用的異常,會報 PD server timeout 。因為重啟的是 Leader 節點,所以重啟之前需要手動切換 Leader,然后進行重啟。官方建議這里可以通過重啟前做 Leader 遷移來減緩,另外后續 TiDB 也會對網絡通訊相關參數進行梳理和優化。
建表語句執行速度相比 MySQL 較慢多臺 TiDB 的時候,Owner 和接收 create table 語句的 TiDB Server 不在一臺 Server 上時,可能比 MySQL 慢一些,每次操作耗時在 0.5s 左右,官方表示會在后續的版本中不斷完善。
pd-ctl 命令行參數解析嚴格,多一個空格會提示語法錯誤。官方表示低版本中可能會有這個問題,在 2.0.8 及以上版本已經改進。
tikv-ctl 命令手動 compact region 失敗。在低版本中通常是因為 tikv-ctl 與集群版本不一致導致的,需要更換版本一致的 tikv-ctl,官方表示在 2.1 中已經修復。
大表建索引時對業務有影響官方建議在業務低峰期操作,在 2.1 版本中已經增加了操作優先級以及并發讀的控制,情況有改善。
存儲空間放大問題該問題屬于 RocksDB,RocksDB 的空間放大系數最理想的值為 1.111,官方建議在某些場景下通過 TiKV 開啟 RocksDB 的 dynamic-level-bytes 以減少空間放大。

九、后續和展望

目前 TiDB 在小米主要提供 OLTP 服務,小米手機負一屏快遞業務為使用 TiDB 做了一個良好的開端,而后商業廣告也有接入,2 個業務均已上線數月,TiDB 的穩定性經受住了考驗,帶來了很棒的體驗,對于后續大體的規劃如下:

  • MIUI 生態業務中存在大量的類似場景的業務,后續將會與業務開發積極溝通,從 MySQL 遷移到 TiDB。
  • 針對某些業務場景,以資源合理利用為目標,推出歸檔集群,利用 Syncer 實現數據歸檔的功能。
  • 數據分析,結合 TiDB 提供的工具,將支持離線、實時數據分析支持。
  • 將 TiDB 的監控融合到小米公司開源的監控系統 Falcon 中。

十、致謝

非常感謝 TiDB 官方在遷移及業務上線期間給予我們的支持,為每一個 TiDB 人專業的精神、及時負責的響應點贊。

更多 TiDB 用戶實踐: https://www.pingcap.com/cases-cn/

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

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

相關文章

java圖片識別查看器模擬_[轉載]windows照片查看器無法顯示圖片內存不足

問題描述最近在使用Windows照片查看器打開一個jpg文件的時候異常Windows照片查看器無法顯示此圖片&#xff0c;因為計算機上的可用內存可能不足。請關閉一些目前沒有使用的程序或者釋放部分硬盤空間(如果硬盤幾乎已滿)&#xff0c;然后重試問題分析這時我們按F11或者圖片下方中…

等寬字體

摘抄了一個編程用字體選擇標準&#xff0c;供各位參考&#xff1a; 1. 所有字符等寬&#xff1b; 2. 簡潔、清晰、規范的字符形體&#xff1b; 3. 支持ASCII碼為128以上的擴展字符集&#xff1b; 4. 空白字符(ASCII: 0x20)與其他字符等寬&#xff1b; 5. 1、l和i等三個字符易于…

海量數據索引與近似最近鄰隨記

最近鄰問題(NN) 將次數看成向量&#xff0c;然后我們就可以比對向量的距離(歐式距離&#xff0c;余弦距離)。數據中會有一些異常點&#xff0c;這些異常點會導致結果的不穩定。這種思想非常的不穩定&#xff0c;因為他只基于一個樣本來做最后類別的判定。K最近鄰算法(NN > K…

MySQL時間格式TIMESTAMP和DATETIME的區別

時區&#xff0c;timestamp會跟隨設置的時區變化而變化&#xff0c;而datetime保存的是絕對值不會變化 自動更新&#xff0c;insert、update數據時&#xff0c;可以設置timestamp列自動以當前時間(CURRENT_TIMESTAMP)填充/更新 占用存儲空間不同&#xff0c;timestamp儲存占用…

python c 選擇_C和Python,小白應該選擇學習哪門語言?

首先&#xff0c;需要對兩門語言進行初步認識&#xff0c;C語言是一門通用性的編程原因&#xff0c;為什么說通用呢?是因為它能夠做很多低級、底層的處理&#xff0c;同時具有良好的跨平臺性&#xff0c;C語言可以按照一定的標準在多種計算機平臺上進行編譯&#xff0c;包含嵌…

WaitForSingleObject的用法

WaitForSingleObject的用法 1.WaitForSingleObject 的用法 DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds ); 參數 hHandle 是一個事件的句柄&#xff0c;第二個參數 dwMilliseconds 是時間間隔。如果時間是有信…

pom.xml里發布和下載包

1.下載包 在<project>標簽中 <repositories><repository><id>nexus</id><url>http://10.39.93.105:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots>&l…

智能云改-docker云遷移實戰

本次安裝的linux版本是centos7.4&#xff0c;docker安裝不依賴任何環境&#xff0c;但是必須要連接網絡&#xff0c;滿足這一點就可以進行docker安裝了。 一、安裝&#xff1a; 1.刪除就版本的docker輸入命令&#xff1a;yum -y remove docker \docker-common \docker-selinux …

python詞頻統計代碼_python統計詞頻

一、程序分析 &#xff08;1&#xff09;將文件讀入緩沖區&#xff08;dst指文本文件存放路徑&#xff0c;設置成形參&#xff0c;也可以不設&#xff0c;具體到函數里設置&#xff09; def process_file(dst): # 讀文件到緩沖區try: # 打開文件 txtopen(dst,"r") ex…

關于wpf,datagrid,雙向數據綁定用法解決方案

參考&#xff1a;http://www.myexception.cn/c-sharp/1446457.html 核心內容&#xff0c;在綁定數據的地方添加雙向綁定&#xff1a; {Binding BB, ModeTwoWay,UpdateSourceTriggerPropertyChanged} 轉載于:https://www.cnblogs.com/Mindy-hym/p/11431069.html

部署zookeeper分布式節點

用2臺服務器&#xff0c;低資源&#xff0c;部署3個zookeeper分布式節點&#xff1a; 1.準備環境系統已經配置好了JAVA環境&#xff1b;下載某個版本的zookeeper壓縮包&#xff0c;下載鏈接&#xff1a;http://apache.claz.org/zookeeper/zookeeper-3.5.3-beta/zookeeper-3.5.3…

Oracle的resouce、unlimited tablespace 及如何把數據導入不同的表空間

resouce是角色&#xff0c;unlimited tablespace是權限。 很多人在進行數據遷移時&#xff0c;希望把數據導入不同于原系統的表空間&#xff0c;在導入之后卻往往發現&#xff0c;數據被導入了原表空間。本例舉例說明解決這個問題:1.如果缺省的用戶具有DBA權限那么導入時會按照…

MySQL導入導出遠程訪問命令

1.導出整個數據庫mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql2.導出一個表mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql3.導出一個數據庫結…

.net開發是做什么的_軟件開發是什么, 該怎么做?

軟件開發是什么, 該怎么做&#xff1f;1 引子關于什么是軟件開發存在很多觀點&#xff0c;有的認為軟件開發即服務&#xff0c;有的認為軟件開發即產品&#xff0c;有的認為軟件開發即平臺&#xff0c;這些觀點各有各的側重點。這篇文章我們來學習和探討一下軟件開發。2 軟件…

虛擬軟驅影像文件制作程序下載路徑:http://download.csdn.net/source/738137

通過這個程序&#xff0c;可制作一個在虛擬機上運行的Hello China啟動軟盤&#xff0c;而無需你的計算機具備物理軟驅。 If you have not CSDN account or you very care the 3 points will be omitted if you download,please send mail to garryxinyahoo.com.cn, I will send…

css3屬性

css3屬性 transform動畫 transform-origin&#xff1a;設置不動點&#xff0c;以這個點位移transform&#xff1a;translate(x,y):自身偏移量transform:scale(x,y)&#xff1a;縮放&#xff0c;當為負數的時候可以實現反轉元素transform&#xff1a;roate&#xff08;xdeg&…

使用HTML5、CSS3和jQuery增強網站用戶體驗

記得幾年前如果你需要添加一些互動元素到你的網站中用來改善用戶體驗&#xff1f;是不是立刻就想到了flash實現&#xff1f;這彷佛年代久遠的事了。使用現在最流行的Web技術HTML5&#xff0c;CSS3和jQuery&#xff0c;同樣也可以實現類似的用戶體驗。而且使用這些特性將會比使用…

python中loop函數_python + Django 的forloop功能試驗講解

一、forloop功能詳解記錄 遇到一個問題困擾了我好久&#xff0c;結果還是知識盲區造成的。下邊記錄一下。 通過return forloop可以返回前端循環中的索引值 二、forloop大概功能 forloop是Django模板中一個功能&#xff0c;主要是可以計算循環的對象的索引值&#xff08;大白話大…

帆軟報表(finereport)JS實現cpt中詳細單元格刷新

1.刷新固定單元格 setInterval(function(){ //獲取第二行第 5 列 E2 單元格對象var _changeCell $("tr[tridx1]","div.content-container").children().eq(7);//獲取 H2 單元格值var _changeVal _changeCell.text();//給表格賦值 if(_changeVal"…

[導入]源代碼版本控制(二)

在VS6.0時代&#xff0c;VSS的版本是6.0&#xff0c;現在VS的版本都到2008了&#xff0c;VSS的版本目前是2005&#xff0c;這回以2005為例。安裝就免了。數據庫的創建&#xff1a;如果要在局域網內共享這個數據庫&#xff0c;那還需要將剛才存放數據庫的目錄共享出去。為數據庫…