1.3 萬億條數(shù)據(jù)查詢,如何做到毫秒級響應(yīng)?
知乎,在古典中文中意為“你知道嗎?”,它是中國的 Quora,一個問答網(wǎng)站,其中各種問題由用戶社區(qū)創(chuàng)建,回答,編輯和組織。
作為中國最大的知識共享平臺,我們目前擁有 2.2 億注冊用戶,3000 萬個問題,網(wǎng)站答案超過 1.3 億。
隨著用戶群的增長,我們的應(yīng)用程序的數(shù)據(jù)大小無法實現(xiàn)。我們的 Moneta 應(yīng)用程序中存儲了大約 1.3 萬億行數(shù)據(jù)(存儲用戶已經(jīng)閱讀過的帖子)。
由于每月累計產(chǎn)生大約 1000?億行數(shù)據(jù)且不斷增長,這一數(shù)字將在兩年內(nèi)達到 3 萬億。在保持良好用戶體驗的同時,我們在擴展后端方面面臨嚴峻挑戰(zhàn)。
在這篇文章中,我將深入探討如何在如此大量的數(shù)據(jù)上保持毫秒級的查詢響應(yīng)時間,以及 TiDB 是一個開源的 MySQL 兼容的 NewSQL 混合事務(wù)/分析處理( HTAP)數(shù)據(jù)庫,如何為我們提供支持獲得對我們數(shù)據(jù)的實時洞察。
我將介紹為什么我們選擇 TiDB,我們?nèi)绾问褂盟覀儗W(xué)到了什么,優(yōu)秀實踐以及對未來的一些想法。?
| 我們的痛點
系統(tǒng)架構(gòu)要求
需要高可用性數(shù)據(jù):Post Feed 是第一個出現(xiàn)的屏幕,它在推動用戶流量到知乎方面發(fā)揮著重要作用。 處理巨大的寫入數(shù)據(jù):例如,在高峰時間每秒寫入超過 4 萬條記錄,記錄數(shù)量每天增加近 30?億條記錄。 長期存儲歷史數(shù)據(jù):目前,系統(tǒng)中存儲了大約 1.3 萬億條記錄。隨著每月累積約 1000?億條記錄并且不斷增長,歷史數(shù)據(jù)將在大約兩年內(nèi)達到 3 萬億條記錄。 處理高吞吐量查詢:在高峰時間,系統(tǒng)處理平均每秒在 1200?萬個帖子上執(zhí)行的查詢。 將查詢的響應(yīng)時間限制為 90 毫秒或更短:即使對于執(zhí)行時間最長的長尾查詢,也會發(fā)生這種情況。 容忍誤報:這意味著系統(tǒng)可以為用戶調(diào)出許多有趣的帖子,即使有些帖子被錯誤地過濾掉了。
高可用性:當(dāng)用戶打開知乎的推薦頁面時,找到大量已經(jīng)閱讀過的帖子是一種糟糕的用戶體驗。 出色的系統(tǒng)性能:我們的應(yīng)用具有高吞吐量和嚴格的響應(yīng)時間要求。 易于擴展:隨著業(yè)務(wù)的發(fā)展和應(yīng)用程序的發(fā)展,我們希望我們的系統(tǒng)可以輕松擴展。
勘探
為了構(gòu)建具有上述功能的理想架構(gòu),我們在之前的架構(gòu)中集成了三個關(guān)鍵組件:
代理:這會將用戶的請求轉(zhuǎn)發(fā)給可用節(jié)點,并確保系統(tǒng)的高可用性。 緩存:這暫時處理內(nèi)存中的請求,因此我們并不總是需要處理數(shù)據(jù)庫中的請求。這可以提高系統(tǒng)性能。 存儲:在使用 TiDB 之前,我們在獨立的 MySQL 上管理我們的業(yè)務(wù)數(shù)據(jù)。隨著數(shù)據(jù)量的激增,獨立的 MySQL 系統(tǒng)還不夠。 然后我們采用了 MySQL 分片和 Master High Availability Manager( MHA)的解決方案,但是當(dāng)每月有 1000?億條新記錄涌入我們的數(shù)據(jù)庫時,這個解決方案是不可取的。
MySQL Sharding 和?MHA?的缺點
MySQL 分片的缺點:
應(yīng)用程序代碼變得復(fù)雜且難以維護。 更改現(xiàn)有的分片鍵很麻煩。 升級應(yīng)用程序邏輯會影響應(yīng)用程序的可用性。
MHA 的缺點:
我們需要通過編寫腳本或使用第三方工具來實現(xiàn)虛擬 IP(VIP)配置。 MHA 僅監(jiān)視主數(shù)據(jù)庫。 要配置 MHA,我們需要配置無密碼安全 Shell( SSH)。這可能會導(dǎo)致潛在的安全風(fēng)險。 MHA 不為從屬服務(wù)器提供讀取負載平衡功能。 MHA 只能監(jiān)視主服務(wù)器(而不是從主服務(wù)器)是否可用。
| 什么是 TiDB?

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

頂層:無狀態(tài)和可伸縮的客戶端 API 和代理。這些組件易于擴展。 中間層:軟狀態(tài)組件和分層 Redis 緩存作為主要部分。當(dāng)服務(wù)中斷時,這些組件可以通過恢復(fù)保存在 TiDB 群集中的數(shù)據(jù)來自我恢復(fù)服務(wù)。 底層:TiDB 集群存儲所有有狀態(tài)數(shù)據(jù)。它的組件高度可用,如果節(jié)點崩潰,它可以自我恢復(fù)其服務(wù)。
TiDB 的性能指標(biāo)




| 我們學(xué)到了什么
更快地導(dǎo)入數(shù)據(jù)
減少查詢延遲
有些查詢對查詢延遲很敏感,有些則不然。我們部署了一個單獨的 TiDB 數(shù)據(jù)庫來處理對延遲敏感的查詢。(其他非延遲敏感的查詢在不同的 TiDB 數(shù)據(jù)庫中處理。) 這樣,大型查詢和對延遲敏感的查詢在不同的數(shù)據(jù)庫中處理,前者的執(zhí)行不會影響后者。 對于沒有理想執(zhí)行計劃的查詢,我們編寫了 SQL 提示來幫助執(zhí)行引擎選擇最佳執(zhí)行計劃。 我們使用低精度時間戳 Oracle( TSO)和預(yù)處理語句來減少網(wǎng)絡(luò)往返。
| 對?TiDB 3.0 的期望

④gRPC 和多線程?Raftstore 中的批處理消息
⑤SQL?計劃管理
⑥TiFlash
⑦反垃圾郵件應(yīng)用程序中的 TiDB 3.0
| 下一步是什么
我們決定參與開發(fā)開源工具,并參與社區(qū)的長期發(fā)展?;谖覀兣c PingCAP 的共同努力,TiDB 將變得更加強大。
END
推薦閱讀 一鍵生成Springboot & Vue項目!【畢設(shè)神器】
Java可視化編程工具系列(一)
Java可視化編程工具系列(二)
順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,
GitHub地址:https://github.com/javadevbooks/books
Gitee地址:
電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點一個star,持續(xù)更新中..

