1. 程式人生 > >IM開發基礎知識補課(三):快速理解服務端資料庫讀寫分離原理及實踐建議

IM開發基礎知識補課(三):快速理解服務端資料庫讀寫分離原理及實踐建議

1、前言

IM應用從服務端資料的角度來看,它是一種很特殊的應用場景,拋開基礎資料、增值業務和附屬功能不談,單從IM聊天工具的立身之本——聊天資料來說,理論上是不需要在服務端儲存的(或者說只需要短暫儲存——比如離線訊息,上線即拉走),這也是為什麼微信在前段時間號稱絕不儲存使用者聊天資料的原因(從技術上說這不是沒有道理的,但到底有沒有儲存,這已經超越技術範疇了,不在此文討論之列 ^_^)。那麼為什麼說IM系統的服務端從技術上說,是不需要儲存聊天資料的呢?原因很簡單,我們知道IM的聊天資料分兩種:  

  • 一種是實時訊息(就是你線上,對方也線上情況下的聊天資料互動);
  • 一種是離線訊息(就是你線上,對方不線上時,你發過去的訊息,對於對方而言就是離線訊息了)。

實時訊息的收發:服務端只作為中轉角色(關於中轉的技術問題,很多人可能還在結糾老思維為何不用P2P,我已經論壇說爛了,說白了跟技術無關,其實一個很重要的原因就是為了運營的可控性:比如使用者P2P去了,違法的鍋你運營方來背好不好?),聊天訊息在此時就相當於左手倒右手——即聊天資料的本質就是從A使用者經過服務端到達B使用者就完了,服務端完全沒必要儲存(當然,我們討論的是技術理想情況,實際上拋開技術因素來說,這麼多豐富的使用者行為資料你是運營方你會放過嗎?但,這跟技術無關對吧)。離線訊息的收發:當接收方不線上時,傳送方的聊天資料在服務端只需要作短因果報應儲存,因為接收方一旦上線就拉走了,伺服器刪除即可

(注意:從技術上來說就是這樣的哦)。對使用者而言聊天訊息的社會學的本質來說就像兩個人在對話,我已經聽見你說的就好了,幹嗎老像復讀機一樣一遍一遍一說給我聽?正如上述所言,IM系統中最重要的聊天資料從技術上不說其實是沒有儲存的必要的。不過話雖如此,但一個大型的IM系統的方方面面資料量也是很可觀的,所以開發IM系統時討論服務端資料庫的讀寫分離、水平分表等,是很有必要的。因而通過本文快速理解服務端資料庫的讀寫分離原理你不應錯過,本文也同時建議您在正確理解它的前提下再慎重決定您的服務端架構方案是否需要資料庫讀寫分離,因為很多時候增加快取策略就能解決的問題,就沒有必在大炮打蚊子了。好了,費話多說了幾句,我們開始閱讀正文。

2、相關文章

▼ 跟IM資料儲存架構有關的文章,有如下幾篇,或許對你有用:

  • 《騰訊原創分享(一):如何大幅提升行動網路下手機QQ的圖片傳輸速度和成功率》
  • 《微信海量使用者背後的後臺系統儲存架構(視訊+PPT) [附件下載]》
  • 《微信後臺基於時間序的海量資料冷熱分級架構設計實踐》
  • 《現代IM系統中聊天訊息的同步和儲存方案探討》

IM開發乾貨系列文章適合作為IM開發熱點問題參考資料

3、什麼是資料庫讀寫分離?

164724nh3tttzv3j0in87j.png (233Ã202)

如上圖所示,一主多從、讀寫分離、主動同步,是一種常見的資料庫架構。一般來說:  

  • 主庫——提供資料庫寫服務;
  • 從庫——提供資料庫讀服務。

主從庫之間,通過某種機制同步資料,例如mysql的binlog。像上述圖中這樣,一個主從同步叢集通常被稱為一個“分組”。那麼,資料庫“分組”架構究竟解決什麼問題?大部分網際網路業務讀多寫少,資料庫的讀往往最先成為效能瓶頸,如果希望:  

  • 線性提升資料庫讀效能;
  • 通過消除讀寫鎖衝突提升資料庫寫效能;
  • 此時可以使用分組架構。

一句話總結:“分組”主要解決“資料庫讀效能瓶頸”問題,在資料庫扛不住讀的時候,用“分組”架構實現讀寫分離,通過增加從庫線性提升系統讀效能。

4、什麼是資料庫水平切分?

165219opo02oozspr2xv81.png (215Ã124)

如上圖所示,跟資料庫“分組”架構實現讀寫分離一樣,水平切分(也稱大表拆分、分表),也是一種常見的資料庫架構手段。一般來說:  

  • 每個資料庫之間沒有資料重合,沒有類似binlog同步的關聯;
  • 所有資料並集,組成全部資料;
  • 會用演算法,來完成資料分割,例如“取模”;

一個水平切分叢集中的每一個數據庫,通常稱為一個“分片”。水平切分架構究竟解決什麼問題?大部分網際網路業務資料量很大,單庫容量容易成為瓶頸,如果希望:  

  • 線性降低單庫資料容量;
  • 線性提升資料庫寫效能;
  • 此時可以使用水平切分架構。

一句話總結:資料庫水平切分架構主要解決“資料庫資料量大”(或者更細一點說是單表資料量太大)問題,在資料庫容量扛不住的時候,通常水平切分。

5、資料庫讀寫分離雖好,但不應濫用

對於網際網路大資料量、高併發量、高可用要求高、一致性要求高、前端面向用戶的業務場景,如果資料庫讀寫分離:  

  • 資料庫連線池需要區分:讀連線池,寫連線池;
  • 如果要保證讀高可用,讀連線池要實現故障自動轉移;
  • 有潛在的主庫從庫一致性問題。

165645qqzjwfqtq4jywtd5.png (200Ã176)

實際上,如果您的系統面臨的是“讀效能瓶頸”問題,增加快取可能來得更直接,更容易一點。另外,從成本上說,從庫的成本比快取高不少。而且對於雲上的架構,以阿里云為例,主庫提供高可用服務,從庫不提供高可用服務,實現方案上更主流。所以,上述業務場景下,建議使用快取架構來加強系統讀效能,替代資料庫主從分離架構。當然,使用快取架構的潛在問題:如果快取掛了,流量全部壓到資料庫上,資料庫會雪崩。不過幸好,雲上的快取一般都提供高可用的服務。

6、簡單小結

典型的大型互聯應用架構中,服務端資料庫架構主要使用以下兩種:  

  • 使用“分組”架構實現資料庫讀寫分離:解決“資料庫讀效能瓶頸”問題;
  • 使用“分片”架構實現資料庫水平切分:解決“資料庫資料量大”問題。

但對於網際網路大資料量、高併發量、高可用要求高、一致性要求高、前端面向用戶的業務場景,使用微服務快取架構,很多時候可能比資料庫讀寫分離架構更合適。

網易雲信,你身邊的即時通訊和音視訊技術專家,瞭解我們,請戳網易雲信官網

想要閱讀更多行業洞察和技術乾貨,請關注網易雲信部落格

本文轉載自52im,作者:JackJiang