一主多從,主從同步辑畦,讀寫分離數(shù)據(jù)庫架構(gòu)
本質(zhì)是對數(shù)據(jù)的全量復(fù)制冗余,適用于讀多寫少的大部分業(yè)務(wù)場景腿倚,而且這種架構(gòu)不僅適用于數(shù)據(jù)庫,其他IO場景也能使用蚯妇。
- 多個(gè)從庫提供讀服務(wù)敷燎,線性提升讀數(shù)據(jù)的性能。
- 因?yàn)樽x寫不在同一個(gè)庫上發(fā)生箩言,就沒有讀寫鎖的存在硬贯,提升寫數(shù)據(jù)的性能,本質(zhì)是擴(kuò)展獨(dú)立的IO服務(wù)數(shù)量(設(shè)備數(shù))減少IO競爭陨收。
- 全量復(fù)制也增加了高可用饭豹。
這里可以延伸下鸵赖,數(shù)據(jù)IO的共享,就會牽涉到并發(fā)吞吐能力拄衰,就會牽涉到競爭和鎖它褪,就會影響性能。在這里提供性能翘悉,就是通過水平擴(kuò)展IO的能力方式之一茫打。
全量復(fù)制數(shù)據(jù)相比增量復(fù)制數(shù)據(jù),增加了同步數(shù)據(jù)復(fù)雜性妖混,但也更加提高了讀性能老赤。
水平切分
分庫優(yōu)于分表,分表還是在一個(gè)數(shù)據(jù)庫文件上分享IO制市,還是存在IO競爭抬旺;而且分庫能夠方便遷移到不同的數(shù)據(jù)庫服務(wù)器上,擴(kuò)展性更好祥楣。(第1點(diǎn)也是一主多從解決的痛點(diǎn)开财,第2點(diǎn)則是數(shù)據(jù)庫關(guān)于庫和表2種粒度的特性決定)
分片的問題在于每片的部分?jǐn)?shù)據(jù)之間不能緊耦合。(緊耦合帶來的問題就是需要請求2次增加了RT荣堰,還要做額外的聚合計(jì)算床未,這個(gè)也是數(shù)據(jù)庫特性導(dǎo)致,關(guān)系數(shù)據(jù)庫原生的關(guān)系計(jì)算只適用于一張庫的全量表上)
水平切分最大的問題是針對非切分字段的條件查詢需要遍歷所有庫振坚,影響性能薇搁。
數(shù)據(jù)庫查詢分為點(diǎn)查詢(通常用戶端發(fā)起)和 批量分頁查詢(通常運(yùn)營端發(fā)起)。
2.1 點(diǎn)查詢解決非切分字段思路:
- 建立非切分字段和切分字段的索引表渡八,先通過索引表查詢到映射的切分字段啃洋,再定位相應(yīng)庫的位置。索引表可以根據(jù)字段數(shù)據(jù)量決定單庫還是分庫屎鳍。缺點(diǎn)在于多一次查詢宏娄。
- 在非切分字段上加工生成切分字段(目前系統(tǒng)就是采用這種方式,但不是所有非切分字段都適用)逮壁。
2.2 批量分頁查詢解決思路:
批量分頁查詢特點(diǎn):訪問計(jì)算量大孵坚,返回?cái)?shù)據(jù)量大,占用數(shù)據(jù)庫性能高窥淆。另外卖宠,運(yùn)營端查詢維度各式各樣,往往要建各種索引忧饭,影響用戶端寫數(shù)據(jù)的性能扛伍。
避免低效批量查詢引發(fā)用戶端查詢抖動(dòng),另外創(chuàng)建備庫词裤,運(yùn)營端查詢對于數(shù)據(jù)實(shí)時(shí)性要求較低刺洒,可以通過消息或者線下方式異步同步數(shù)據(jù)鳖宾,不影響熱點(diǎn)前端業(yè)務(wù)流程。
如果數(shù)據(jù)量非常大逆航,復(fù)制數(shù)據(jù)成本過高鼎文,關(guān)系型數(shù)據(jù)庫查詢性能無法滿足需求,可以考慮外置索引elasticSearch纸泡,或者大數(shù)據(jù)處理hive漂问。
水平切分解決了最大的痛點(diǎn)就是單庫容量的問題,同一主多從的線性提升讀性能基礎(chǔ)上女揭,水平切分線性提升了寫的性能蚤假。(很好理解,因?yàn)楠?dú)立IO數(shù)增加了吧兔;但是因?yàn)椴皇侨繑?shù)據(jù)磷仰,所以所謂的線性提升也僅僅是讀寫不同分片的數(shù)據(jù)場景,這點(diǎn)還是不如一主多從的讀境蔼。至于單機(jī)瓶頸是因?yàn)闀r(shí)代技術(shù)原因所限灶平,和設(shè)計(jì)無關(guān))
常見的水平切分算法有“范圍法”和“哈希法”。
范圍法優(yōu)點(diǎn):擴(kuò)容簡單箍土。
范圍法缺點(diǎn):切分字段要滿足遞增逢享;數(shù)據(jù)分布不均勻,同時(shí)導(dǎo)致了請求分布不均勻吴藻。
哈希法的優(yōu)缺點(diǎn)和范圍法正好相反瞒爬。
4.1 哈希法最佳實(shí)踐:基因法 (分庫基因 % 分庫庫數(shù))
在一對多場景下,一個(gè)批次對應(yīng)多筆訂單沟堡。先通過批次號最后4個(gè)bit決定落地到哪個(gè)數(shù)據(jù)庫的批次表里侧但,此時(shí)分庫基因就是這4個(gè)bit。在生成訂單號的時(shí)候航罗,先生成除最后4位的前幾位禀横,將分庫基因加到最后4位bit,使用相同的切分算法就能落到和批次表同一個(gè)數(shù)據(jù)庫里了粥血。
上述場景必須先外部批次號生成柏锄,外部訂單號才能生成;反過來根據(jù)訂單號確定分庫基因有些麻煩复亏。
垂直切分
熱點(diǎn)小字段和長尾大字段分開切分绢彤,保證數(shù)據(jù)庫緩存能夠存儲更多的熱點(diǎn)數(shù)據(jù),增減緩存命中率蜓耻。適用于特殊的業(yè)務(wù)表。