【從0-1 千萬級直播項目實戰】分布式數據庫選型 | 你還在分庫分表嗎?

放松時刻

這里跟大家講個段子,以前有個朋友,他在傳統軟件行業,他時常問我你們互聯網就一個App項目,整天迭代來迭代去,還招那么多人去干,有那么多東西做嗎?在他眼里可能我們這種互聯網App就是上線即巔峰,只要App發布出去了,就沒程序員啥事了,當然要是換以前的我,我可能會頓時暴怒并反駁他,但現在作為一個成熟程序員我并不會去反駁,因為我知道跟他講太多也沒有結果,我就笑笑,問題不大。

業務背景

在互聯網項目中,分布式、高并發、大數據是繞不開的話題,尤其現在容器化,微服務,云原生的概念越來越火,由此誕生了很多 crud-boy sql-boy k8s-boy ... 好了 不廢話 直接說背景 千萬用戶級別直播項目 先不說其他用戶 先看用戶中心中最基礎的用戶表 在設計上至少得超過億級存儲才能滿足我們系統的需求 這個時候怎么做呢? 正常人肯定會說 分庫分表啊 ok 確實能解決問題 但是會引發其他的問題 接下來我幫你們分析下分庫分表的缺點

依賴中間件

全局分布式事務已然失效

別想聚合和復雜join查詢了

大多時候需要雙寫一份全局數據到其他nosql型數據庫

擴容方式麻煩

加索引加字段蛋疼的要死

重構/數據遷移改造時喊爹罵娘

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

分布式數據庫

什么是分布式數據庫?

web2.0時代以來,國產數據庫百花齊放,各種海量數據存儲需求似乎成為了互聯網標配,同樣的,在當下云原生時代,分布式集群技術也成為了項目的標配。如果你還不了解分布式數據庫的概念,下面一張圖將助你初步認識分布式數據庫


分布式數據庫有什么特征?

1.可靠性

消除了單點故障問題,分布式數據庫系統具有重復的數據構成,單機故障時整個服務仍然能屹立不倒,從而解決了可靠性問題

2.數據透明性管理

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

3.數據分布式存儲

現在的數據存儲需求都是TB,PB級別,分布式數據庫的數據存儲不受單機磁盤容量限制,可通過動態增加數據服務器的數量提升存儲能力

4.計算存儲分離

計算節點無狀態,可通過水平擴展增加計算能力,存儲節點和計算節點能夠分層優化,不要再被類似單表最多只能存儲XX條數據的思維所禁錮。

5.彈性伸縮

可以隨時隨地的在不影響現有應用的情況下,動態對數據存儲節點擴縮容,這算是在一定程度上根據自己的業務情況

進行成本的控制。

6.多數據副本

自動將數據以強一致、高性能的方式復制至跨機房的多個副本,以保證數據99.99999....%可用性

分布式數據庫有哪些?

1.Spanner


Spanner由谷歌的一個全球級別的分布式數據庫,它管理著全球成百上千個數據中心,數百萬個服務器,將數萬億數據分片存儲到這些服務器上。

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

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

支持廣域的分布式事務,對于涉及不同數據中心的事務,也能保證ACID特性,有興趣的話大家可以了解下它的殺手锏TrueTime的實現。

優點

99.999%的SLA

自動完成數據庫sharding

夸張的擴展性,可以擴展數百萬機器

使用場景

游戲、金融科技、醫療保健、媒體娛樂行業

2.TiDB


TiDB Server

TiDB Server 負責接收 SQL 請求,處理 SQL 相關的邏輯,并通過 PD 找到存儲計算所需數據的 TiKV 地址,與 TiKV 交互獲取數據,返回結果。 TiDB Server 是無狀態的,其本身并不存儲數據,只負責計算,可以無限水平擴展,可以通過負載均衡組件(如LVS、HAProxy 或 F5)對外提供統一的接入地址。

PD Server

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

存儲集群的元信息(某個 Key 存儲在哪個 TiKV 節點)

分配全局唯一且遞增的事務ID

對TiKV 集群進行調度和負載均衡

PD Server 是一個集群,需要部署奇數個節點,一般線上推薦部署>=3個節點。

TiKV Server

TiKV Server 負責存儲數據,存儲數據的基本單位是 Region,每個 Region 負責存儲一個 Key Range的數據,每個 TiKV 節點會負責多個 Region 。使用 Raft 協議做復制,保持數據的一致性和容災。副本以 Region 為單位進行管理,不同節點上的多個 Region 構成一個 Raft Group,互為副本。

優點

無限水平擴展

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

具備良好的MySQL兼容性,業務擴大可以基本實現無縫由MySQL切換成TiDB

缺點

硬件要求高

使用成本高

使用場景

互聯網社交行業、游戲場景、數據倉庫

3.Mongo DB


MongoDB是高性能、可擴展、易部署、易使用,存儲數據非常方便的面向集合存儲的數據庫

Config Server

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

Mongos

Mongos 可以有多個,相當于一個控制中心,負責路由和協調操作,使得集群像一個整體的系統。mongos可以運行在任何一臺服務器上,有些選擇放在shards服務器上,也有放在client 服務器上的。mongos啟動時需要從config servers上獲取基本信息,然后接受client端的請求,路由到指定的shards服務器,然后整理返回的結果返回給client服務器。?

Shards

存儲節點,為了保證數據的高可用性和一致性,可以是一個單獨的實例,也可以是一個副本集,在生產環境下Shard一般是一個Replica Set,以防止該數據片的單點故障。所有Shard中有一個PrimaryShard,里面包含未進行劃分的數據集合。

存儲引擎

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

優點

高可用的副本集支持

文檔存儲 業務經常變動 此特性可以讓開發忽略前期的數據的前期設計問題

易于查詢 不同于SQL模型 查詢編寫和優化比傳統SQL容易得多

支持完全索引,包含內部對象 億級數據下檢索毫秒級返回成為了現實

缺點

不支持事務

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

使用場景

互聯網社交行業、游戲行業、直播行業、需求變化/迭代快、不需要事務操作的業務

4.PolarDB

PolarDB是aliyun自主研發的新一代關系型云原生數據庫,既擁有分布式設計的低成本優勢,又具有集中式的易用性,采用存儲計算分離、軟硬一體化設計,滿足大規模應用場景需求,先看一張它的架構圖



一寫多讀

PolarDB采用分布式集群架構,一個集群包含一個主節點和最多15個只讀節點(至少一個,用于保障高可用)。主節點處理讀寫請求,只讀節點僅處理讀請求。主節點和只讀節點之間采用Active-Active的Failover方式,提供數據庫的高可用服務。

計算與存儲分離

PolarDB采用計算與存儲分離的設計理念,滿足公共云計算環境下根據業務發展彈性擴展集群的剛性需求。數據庫的計算節點(Database Engine Server)僅存儲元數據,而將數據文件、Redo Log等存儲于遠端的存儲節點(Database Storage Server)。各計算節點之間僅需同步Redo Log相關的元數據信息,極大降低了主節點和只讀節點間的復制延遲,而且在主節點故障時,只讀節點可以快速切換為主節點。

讀寫分離

讀寫分離是PolarDB集群版默認提供的一個透明、高可用、自適應的負載均衡能力。通過集群地址,SQL請求自動轉發到PolarDB集群版的各個節點,提供聚合、高吞吐的并發SQL處理能力。

高速鏈路互聯

數據庫的計算節點和存儲節點之間采用高速網絡互聯,并通過RDMA協議進行數據傳輸,使I/O性能不再成為瓶頸。

共享分布式存儲

多個計算節點共享一份數據,而不是每個計算節點都存儲一份數據,極大降低了用戶的存儲成本。基于全新打造的分布式塊存儲(Distributed Storage)和文件系統(Distributed Filesystem),存儲容量可以在線平滑擴展,不會受到單個數據庫服務器的存儲容量限制,可應對上百TB級別的數據規模。

數據多副本、Parallel-Raft協議

數據庫存儲節點的數據采用多副本形式,確保數據的可靠性,并通過Parallel-Raft協議保證數據的一致性。

優點

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

計算能力最高可擴展至1000核以上,存儲容量最高可達 100TB

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

缺點

不能訪問用戶表,數據庫的功能受限,如果要做DMS可能需要搭配對應的云服務使用

aliyun老毛病:技術文檔不規范

使用場景

適用教育、直播、金融、電商等互聯網業務量快速劇增、讀多寫少的場景

選型方案確定

數據庫性能穩定性擴展性成本

Spanner強高無敵(可以擴展到數百萬的機器,數已百計的數據中心)價格和硬件要求高

TiDB一般高高價格和硬件要求高

MongoDB強高一般(適用場景也有限)價格和硬件要求較高

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

由于我們做的是直播社交項目,從各方面去考慮,從0-1做的話優先選PolarDB作為分布式數據庫方案。

總結

分布式數據庫服務是互聯網項目非常有必要要引入的架構

分布式數據庫雖好,但也需要根據具體使用場景進行選型,切勿盲目忽略實際情況進行選型操作

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容