放松時(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ò)展性、可用性、可移植性方面的要求。