IM開發基礎知識補課(三):快速理解服務端資料庫讀寫分離原理及實踐建議
本文正文部分引用了58同城架師沈劍的文章,非常感謝他的分享。
1、前言
IM應用從服務端資料的角度來看,它是一種很特殊的應用場景,拋開基礎資料、增值業務和附屬功能不談,單從IM聊天工具的立身之本——聊天資料來說,理論上是不需要在服務端儲存的(或者說只需要短暫儲存——比如離線訊息,上線即拉走),這也是為什麼微信在前段時間號稱絕不儲存使用者聊天資料的原因(從技術上說這不是沒有道理的,但到底有沒有儲存,這已經超越技術範疇了,不在此文討論之列 ^_^)。
那麼為什麼說IM系統的服務端從技術上說,是不需要儲存聊天資料的呢?
原因很簡單,我們知道IM的聊天資料分兩種:
1)一種是實時訊息(就是你線上,對方也線上情況下的聊天資料互動);
2)一種是離線訊息(就是你線上,對方不線上時,你發過去的訊息,對於對方而言就是離線訊息了)。
實時訊息的收發:服務端只作為中轉角色(關於中轉的技術問題,很多人可能還在結糾老思維為何不用P2P,我已經論壇說爛了,說白了跟技術無關,其實一個很重要的原因就是為了運營的可控性:比如使用者P2P去了,違法的鍋你運營方來背好不好?),聊天訊息在此時就相當於左手倒右手——即聊天資料的本質就是從A使用者經過服務端到達B使用者就完了,服務端完全沒必要儲存(當然,我們討論的是技術理想情況,實際上拋開技術因素來說,這麼多豐富的使用者行為資料你是運營方你會放過嗎?但,這跟技術無關對吧)。
離線訊息的收發:當接收方不線上時,傳送方的聊天資料在服務端只需要作短因果報應儲存,因為接收方一旦上線就拉走了,伺服器刪除即可(注意:從技術上來說就是這樣的哦)。對使用者而言聊天訊息的社會學的本質來說就像兩個人在對話,我已經聽見你說的就好了,幹嗎老像復讀機一樣一遍一遍一說給我聽?
正如上述所言,IM系統中最重要的聊天資料從技術上不說其實是沒有儲存的必要的。不過話雖如此,但一個大型的IM系統的方方面面資料量也是很可觀的,所以開發IM系統時討論服務端資料庫的讀寫分離、水平分表等,是很有必要的。因而通過本文快速理解服務端資料庫的讀寫分離原理你不應錯過,本文也同時建議您在正確理解它的前提下再慎重決定您的服務端架構方案是否需要資料庫讀寫分離,因為很多時候增加快取策略就能解決的問題,就沒有必在大炮打蚊子了。
好了,費話多說了幾句,我們開始閱讀正文。
學習交流:
– 即時通訊開發交流群:320837163[推薦]
– 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM》
(本文同步釋出於:http://www.52im.net/thread-1366-1-1.html)
2、相關文章
▼ 跟IM資料儲存架構有關的文章,有如下幾篇,或許對你有用:
《騰訊原創分享(一):如何大幅提升行動網路下手機QQ的圖片傳輸速度和成功率》
《微信海量使用者背後的後臺系統儲存架構(視訊+PPT) [附件下載]》
▼ IM開發乾貨系列文章適合作為IM開發熱點問題參考資料(本文是其第12篇):
《IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞》
《一種Android端IM智慧心跳演算法的設計與實現探討(含樣例程式碼)》
《IM開發基礎知識補課(一):正確理解前置HTTP SSO單點登陸介面的原理》
《IM開發基礎知識補課(二):如何設計大量圖片檔案的服務端儲存架構?》
《IM開發基礎知識補課(三):快速理解服務端資料庫讀寫分離原理及實踐建議》(本文)
如果您是IM開發初學者,強烈建議首先閱讀《新手入門一篇就夠:從零開發移動端IM》。
3、什麼是資料庫讀寫分離?
如上圖所示,一主多從、讀寫分離、主動同步,是一種常見的資料庫架構。
一般來說:
1)主庫——提供資料庫寫服務;
2)從庫——提供資料庫讀服務。
3)主從庫之間,通過某種機制同步資料,例如mysql的binlog。
4)像上述圖中這樣,一個主從同步叢集通常被稱為一個“分組”。
那麼,資料庫“分組”架構究竟解決什麼問題?
大部分網際網路業務讀多寫少,資料庫的讀往往最先成為效能瓶頸,如果希望:
1)線性提升資料庫讀效能;
2)通過消除讀寫鎖衝突提升資料庫寫效能;
3)此時可以使用分組架構。
一句話總結:“分組”主要解決“資料庫讀效能瓶頸”問題,在資料庫扛不住讀的時候,用“分組”架構實現讀寫分離,通過增加從庫線性提升系統讀效能。
4、什麼是資料庫水平切分?
如上圖所示,跟資料庫“分組”架構實現讀寫分離一樣,水平切分(也稱大表拆分、分表),也是一種常見的資料庫架構手段。
一般來說:
1)每個資料庫之間沒有資料重合,沒有類似binlog同步的關聯;
2)所有資料並集,組成全部資料;
3)會用演算法,來完成資料分割,例如“取模”;
4)一個水平切分叢集中的每一個資料庫,通常稱為一個“分片”。
水平切分架構究竟解決什麼問題?
大部分網際網路業務資料量很大,單庫容量容易成為瓶頸,如果希望:
1)線性降低單庫資料容量;
2)線性提升資料庫寫效能;
3)此時可以使用水平切分架構。
一句話總結:資料庫水平切分架構主要解決“資料庫資料量大”(或者更細一點說是單表資料量太大)問題,在資料庫容量扛不住的時候,通常水平切分。
5、資料庫讀寫分離雖好,但不應濫用
對於網際網路大資料量、高併發量、高可用要求高、一致性要求高、前端面向使用者的業務場景,如果資料庫讀寫分離:
1)資料庫連線池需要區分:讀連線池,寫連線池;
2)如果要保證讀高可用,讀連線池要實現故障自動轉移;
3)有潛在的主庫從庫一致性問題。
實際上,如果您的系統面臨的是“讀效能瓶頸”問題,增加快取可能來得更直接,更容易一點。
另外,從成本上說,從庫的成本比快取高不少。而且對於雲上的架構,以阿里云為例,主庫提供高可用服務,從庫不提供高可用服務,實現方案上更主流。
所以,上述業務場景下,建議使用快取架構來加強系統讀效能,替代資料庫主從分離架構。
當然,使用快取架構的潛在問題:如果快取掛了,流量全部壓到資料庫上,資料庫會雪崩。不過幸好,雲上的快取一般都提供高可用的服務。
6、簡單小結
典型的大型互聯應用架構中,服務端資料庫架構主要使用以下兩種:
1)使用“分組”架構實現資料庫讀寫分離:解決“資料庫讀效能瓶頸”問題;
2)使用“分片”架構實現資料庫水平切分:解決“資料庫資料量大”問題。
但對於網際網路大資料量、高併發量、高可用要求高、一致性要求高、前端面向使用者的業務場景,使用微服務快取架構,很多時候可能比資料庫讀寫分離架構更合適。
附錄:更多IM開發文章
[1] 有關IM架構設計:
《一套海量線上使用者的移動端IM架構設計實踐分享(含詳細圖文)》
《騰訊QQ1.4億線上使用者的技術挑戰和架構演進之路PPT》
《IM開發基礎知識補課(二):如何設計大量圖片檔案的服務端儲存架構?》
>> 更多同類文章 ……
[2] 有關IM安全的文章:
《即時通訊安全篇(一):正確地理解和使用Android端加密演算法》
《即時通訊安全篇(四):例項分析Android中金鑰硬編碼的風險》
《即時通訊安全篇(五):對稱加密技術在Android平臺上的應用實踐》
《傳輸層安全協議SSL/TLS的Java平臺實現簡介和Demo演示》
《理論聯絡實際:一套典型的IM通訊協議設計詳解(含安全層設計)》
《微信新一代通訊安全解決方案:基於TLS1.3的MMTLS詳解》
《來自阿里OpenIM:打造安全可靠即時通訊服務的技術實踐分享》
《Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例程式碼)》
>> 更多同類文章 ……
[3] IM開發綜合文章:
《IM開發基礎知識補課:正確理解前置HTTP SSO單點登陸介面的原理》
《IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞》
《開源IM工程“蘑菇街TeamTalk”的現狀:一場有始無終的開源秀》
《QQ音樂團隊分享:Android中的圖片壓縮技術詳解(上篇)》
《QQ音樂團隊分享:Android中的圖片壓縮技術詳解(下篇)》
《騰訊原創分享(一):如何大幅提升行動網路下手機QQ的圖片傳輸速度和成功率》
《騰訊原創分享(二):如何大幅壓縮行動網路下APP的流量消耗(上篇)》
《騰訊原創分享(二):如何大幅壓縮行動網路下APP的流量消耗(下篇)》
《如約而至:微信自用的移動端IM網路層跨平臺元件庫Mars已正式開源》
《基於社交網路的Yelp是如何實現海量使用者圖片的無失真壓縮的?》
>> 更多同類文章 ……
(本文同步釋出於:http://www.52im.net/thread-1366-1-1.html)
相關文章
- IM開發基礎知識補課:正確理解前置HTTPSSO單點登陸介面的原理HTTP
- IM開發基礎知識補課(二):如何設計大量圖片檔案的服務端儲存架構?服務端架構
- IM開發基礎知識補課(四):正確理解HTTP短連線中的Cookie、Session和TokenHTTPCookieSession
- 資料庫讀寫分離資料庫
- IM開發基礎知識補課(十):大型IM系統有多難?萬字長文,搞懂異地多活!
- AJAX基礎知識及核心原理詳解。前後端分離和不分離的優勢與弊端後端
- 資料庫的讀寫分離資料庫
- 大資料資料庫讀寫分離分庫分表大資料資料庫
- 夯實基礎系列三:資料庫知識總結資料庫
- Spring實現資料庫讀寫分離Spring資料庫
- MySQL資料庫基礎知識及優化MySql資料庫優化
- 資料庫基礎知識資料庫
- Spring Aop實現資料庫讀寫分離Spring資料庫
- StoneDB 讀寫分離實踐方案
- Mycat讀寫分離配置實踐
- 客戶服務知識庫最佳實踐指南
- 資料庫讀寫分離Master-Slave資料庫AST
- Discuz!NT資料庫讀寫分離方案資料庫
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- 基礎知識梳理~資料庫資料庫
- 資料庫基礎重要知識資料庫
- GEO資料庫基礎知識資料庫
- Laravel讀寫分離原理Laravel
- mysql讀寫分離的最佳實踐MySql
- [TEAP早期試讀]NoSQL資料庫的基礎知識SQL資料庫
- C#資料庫事務原理及實踐(上)C#資料庫
- C#資料庫事務原理及實踐(下)C#資料庫
- 深度:微服務化的資料庫設計與讀寫分離微服務資料庫
- 貨拉拉大資料離線混合引擎服務建設實踐大資料
- 快速掌握JavaScript面試基礎知識(三)JavaScript面試
- 基於 webpack 的前後端分離開發環境實踐Web後端開發環境
- ProxySQL簡介原理及讀寫分離應用SQL
- 資料庫治理利器:動態讀寫分離資料庫
- 資料庫基礎知識介紹!資料庫
- 資料庫基礎知識講解資料庫
- NoSQL資料庫的基礎知識SQL資料庫
- 開發基礎知識
- golang saas框架,資料庫級別隔離、讀寫分離Golang框架資料庫