1.3萬(wàn)億條數(shù)據(jù)查詢毫秒級(jí)響應(yīng),如何做到的?
點(diǎn)擊“開(kāi)發(fā)者技術(shù)前線”,選擇“星標(biāo)??”
讓一部分開(kāi)發(fā)者看到未來(lái)

來(lái)自:孫曉光 | 責(zé)編:樂(lè)樂(lè)
鏈接:dzone.com/articles/lesson-learned-from-queries-over-13-trillion-rows-1
我將介紹為什么我們選擇 TiDB,我們?nèi)绾问褂盟?,我們學(xué)到了什么,優(yōu)秀實(shí)踐以及對(duì)未來(lái)的一些想法。
我們的痛點(diǎn)
本節(jié)介紹了我們的 Moneta 應(yīng)用程序的體系結(jié)構(gòu),我們嘗試構(gòu)建的理想體系結(jié)構(gòu),以及數(shù)據(jù)庫(kù)可伸縮性作為我們的主要難點(diǎn)。
系統(tǒng)架構(gòu)要求
知乎的 Post Feed 服務(wù)是一個(gè)關(guān)鍵系統(tǒng),用戶可以通過(guò)該系統(tǒng)接收網(wǎng)站上發(fā)布的內(nèi)容。
后端的 Moneta 應(yīng)用程序存儲(chǔ)用戶已閱讀的帖子,并在知乎的推薦頁(yè)面的帖子流中過(guò)濾掉這些帖子。
需要高可用性數(shù)據(jù):Post Feed 是第一個(gè)出現(xiàn)的屏幕,它在推動(dòng)用戶流量到知乎方面發(fā)揮著重要作用。
處理巨大的寫入數(shù)據(jù):例如,在高峰時(shí)間每秒寫入超過(guò) 4 萬(wàn)條記錄,記錄數(shù)量每天增加近 30 億條記錄。
長(zhǎng)期存儲(chǔ)歷史數(shù)據(jù):目前,系統(tǒng)中存儲(chǔ)了大約 1.3 萬(wàn)億條記錄。隨著每月累積約 1000 億條記錄并且不斷增長(zhǎng),歷史數(shù)據(jù)將在大約兩年內(nèi)達(dá)到 3 萬(wàn)億條記錄。
處理高吞吐量查詢:在高峰時(shí)間,系統(tǒng)處理平均每秒在 1200 萬(wàn)個(gè)帖子上執(zhí)行的查詢。
將查詢的響應(yīng)時(shí)間限制為 90 毫秒或更短:即使對(duì)于執(zhí)行時(shí)間最長(zhǎng)的長(zhǎng)尾查詢,也會(huì)發(fā)生這種情況。
容忍誤報(bào):這意味著系統(tǒng)可以為用戶調(diào)出許多有趣的帖子,即使有些帖子被錯(cuò)誤地過(guò)濾掉了。
考慮到上述事實(shí),我們需要一個(gè)具有以下功能的應(yīng)用程序架構(gòu):
高可用性:當(dāng)用戶打開(kāi)知乎的推薦頁(yè)面時(shí),找到大量已經(jīng)閱讀過(guò)的帖子是一種糟糕的用戶體驗(yàn)。
出色的系統(tǒng)性能:我們的應(yīng)用具有高吞吐量和嚴(yán)格的響應(yīng)時(shí)間要求。
易于擴(kuò)展:隨著業(yè)務(wù)的發(fā)展和應(yīng)用程序的發(fā)展,我們希望我們的系統(tǒng)可以輕松擴(kuò)展。
勘探
為了構(gòu)建具有上述功能的理想架構(gòu),我們?cè)谥暗募軜?gòu)中集成了三個(gè)關(guān)鍵組件:
代理:這會(huì)將用戶的請(qǐng)求轉(zhuǎn)發(fā)給可用節(jié)點(diǎn),并確保系統(tǒng)的高可用性。 緩存:這暫時(shí)處理內(nèi)存中的請(qǐng)求,因此我們并不總是需要處理數(shù)據(jù)庫(kù)中的請(qǐng)求。這可以提高系統(tǒng)性能。 存儲(chǔ):在使用 TiDB 之前,我們?cè)讵?dú)立的 MySQL 上管理我們的業(yè)務(wù)數(shù)據(jù)。隨著數(shù)據(jù)量的激增,獨(dú)立的 MySQL 系統(tǒng)還不夠。 然后我們采用了 MySQL 分片和 Master High Availability Manager( MHA)的解決方案,但是當(dāng)每月有 1000 億條新記錄涌入我們的數(shù)據(jù)庫(kù)時(shí),這個(gè)解決方案是不可取的。
MySQL Sharding 和 MHA 的缺點(diǎn)
MySQL 分片的缺點(diǎn):
應(yīng)用程序代碼變得復(fù)雜且難以維護(hù)。
更改現(xiàn)有的分片鍵很麻煩。
升級(jí)應(yīng)用程序邏輯會(huì)影響應(yīng)用程序的可用性。
MHA 的缺點(diǎn):
我們需要通過(guò)編寫腳本或使用第三方工具來(lái)實(shí)現(xiàn)虛擬 IP(VIP)配置。
MHA 僅監(jiān)視主數(shù)據(jù)庫(kù)。
要配置 MHA,我們需要配置無(wú)密碼安全 Shell( SSH)。這可能會(huì)導(dǎo)致潛在的安全風(fēng)險(xiǎn)。
MHA 不為從屬服務(wù)器提供讀取負(fù)載平衡功能。
MHA 只能監(jiān)視主服務(wù)器(而不是從主服務(wù)器)是否可用。
在我們發(fā)現(xiàn) TiDB 并將數(shù)據(jù)從 MySQL 遷移到 TiDB 之前,數(shù)據(jù)庫(kù)可伸縮性仍然是整個(gè)系統(tǒng)的弱點(diǎn)。
什么是 TiDB?
TiDB 平臺(tái)是一組組件,當(dāng)它們一起使用時(shí),它們將成為具有 HTAP 功能的 NewSQL 數(shù)據(jù)庫(kù)。

在 TiDB 平臺(tái)內(nèi)部,主要組件如下:
TiDB 服務(wù)器是一個(gè)無(wú)狀態(tài)的 SQL 層,它處理用戶的 SQL 查詢,訪問(wèn)存儲(chǔ)層中的數(shù)據(jù),并將相應(yīng)的結(jié)果返回給應(yīng)用程序。它與 MySQL 兼容并且位于 TiKV 之上。 TiKV 服務(wù)器是數(shù)據(jù)持久存在的分布式事務(wù)鍵值存儲(chǔ)層。它使用 Raft 共識(shí)協(xié)議進(jìn)行復(fù)制,以確保強(qiáng)大的數(shù)據(jù)一致性和高可用性。 TiSpark 集群也位于 TiKV 之上。它是一個(gè) Apache Spark 插件,可與 TiDB 平臺(tái)配合使用,支持商業(yè)智能(BI)分析師和數(shù)據(jù)科學(xué)家的復(fù)雜在線分析處理(OLAP)查詢。 放置驅(qū)動(dòng)程序(PD)服務(wù)器是由 etcd 支持的元數(shù)據(jù)集群,用于管理和調(diào)度 TiKV。
以及用于收集對(duì) TiDB 群集進(jìn)行的邏輯更改并提供增量備份的 TiDB Binlog。復(fù)制到下游(TiDB,Kafka 或 MySQL)。
TiDB 的主要功能包括:
水平可擴(kuò)展性。 MySQL 兼容的語(yǔ)法。 具有強(qiáng)一致性的分布式事務(wù)。 云原生架構(gòu)。 使用 HTAP 進(jìn)行最小提取,轉(zhuǎn)換,加載( ETL)。 容錯(cuò)和 Raft 恢復(fù)。 在線架構(gòu)更改。
我們?nèi)绾问褂?TiDB
我們架構(gòu)中的 TiDB

我們?cè)谙到y(tǒng)中部署了 TiDB,Moneta 應(yīng)用程序的整體架構(gòu)變?yōu)椋?/span>
頂層:無(wú)狀態(tài)和可伸縮的客戶端 API 和代理。這些組件易于擴(kuò)展。 中間層:軟狀態(tài)組件和分層 Redis 緩存作為主要部分。當(dāng)服務(wù)中斷時(shí),這些組件可以通過(guò)恢復(fù)保存在 TiDB 群集中的數(shù)據(jù)來(lái)自我恢復(fù)服務(wù)。 底層:TiDB 集群存儲(chǔ)所有有狀態(tài)數(shù)據(jù)。它的組件高度可用,如果節(jié)點(diǎn)崩潰,它可以自我恢復(fù)其服務(wù)。
TiDB 的性能指標(biāo)

在高峰時(shí)段每秒檢查 30,000 個(gè)查詢和 1200 萬(wàn)個(gè)帖子:

第 99 百分位響應(yīng)時(shí)間約為 25 毫秒,第 999 百分位響應(yīng)時(shí)間約為 50 毫秒。實(shí)際上,平均響應(yīng)時(shí)間遠(yuǎn)遠(yuǎn)小于這些數(shù)字,即使對(duì)于需要穩(wěn)定響應(yīng)時(shí)間的長(zhǎng)尾查詢也是如此。

第 99 百分位響應(yīng)時(shí)間

我們學(xué)到了什么
更快地導(dǎo)入數(shù)據(jù)
減少查詢延遲
有些查詢對(duì)查詢延遲很敏感,有些則不然。我們部署了一個(gè)單獨(dú)的 TiDB 數(shù)據(jù)庫(kù)來(lái)處理對(duì)延遲敏感的查詢。(其他非延遲敏感的查詢?cè)诓煌?TiDB 數(shù)據(jù)庫(kù)中處理。)
這樣,大型查詢和對(duì)延遲敏感的查詢?cè)诓煌臄?shù)據(jù)庫(kù)中處理,前者的執(zhí)行不會(huì)影響后者。
對(duì)于沒(méi)有理想執(zhí)行計(jì)劃的查詢,我們編寫了 SQL 提示來(lái)幫助執(zhí)行引擎選擇最佳執(zhí)行計(jì)劃。
我們使用低精度時(shí)間戳 Oracle( TSO)和預(yù)處理語(yǔ)句來(lái)減少網(wǎng)絡(luò)往返。
評(píng)估資源
對(duì) TiDB 3.0 的期望
下圖分別顯示了與 RocksDB 和 Titan 相比的寫入和查詢延遲:

④gRPC 和多線程 Raftstore 中的批處理消息
⑤SQL 計(jì)劃管理
⑥TiFlash
⑦反垃圾郵件應(yīng)用程序中的 TiDB 3.0
下一步是什么
END
后臺(tái)回復(fù)“面試” “資料” 領(lǐng)取一份干貨,數(shù)百面試手冊(cè)等你 開(kāi)發(fā)者技術(shù)前線 ,匯集技術(shù)前線快訊和關(guān)注行業(yè)趨勢(shì),大廠干貨,是開(kāi)發(fā)者經(jīng)歷和成長(zhǎng)的優(yōu)秀指南。
歷史推薦
真香!我終于干掉了該死的 if-else...
阿里巴巴為什么不用 ZooKeeper 做服務(wù)發(fā)現(xiàn)? 簡(jiǎn)直是神仙打架!多端統(tǒng)一框架技術(shù)哪家強(qiáng)?
京東跨端組件庫(kù) NutUI 2.0 來(lái)襲


好文點(diǎn)個(gè)在看吧 
后臺(tái)回復(fù)“面試” “資料” 領(lǐng)取一份干貨,數(shù)百面試手冊(cè)等你 開(kāi)發(fā)者技術(shù)前線 ,匯集技術(shù)前線快訊和關(guān)注行業(yè)趨勢(shì),大廠干貨,是開(kāi)發(fā)者經(jīng)歷和成長(zhǎng)的優(yōu)秀指南。



