摘要:業(yè)務(wù)延遲和錯誤量對比接入數(shù)據(jù)庫后業(yè)務(wù)邏輯層服務(wù)接口耗時穩(wěn)定無抖動,且沒有發(fā)生丟棄的情況上圖錯誤大多由數(shù)據(jù)訪問層服務(wù)隊列堆積發(fā)生請求丟棄造成。
作者:孫玄,轉(zhuǎn)轉(zhuǎn)公司首席架構(gòu)師;陳東,轉(zhuǎn)轉(zhuǎn)公司資深工程師;冀浩東,轉(zhuǎn)轉(zhuǎn)公司資深 DBA。公司及業(yè)務(wù)架構(gòu)介紹
轉(zhuǎn)轉(zhuǎn)二手交易網(wǎng) —— 把家里不用的東西賣了變成錢,一個幫你賺錢的網(wǎng)站。由騰訊與 58 集團共同投資。為海量用戶提供一個有擔保、便捷的二手交易平臺。轉(zhuǎn)轉(zhuǎn)是 2015 年 11 月 12 日正式推出的 APP,遵循“用戶第一”的核心價值觀,以“讓資源重新配置,讓人與人更信任”為企業(yè)愿景,提倡真實個人交易。
轉(zhuǎn)轉(zhuǎn)二手交易涵蓋手機、3C 數(shù)碼、母嬰用品等三十余個品類。在系統(tǒng)設(shè)計上,轉(zhuǎn)轉(zhuǎn)整體架構(gòu)采用微服務(wù)架構(gòu),首先按照業(yè)務(wù)領(lǐng)域模型垂直拆分成用戶、商品、交易、搜索、推薦微服務(wù)。對每一個功能單元(商品等),繼續(xù)進行水平拆分,分為商品網(wǎng)關(guān)層、商品業(yè)務(wù)邏輯層、商品數(shù)據(jù)訪問層、商品 DB / Cache,如下圖所示:?
項目背景1. 面臨的問題
轉(zhuǎn)轉(zhuǎn)后端業(yè)務(wù)現(xiàn)階段主要使用 MySQL 數(shù)據(jù)庫存儲數(shù)據(jù),還有少部分業(yè)務(wù)使用 MongoDB。雖然目前情況下使用這兩種存儲基本可以滿足我們的需求,但隨著業(yè)務(wù)的增長,公司的數(shù)據(jù)規(guī)模逐漸變大,為了應(yīng)對大數(shù)據(jù)量下業(yè)務(wù)服務(wù)訪問的性能問題,MySQL 數(shù)據(jù)庫常用的分庫、分表方案會隨著 MySQL Sharding(分片)的增多,業(yè)務(wù)訪問數(shù)據(jù)庫邏輯會越來越復雜。而且對于某些有多維度查詢需求的表,我們總需要引入額外的存儲或犧牲性能來滿足我們的查詢需求,這樣會使業(yè)務(wù)邏輯越來越重,不利于產(chǎn)品的快速迭代。
從數(shù)據(jù)庫運維角度講,大數(shù)據(jù)量的情況下,MySQL 數(shù)據(jù)庫在每次 DDL 都會對運維人員造成很大的工作量,當節(jié)點故障后,由于數(shù)據(jù)量較大,恢復時間較長。但這種 M - S 架構(gòu)只能通過主從切換并且需要額外的高可用組件來保障高可用,同時在切換過程由于需要確定主庫狀態(tài)、新主庫選舉、新路由下發(fā)等原因,還是會存在短暫的業(yè)務(wù)訪問中斷的情況。?
綜上所述,我們面臨的主要問題可歸納為:
數(shù)據(jù)量大,如何快速水平擴展存儲;
大數(shù)據(jù)量下,如何快速 DDL;
分庫分表造成業(yè)務(wù)邏輯非常復雜;
常規(guī) MySQL 主從故障轉(zhuǎn)移會導致業(yè)務(wù)訪問短暫不可用。
2. 為什么選擇 TiDB
針對上章提到的問題,轉(zhuǎn)轉(zhuǎn)基礎(chǔ)架構(gòu)部和 DBA 團隊考慮轉(zhuǎn)轉(zhuǎn)業(yè)務(wù)數(shù)據(jù)增速,定位簡化業(yè)務(wù)團隊數(shù)據(jù)庫使用方案,更好的助力業(yè)務(wù)發(fā)展,決定啟動新型存儲服務(wù)(NewSQL)的選型調(diào)研工作。?
TiDB 數(shù)據(jù)庫,結(jié)合了關(guān)系庫與 KV 存儲的優(yōu)點,對于使用方,完全可以當做 MySQL 來用,而且不用考慮數(shù)據(jù)量大了后的分庫分表以及為了支持分庫分表后的多維度查詢而建立的 Mapping 表,可以把精力全部放在業(yè)務(wù)需求上。所以我們把 TiDB 作為選型的首選對象展開了測試和試用。
TiDB 測試1. 功能測試
TiDB 支持絕大多數(shù) MySQL 語法,業(yè)務(wù)可以將基于 MySQL 的開發(fā),無縫遷移至 TiDB。不過目前 TiDB 不支持部分 MySQL 特性,如:存儲過程、自定義函數(shù)、觸發(fā)器等。
2. TiDB 壓力測試
通過測試工具模擬不同的場景的請求,對 TiDB 數(shù)據(jù)庫進行壓力測試,通過壓力測試結(jié)果的對比,可以提供 RD 使用 TiDB 的合適業(yè)務(wù)場景以及 TiDB 的使用建議。
此次壓力測試,總共使用 6 臺物理服務(wù)器,其中 3 臺 CPU 密集型服務(wù)器,用于啟動 TiDB - Server、PD 服務(wù);另外 3 臺為 IO / CPU 密集型的PCIE 服務(wù)器,用于啟動 TiKV 服務(wù)。
使用 sysbench - 1.0.11 測試數(shù)據(jù)大小為 200G 的 TiDB 集群,在不同場景下 TiDB 的響應(yīng)時間(95th per):
3. 結(jié)果整理
順序掃描的效率是比較高的,連續(xù)的行大概率會存儲在同一臺機器的鄰近位置,每次批量的讀取和寫入的效率會高;
控制并發(fā)運行的線程數(shù),會減少請求響應(yīng)時間,提高數(shù)據(jù)庫的處理性能。
4. 場景建議
適合線上業(yè)務(wù)混合讀寫場景;
適合順序?qū)懙膱鼍埃热纾簲?shù)據(jù)歸檔、操作日志、攤銷流水。
5. TiDB 預上線
將 TiDB 掛載到線上 MySQL,作為 MySQL 從庫同步線上數(shù)據(jù),然后業(yè)務(wù)將部分線上讀流量切換到 TiDB,可以對 TiDB 集群是否滿足業(yè)務(wù)訪問做好預判。
業(yè)務(wù)接入1. 遷移過程
我們第一個接入 TiDB 的業(yè)務(wù)線是轉(zhuǎn)轉(zhuǎn)消息服務(wù)。消息作為轉(zhuǎn)轉(zhuǎn)最重要的基礎(chǔ)服務(wù)之一,是保證平臺上買賣雙方有效溝通、促進交易達成的重要組件,其數(shù)據(jù)量和訪問量都非常大。起初我們使用的是 MySQL 數(shù)據(jù)庫,對其所有的業(yè)務(wù)都做了庫的垂直拆分以及表的水平拆分。目前線上有幾十 TB 的數(shù)據(jù),記錄數(shù)據(jù)達到了幾百億。雖對 MySQL 做了分庫分表,但實例已經(jīng)開始又有偶發(fā)的性能問題,需要馬上對數(shù)據(jù)進行二次拆分,而二次拆分的執(zhí)行成本也比較高,這也是我們首先遷移消息數(shù)據(jù)庫的原因之一。
消息服務(wù)有幾個核心業(yè)務(wù)表:聯(lián)系人列表、消息表、系統(tǒng)消息表等等。聯(lián)系人列表作為整個消息系統(tǒng)的樞紐,承載著巨大的訪問壓力。業(yè)務(wù)場景相對其他表最復雜的,也是這個表的實例出現(xiàn)了性能問題,所以我們決定先遷移聯(lián)系人列表。
整個遷移過程分三步:測試(判斷 TiDB 是否滿足業(yè)務(wù)場景,性能是否 OK)、同步數(shù)據(jù)、切流量。
(1)測試:首先我們模擬線上的數(shù)據(jù)和請求對“聯(lián)系人列表”做了大量功能和性能的驗證,而且還將線上的數(shù)據(jù)和流量引到線下,對數(shù)據(jù)庫做了真實流量的驗證,測試結(jié)果證明 TiDB 完全滿足消息業(yè)務(wù)的需求。引流工作,我們是通過轉(zhuǎn)轉(zhuǎn)自研的消息隊列,將線上數(shù)據(jù)庫的流量引一份到測試環(huán)境。測試環(huán)境消費消息隊列的數(shù)據(jù),轉(zhuǎn)換成數(shù)據(jù)庫訪問請求發(fā)送到 TiDB 測試集群。通過分析線上和測試環(huán)境兩個數(shù)據(jù)訪問模塊的日志可以初步判斷 TiDB 數(shù)據(jù)庫是否可以正常處理業(yè)務(wù)請求。當然僅僅這樣是不夠的,DBA 同學還需要校驗 TiDB 數(shù)據(jù)的正確性(是否與線上 MySQL 庫一致)。驗證思路是抽樣驗證 MySQL 庫表記錄和 TiDB 的記錄 Checksum 值是否一致。
(2)同步數(shù)據(jù):DBA 同學部署 TiDB 集群作為 MySQL 實例的從庫,將 MySQL 實例中的聯(lián)系人列表(單實例分了 1024 個表)的數(shù)據(jù)同步到 TiDB 的一張大表中。
(3)切流量:切流量分為三步,每兩步之間都有一周左右的觀察期。
第一步將讀流量灰度切到 TiDB 上;
第二步斷開 TiDB 與 MySQL 的主從同步,業(yè)務(wù)開雙寫(同時寫 MySQL 和 TiDB,保證兩庫數(shù)據(jù)一致)確保業(yè)務(wù)流量可以隨時回滾到 MySQL;
第三步停止 MySQL 寫入,到此業(yè)務(wù)流量完全切換到 TiDB 數(shù)據(jù)庫上。
遷移過程中最重要的點就是確保兩個數(shù)據(jù)庫數(shù)據(jù)一致,這樣讀寫流量隨時可以切回 MySQL,業(yè)務(wù)邏輯不受任何影響。數(shù)據(jù)庫雙寫的方案與上文提到的引流測試類似,使用消息隊列引一份寫入流量,TiDB 訪問模塊消費消息隊列數(shù)據(jù),寫庫。但僅僅這樣是不能保證兩個庫數(shù)據(jù)一致的,因為這個方案無法保證兩個寫庫操作的原子性。所以我們需要一個更嚴謹?shù)姆桨福D(zhuǎn)轉(zhuǎn)的消息隊列還提供了事務(wù)消息的支持,可以保證本地操作和發(fā)送消息的原子性。利用這一特性再加上異步補償策略(離線掃描日志,如果有失敗的寫入請求,修正數(shù)據(jù))保證每個消息都被成功消費且兩個庫每次寫入結(jié)果都是一致的,從而保證了 MySQL 與 TiDB 兩個庫的數(shù)據(jù)一致。
2. 遇到問題
按照上述的方案,我們已經(jīng)將消息所有的業(yè)務(wù)都切到 TiDB 數(shù)據(jù)庫上。遷移過程中也不都是順風順水,也遇到了問題,過程中也得到了 TiDB 官方團隊的大力支持。這里主要介紹兩個問題:
(1)TiDB 作為分布式存儲,其鎖機制和 MySQL 有很大不同。我們有一個并發(fā)量很大,可能同時更新一條記錄的場景,我們用了 MySQL 的唯一索引保證了某個 Key 值的唯一性,但如果業(yè)務(wù)請求使用默認值就會大量命中唯一索引,會造成 N 多請求都去更新統(tǒng)一同一條記錄。在 MySQL 場景下,沒有性能問題,所以業(yè)務(wù)上也沒做優(yōu)化。但當我們用這個場景測試 TiDB 時,發(fā)現(xiàn) TiDB 處理不太好,由于其使用的樂觀鎖,數(shù)據(jù)庫輸出大量的重試的日志。業(yè)務(wù)出現(xiàn)幾十秒的請求延遲,造成隊列中大量請求被拋棄。PingCAP 的同學建議調(diào)整 retry_limit 但也沒有完全生效(該 BUG 已經(jīng)在 2.0 RC 5 已經(jīng)修復),最后業(yè)務(wù)進行優(yōu)化(過濾使用默認值的請求)后問題得到解決。
(2)第二個問題是運維方面的,DBA 同學按照使用 MySQL 的運維經(jīng)驗,對一個上近 T 的表做了 Truncate操作,操作后,起初數(shù)據(jù)庫表現(xiàn)正常,但幾分鐘后,開始出現(xiàn)超時,TiKV 負載變高。最后請教 PingCAP 同學分析,定位是操作觸發(fā)了頻繁回收 Region 的 BUG(該 BUG TiDB 2.0 版本已經(jīng)修復)。
線上效果對比*1. 隊列等待情況對比
使用 TiDB 數(shù)據(jù)庫,業(yè)務(wù)模塊隊列請求數(shù)基本保持 1 個,MySQL 會有較大抖動。
2. 請求延遲情況對比
使用 TiDB 數(shù)據(jù)庫,整體響應(yīng)延時非常穩(wěn)定,不受業(yè)務(wù)流量高峰影響,但 MySQL 波動很大。 另外在擴展性方面,我們可以通過無縫擴展 TiDB 和 TiKV 實例提升系統(tǒng)的吞吐量,這個特性 MySQL 是不具備的。
3. 業(yè)務(wù)延遲和錯誤量對比
接入 TiDB 數(shù)據(jù)庫后業(yè)務(wù)邏輯層服務(wù)接口耗時穩(wěn)定無抖動,且沒有發(fā)生丟棄的情況(上圖錯誤大多由數(shù)據(jù)訪問層服務(wù)隊列堆積發(fā)生請求丟棄造成)。
TiDB 線上規(guī)模及后續(xù)規(guī)劃目前轉(zhuǎn)轉(zhuǎn)線上已經(jīng)接入消息、風控兩套 OLTP 以及一套風控 OLAP 集群。?
集群架構(gòu)如下:目前轉(zhuǎn)轉(zhuǎn)線上 TiDB 集群的總?cè)萘繋装?TB,線上 TiDB 表現(xiàn)很穩(wěn)定,我們會繼續(xù)接入更多的業(yè)務(wù)(留言,評論、搜索、商品、交易等等)。
1. 后續(xù)規(guī)劃
多個正在開發(fā)的新業(yè)務(wù)在開發(fā)和測試環(huán)境中使用 TiDB,線上會直接使用 TiDB;
轉(zhuǎn)轉(zhuǎn)核心的留言、評論、搜索、商品、交易訂單庫計劃遷移到 TiDB,已經(jīng)開始梳理業(yè)務(wù),準備展開測試;
計劃在后續(xù) TiDB 的使用中,TiKV 服務(wù)器池化,按需分配 TiKV 節(jié)點。
2. TiDB 使用成果
利用 TiDB 水平擴展特性,避免分庫分表帶來的問題,使得業(yè)務(wù)快速迭代;
TiDB 兼容 MySQL 語法和協(xié)議,按照目前線上 MySQL 使用規(guī)范,可以無縫的遷移過去,無需 RD 做調(diào)整,符合預期;
在數(shù)據(jù)量較大的情況下,TiDB 響應(yīng)較快,優(yōu)于 MySQL;
集群出現(xiàn)故障對用戶無感知;
TiDB 自帶了完善的監(jiān)控系統(tǒng),使得運維成本大大降低。
延展閱讀:TiDB 助力客如云餐飲 SaaS 服務(wù)
TiDB 在威銳達 WindRDS 遠程診斷及運維中心的應(yīng)用
TiDB 在餓了么歸檔環(huán)境的應(yīng)用
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/17753.html
摘要:而批處理,可以復用一條簡單,實現(xiàn)批量數(shù)據(jù)的寫入或更新,為系統(tǒng)帶來更低更穩(wěn)定的耗時。批處理的簡要流程說明如下經(jīng)業(yè)務(wù)中實踐,使用批處理方式的寫入或更新,比常規(guī)或性能更穩(wěn)定,耗時也更低。 作者:陳維,轉(zhuǎn)轉(zhuǎn)優(yōu)品技術(shù)部 RD。 開篇 世界級的開源分布式數(shù)據(jù)庫 TiDB 自 2016 年 12 月正式發(fā)布第一個版本以來,業(yè)內(nèi)諸多公司逐步引入使用,并取得廣泛認可。 對于互聯(lián)網(wǎng)公司,數(shù)據(jù)存儲的重要性不...
閱讀 2130·2021-11-23 09:51
閱讀 3713·2021-10-20 13:49
閱讀 1719·2021-09-06 15:13
閱讀 1830·2021-09-06 15:02
閱讀 3185·2021-09-02 15:11
閱讀 900·2019-08-29 15:37
閱讀 1746·2019-08-29 13:24
閱讀 2285·2019-08-29 11:28