【從0-1 千萬級(jí)直播項(xiàng)目實(shí)戰(zhàn)】分布式數(shù)據(jù)庫(kù)選型 | 你還在分庫(kù)分表嗎?

放松時(shí)刻

這里跟大家講個(gè)段子,以前有個(gè)朋友,他在傳統(tǒng)軟件行業(yè),他時(shí)常問我你們互聯(lián)網(wǎng)就一個(gè)App項(xiàng)目,整天迭代來迭代去,還招那么多人去干,有那么多東西做嗎?在他眼里可能我們這種互聯(lián)網(wǎng)App就是上線即巔峰,只要App發(fā)布出去了,就沒程序員啥事了,當(dāng)然要是換以前的我,我可能會(huì)頓時(shí)暴怒并反駁他,但現(xiàn)在作為一個(gè)成熟程序員我并不會(huì)去反駁,因?yàn)槲抑栏v太多也沒有結(jié)果,我就笑笑,問題不大。

業(yè)務(wù)背景

在互聯(lián)網(wǎng)項(xiàng)目中,分布式、高并發(fā)、大數(shù)據(jù)是繞不開的話題,尤其現(xiàn)在容器化,微服務(wù),云原生的概念越來越火,由此誕生了很多 crud-boy sql-boy k8s-boy ... 好了 不廢話 直接說背景 千萬用戶級(jí)別直播項(xiàng)目 先不說其他用戶 先看用戶中心中最基礎(chǔ)的用戶表 在設(shè)計(jì)上至少得超過億級(jí)存儲(chǔ)才能滿足我們系統(tǒng)的需求 這個(gè)時(shí)候怎么做呢? 正常人肯定會(huì)說 分庫(kù)分表啊 ok 確實(shí)能解決問題 但是會(huì)引發(fā)其他的問題 接下來我?guī)湍銈兎治鱿路謳?kù)分表的缺點(diǎn)

依賴中間件

全局分布式事務(wù)已然失效

別想聚合和復(fù)雜join查詢了

大多時(shí)候需要雙寫一份全局?jǐn)?shù)據(jù)到其他nosql型數(shù)據(jù)庫(kù)

擴(kuò)容方式麻煩

加索引加字段蛋疼的要死

重構(gòu)/數(shù)據(jù)遷移改造時(shí)喊爹罵娘

單純以上幾點(diǎn)足以擊潰crud-boys sql-boys 的心理防線,答應(yīng)我千萬不要emo,今天我將帶你們解放雙手,擁抱美好的明天。

分布式數(shù)據(jù)庫(kù)

什么是分布式數(shù)據(jù)庫(kù)?

web2.0時(shí)代以來,國(guó)產(chǎn)數(shù)據(jù)庫(kù)百花齊放,各種海量數(shù)據(jù)存儲(chǔ)需求似乎成為了互聯(lián)網(wǎng)標(biāo)配,同樣的,在當(dāng)下云原生時(shí)代,分布式集群技術(shù)也成為了項(xiàng)目的標(biāo)配。如果你還不了解分布式數(shù)據(jù)庫(kù)的概念,下面一張圖將助你初步認(rèn)識(shí)分布式數(shù)據(jù)庫(kù)


分布式數(shù)據(jù)庫(kù)有什么特征?

1.可靠性

消除了單點(diǎn)故障問題,分布式數(shù)據(jù)庫(kù)系統(tǒng)具有重復(fù)的數(shù)據(jù)構(gòu)成,單機(jī)故障時(shí)整個(gè)服務(wù)仍然能屹立不倒,從而解決了可靠性問題

2.數(shù)據(jù)透明性管理

在分布式系統(tǒng)中,數(shù)據(jù)不是存儲(chǔ)在一片地皮,而是存儲(chǔ)在計(jì)算機(jī)網(wǎng)絡(luò)的多個(gè)地皮上,并且還保證了邏輯上是一個(gè)整體,它們被所有用戶共享,并由一個(gè)全局的 DBMS 統(tǒng)一管理。用戶訪問數(shù)據(jù)時(shí)無須知道數(shù)據(jù)存放在哪片地皮,也不需要知道由分布式系統(tǒng)中的哪些服務(wù)器來完成,從而降低了使用門檻,讓數(shù)據(jù)對(duì)用戶更加透明,管理更加方便。

3.數(shù)據(jù)分布式存儲(chǔ)

現(xiàn)在的數(shù)據(jù)存儲(chǔ)需求都是TB,PB級(jí)別,分布式數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)不受單機(jī)磁盤容量限制,可通過動(dòng)態(tài)增加數(shù)據(jù)服務(wù)器的數(shù)量提升存儲(chǔ)能力

4.計(jì)算存儲(chǔ)分離

計(jì)算節(jié)點(diǎn)無狀態(tài),可通過水平擴(kuò)展增加計(jì)算能力,存儲(chǔ)節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)能夠分層優(yōu)化,不要再被類似單表最多只能存儲(chǔ)XX條數(shù)據(jù)的思維所禁錮。

5.彈性伸縮

可以隨時(shí)隨地的在不影響現(xiàn)有應(yīng)用的情況下,動(dòng)態(tài)對(duì)數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)擴(kuò)縮容,這算是在一定程度上根據(jù)自己的業(yè)務(wù)情況

進(jìn)行成本的控制。

6.多數(shù)據(jù)副本

自動(dòng)將數(shù)據(jù)以強(qiáng)一致、高性能的方式復(fù)制至跨機(jī)房的多個(gè)副本,以保證數(shù)據(jù)99.99999....%可用性

分布式數(shù)據(jù)庫(kù)有哪些?

1.Spanner


Spanner由谷歌的一個(gè)全球級(jí)別的分布式數(shù)據(jù)庫(kù),它管理著全球成百上千個(gè)數(shù)據(jù)中心,數(shù)百萬個(gè)服務(wù)器,將數(shù)萬億數(shù)據(jù)分片存儲(chǔ)到這些服務(wù)器上。

數(shù)據(jù)可以有多個(gè)備份副本,并且可以靈活、細(xì)粒度地配置:副本數(shù)量、副本所在的數(shù)據(jù)中心等,副本甚至可以跨國(guó)家存儲(chǔ),即使面臨大范圍自然災(zāi)害,數(shù)據(jù)依舊可用,真正做到了真正意義上的全球容災(zāi)。

讀和寫操作的外部一致性,以及在一個(gè)時(shí)間戳下跨數(shù)據(jù)庫(kù)的全球一致性操作,這個(gè)特性可以保證一致性備份,以及基于一致性備份的一致性MapReduce操作,以及原子操作。

支持廣域的分布式事務(wù),對(duì)于涉及不同數(shù)據(jù)中心的事務(wù),也能保證ACID特性,有興趣的話大家可以了解下它的殺手锏TrueTime的實(shí)現(xiàn)。

優(yōu)點(diǎn)

99.999%的SLA

自動(dòng)完成數(shù)據(jù)庫(kù)sharding

夸張的擴(kuò)展性,可以擴(kuò)展數(shù)百萬機(jī)器

使用場(chǎng)景

游戲、金融科技、醫(yī)療保健、媒體娛樂行業(yè)

2.TiDB


TiDB Server

TiDB Server 負(fù)責(zé)接收 SQL 請(qǐng)求,處理 SQL 相關(guān)的邏輯,并通過 PD 找到存儲(chǔ)計(jì)算所需數(shù)據(jù)的 TiKV 地址,與 TiKV 交互獲取數(shù)據(jù),返回結(jié)果。 TiDB Server 是無狀態(tài)的,其本身并不存儲(chǔ)數(shù)據(jù),只負(fù)責(zé)計(jì)算,可以無限水平擴(kuò)展,可以通過負(fù)載均衡組件(如LVS、HAProxy 或 F5)對(duì)外提供統(tǒng)一的接入地址。

PD Server

PD Server 是整個(gè)集群的管理模塊,主要工作有三個(gè):

存儲(chǔ)集群的元信息(某個(gè) Key 存儲(chǔ)在哪個(gè) TiKV 節(jié)點(diǎn))

分配全局唯一且遞增的事務(wù)ID

對(duì)TiKV 集群進(jìn)行調(diào)度和負(fù)載均衡

PD Server 是一個(gè)集群,需要部署奇數(shù)個(gè)節(jié)點(diǎn),一般線上推薦部署>=3個(gè)節(jié)點(diǎn)。

TiKV Server

TiKV Server 負(fù)責(zé)存儲(chǔ)數(shù)據(jù),存儲(chǔ)數(shù)據(jù)的基本單位是 Region,每個(gè) Region 負(fù)責(zé)存儲(chǔ)一個(gè) Key Range的數(shù)據(jù),每個(gè) TiKV 節(jié)點(diǎn)會(huì)負(fù)責(zé)多個(gè) Region 。使用 Raft 協(xié)議做復(fù)制,保持?jǐn)?shù)據(jù)的一致性和容災(zāi)。副本以 Region 為單位進(jìn)行管理,不同節(jié)點(diǎn)上的多個(gè) Region 構(gòu)成一個(gè) Raft Group,互為副本。

優(yōu)點(diǎn)

無限水平擴(kuò)展

高可用,TiDB Server/TiKV Server/PD Server 都能容忍部分實(shí)例失效,不影響整個(gè)集群的可用性。

具備良好的MySQL兼容性,業(yè)務(wù)擴(kuò)大可以基本實(shí)現(xiàn)無縫由MySQL切換成TiDB

缺點(diǎn)

硬件要求高

使用成本高

使用場(chǎng)景

互聯(lián)網(wǎng)社交行業(yè)、游戲場(chǎng)景、數(shù)據(jù)倉(cāng)庫(kù)

3.Mongo DB


MongoDB是高性能、可擴(kuò)展、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便的面向集合存儲(chǔ)的數(shù)據(jù)庫(kù)

Config Server

Config Server是MondoDB的配置服務(wù)器,存儲(chǔ)分片集群的元數(shù)據(jù),元數(shù)據(jù)反映了分片集群中所有數(shù)據(jù)和組件的狀態(tài)和組織,Shards還會(huì)從配置服務(wù)器讀取塊元數(shù)據(jù),配置服務(wù)器還存儲(chǔ)身份驗(yàn)證配置信息,例如角色的訪問控制或群集的內(nèi)部身份驗(yàn)證,MongoDB還使用配置服務(wù)器來管理分布式鎖,每個(gè)分片群集必須具有自己的配置服務(wù)器,不要將相同的配置服務(wù)器用于不同的分片群集。

Mongos

Mongos 可以有多個(gè),相當(dāng)于一個(gè)控制中心,負(fù)責(zé)路由和協(xié)調(diào)操作,使得集群像一個(gè)整體的系統(tǒng)。mongos可以運(yùn)行在任何一臺(tái)服務(wù)器上,有些選擇放在shards服務(wù)器上,也有放在client 服務(wù)器上的。mongos啟動(dòng)時(shí)需要從config servers上獲取基本信息,然后接受client端的請(qǐng)求,路由到指定的shards服務(wù)器,然后整理返回的結(jié)果返回給client服務(wù)器。?

Shards

存儲(chǔ)節(jié)點(diǎn),為了保證數(shù)據(jù)的高可用性和一致性,可以是一個(gè)單獨(dú)的實(shí)例,也可以是一個(gè)副本集,在生產(chǎn)環(huán)境下Shard一般是一個(gè)Replica Set,以防止該數(shù)據(jù)片的單點(diǎn)故障。所有Shard中有一個(gè)PrimaryShard,里面包含未進(jìn)行劃分的數(shù)據(jù)集合。

存儲(chǔ)引擎

MongoDB的核心組件,其負(fù)責(zé)管理和組織數(shù)據(jù)采取什么樣的格式存儲(chǔ)在硬盤和內(nèi)存上。在MongoDB3.2版本以前,默認(rèn)的存儲(chǔ)引擎是wiredTiger,在3.2版本之后和4.0版本之前,默認(rèn)的存儲(chǔ)引擎是MMAPv1,在4.0版本之后,默認(rèn)的存儲(chǔ)引擎是In-memory。具體的存儲(chǔ)引擎特性我這邊不多講,有興趣大家可以自己去搜索下。

優(yōu)點(diǎn)

高可用的副本集支持

文檔存儲(chǔ) 業(yè)務(wù)經(jīng)常變動(dòng) 此特性可以讓開發(fā)忽略前期的數(shù)據(jù)的前期設(shè)計(jì)問題

易于查詢 不同于SQL模型 查詢編寫和優(yōu)化比傳統(tǒng)SQL容易得多

支持完全索引,包含內(nèi)部對(duì)象 億級(jí)數(shù)據(jù)下檢索毫秒級(jí)返回成為了現(xiàn)實(shí)

缺點(diǎn)

不支持事務(wù)

不支持reload,只能冷重啟,初始化配置麻煩

使用場(chǎng)景

互聯(lián)網(wǎng)社交行業(yè)、游戲行業(yè)、直播行業(yè)、需求變化/迭代快、不需要事務(wù)操作的業(yè)務(wù)

4.PolarDB

PolarDB是aliyun自主研發(fā)的新一代關(guān)系型云原生數(shù)據(jù)庫(kù),既擁有分布式設(shè)計(jì)的低成本優(yōu)勢(shì),又具有集中式的易用性,采用存儲(chǔ)計(jì)算分離、軟硬一體化設(shè)計(jì),滿足大規(guī)模應(yīng)用場(chǎng)景需求,先看一張它的架構(gòu)圖



一寫多讀

PolarDB采用分布式集群架構(gòu),一個(gè)集群包含一個(gè)主節(jié)點(diǎn)和最多15個(gè)只讀節(jié)點(diǎn)(至少一個(gè),用于保障高可用)。主節(jié)點(diǎn)處理讀寫請(qǐng)求,只讀節(jié)點(diǎn)僅處理讀請(qǐng)求。主節(jié)點(diǎn)和只讀節(jié)點(diǎn)之間采用Active-Active的Failover方式,提供數(shù)據(jù)庫(kù)的高可用服務(wù)。

計(jì)算與存儲(chǔ)分離

PolarDB采用計(jì)算與存儲(chǔ)分離的設(shè)計(jì)理念,滿足公共云計(jì)算環(huán)境下根據(jù)業(yè)務(wù)發(fā)展彈性擴(kuò)展集群的剛性需求。數(shù)據(jù)庫(kù)的計(jì)算節(jié)點(diǎn)(Database Engine Server)僅存儲(chǔ)元數(shù)據(jù),而將數(shù)據(jù)文件、Redo Log等存儲(chǔ)于遠(yuǎn)端的存儲(chǔ)節(jié)點(diǎn)(Database Storage Server)。各計(jì)算節(jié)點(diǎn)之間僅需同步Redo Log相關(guān)的元數(shù)據(jù)信息,極大降低了主節(jié)點(diǎn)和只讀節(jié)點(diǎn)間的復(fù)制延遲,而且在主節(jié)點(diǎn)故障時(shí),只讀節(jié)點(diǎn)可以快速切換為主節(jié)點(diǎn)。

讀寫分離

讀寫分離是PolarDB集群版默認(rèn)提供的一個(gè)透明、高可用、自適應(yīng)的負(fù)載均衡能力。通過集群地址,SQL請(qǐng)求自動(dòng)轉(zhuǎn)發(fā)到PolarDB集群版的各個(gè)節(jié)點(diǎn),提供聚合、高吞吐的并發(fā)SQL處理能力。

高速鏈路互聯(lián)

數(shù)據(jù)庫(kù)的計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)之間采用高速網(wǎng)絡(luò)互聯(lián),并通過RDMA協(xié)議進(jìn)行數(shù)據(jù)傳輸,使I/O性能不再成為瓶頸。

共享分布式存儲(chǔ)

多個(gè)計(jì)算節(jié)點(diǎn)共享一份數(shù)據(jù),而不是每個(gè)計(jì)算節(jié)點(diǎn)都存儲(chǔ)一份數(shù)據(jù),極大降低了用戶的存儲(chǔ)成本。基于全新打造的分布式塊存儲(chǔ)(Distributed Storage)和文件系統(tǒng)(Distributed Filesystem),存儲(chǔ)容量可以在線平滑擴(kuò)展,不會(huì)受到單個(gè)數(shù)據(jù)庫(kù)服務(wù)器的存儲(chǔ)容量限制,可應(yīng)對(duì)上百TB級(jí)別的數(shù)據(jù)規(guī)模。

數(shù)據(jù)多副本、Parallel-Raft協(xié)議

數(shù)據(jù)庫(kù)存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)采用多副本形式,確保數(shù)據(jù)的可靠性,并通過Parallel-Raft協(xié)議保證數(shù)據(jù)的一致性。

優(yōu)點(diǎn)

100%兼容MySQL、PostgreSQL、高度兼容Oracle語法

計(jì)算能力最高可擴(kuò)展至1000核以上,存儲(chǔ)容量最高可達(dá) 100TB

支持列索引(In-Memory Column Index,簡(jiǎn)稱IMCI)功能,支持實(shí)時(shí)事務(wù)級(jí)別行列數(shù)據(jù)一致,列索引結(jié)合SIMD向量化和并行執(zhí)行加速技術(shù),在大數(shù)據(jù)量復(fù)雜查詢場(chǎng)景,相比傳統(tǒng)MySQL獲得百倍以上執(zhí)行性能加速效果。

缺點(diǎn)

不能訪問用戶表,數(shù)據(jù)庫(kù)的功能受限,如果要做DMS可能需要搭配對(duì)應(yīng)的云服務(wù)使用

aliyun老毛病:技術(shù)文檔不規(guī)范

使用場(chǎng)景

適用教育、直播、金融、電商等互聯(lián)網(wǎng)業(yè)務(wù)量快速劇增、讀多寫少的場(chǎng)景

選型方案確定

數(shù)據(jù)庫(kù)性能穩(wěn)定性擴(kuò)展性成本

Spanner強(qiáng)高無敵(可以擴(kuò)展到數(shù)百萬的機(jī)器,數(shù)已百計(jì)的數(shù)據(jù)中心)價(jià)格和硬件要求高

TiDB一般高高價(jià)格和硬件要求高

MongoDB強(qiáng)高一般(適用場(chǎng)景也有限)價(jià)格和硬件要求較高

PolarDB一般高高(彈性擴(kuò)縮容)低 (基于開源MySQL的引擎 價(jià)格和硬件要求低)

由于我們做的是直播社交項(xiàng)目,從各方面去考慮,從0-1做的話優(yōu)先選PolarDB作為分布式數(shù)據(jù)庫(kù)方案。

總結(jié)

分布式數(shù)據(jù)庫(kù)服務(wù)是互聯(lián)網(wǎng)項(xiàng)目非常有必要要引入的架構(gòu)

分布式數(shù)據(jù)庫(kù)雖好,但也需要根據(jù)具體使用場(chǎng)景進(jìn)行選型,切勿盲目忽略實(shí)際情況進(jìn)行選型操作

對(duì)于小企業(yè)/項(xiàng)目來說,其實(shí)也不是一開始就要使用分布式數(shù)據(jù)庫(kù),像PolarDB,是無縫兼容MySQL引擎的,可以先從單機(jī)、主備MySQL服務(wù)先開始用,后期遷移到分布式數(shù)據(jù)庫(kù)其實(shí)也很容易,云原生數(shù)據(jù)庫(kù)本來就是為了滿足用戶擴(kuò)展性、可用性、可移植性方面的要求。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容