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

jsjsjjs發表於2018-01-26

本文正文部分引用了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開發乾貨系列文章適合作為IM開發熱點問題參考資料(本文是其第12篇):

IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞

IM訊息送達保證機制實現(二):保證離線訊息的可靠投遞

如何保證IM實時訊息的“時序性”與“一致性”?

IM單聊和群聊中的線上狀態同步應該用“推”還是“拉”?

IM群聊訊息如此複雜,如何保證不丟不重?

一種Android端IM智慧心跳演算法的設計與實現探討(含樣例程式碼)

移動端IM登入時拉取資料如何作到省流量?

通俗易懂:基於叢集的移動端IM接入層負載均衡方案分享

淺談移動端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系統的架構設計

簡述移動端IM開發的那些坑:架構設計、通訊協議和客戶端

一套海量線上使用者的移動端IM架構設計實踐分享(含詳細圖文)

一套原創分散式即時通訊(IM)系統理論架構方案

從零到卓越:京東客服即時通訊系統的技術架構演進歷程

蘑菇街即時通訊/IM伺服器開發之架構選擇

騰訊QQ1.4億線上使用者的技術挑戰和架構演進之路PPT

微信後臺基於時間序的海量資料冷熱分級架構設計實踐

微信技術總監談架構:微信之道——大道至簡(演講全文)

如何解讀《微信技術總監談架構:微信之道——大道至簡》

快速裂變:見證微信強大後臺架構從0到1的演進歷程(一)

17年的實踐:騰訊海量產品的技術方法論

移動端IM中大規模群訊息的推送如何保證效率、實時性?

現代IM系統中聊天訊息的同步和儲存方案探討

IM開發基礎知識補課(二):如何設計大量圖片檔案的服務端儲存架構?

>> 更多同類文章 ……

[2] 有關IM安全的文章:

即時通訊安全篇(一):正確地理解和使用Android端加密演算法

即時通訊安全篇(二):探討組合加密演算法在IM中的應用

即時通訊安全篇(三):常用加解密演算法與通訊安全講解

即時通訊安全篇(四):例項分析Android中金鑰硬編碼的風險

即時通訊安全篇(五):對稱加密技術在Android平臺上的應用實踐

即時通訊安全篇(六):非對稱加密技術的原理與應用實踐

傳輸層安全協議SSL/TLS的Java平臺實現簡介和Demo演示

理論聯絡實際:一套典型的IM通訊協議設計詳解(含安全層設計)

微信新一代通訊安全解決方案:基於TLS1.3的MMTLS詳解

來自阿里OpenIM:打造安全可靠即時通訊服務的技術實踐分享

簡述實時音視訊聊天中端到端加密(E2EE)的工作原理

移動端安全通訊的利器——端到端加密(E2EE)技術詳解

Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例程式碼)

通俗易懂:一篇掌握即時通訊的訊息傳輸安全原理

>> 更多同類文章 ……

[3] IM開發綜合文章:

IM開發基礎知識補課:正確理解前置HTTP SSO單點登陸介面的原理

移動端IM中大規模群訊息的推送如何保證效率、實時性?

移動端IM開發需要面對的技術問題

開發IM是自己設計協議用位元組流好還是字元流好?

請問有人知道語音留言聊天的主流實現方式嗎?

IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞

IM訊息送達保證機制實現(二):保證離線訊息的可靠投遞

如何保證IM實時訊息的“時序性”與“一致性”?

一個低成本確保IM訊息時序的方法探討

IM單聊和群聊中的線上狀態同步應該用“推”還是“拉”?

IM群聊訊息如此複雜,如何保證不丟不重?

談談移動端 IM 開發中登入請求的優化

移動端IM登入時拉取資料如何作到省流量?

淺談移動端IM的多點登陸和訊息漫遊原理

完全自已開發的IM該如何設計“失敗重試”機制?

通俗易懂:基於叢集的移動端IM接入層負載均衡方案分享

微信對網路影響的技術試驗及分析(論文全文)

即時通訊系統的原理、技術和應用(技術論文)

開源IM工程“蘑菇街TeamTalk”的現狀:一場有始無終的開源秀

QQ音樂團隊分享:Android中的圖片壓縮技術詳解(上篇)

QQ音樂團隊分享:Android中的圖片壓縮技術詳解(下篇)

騰訊原創分享(一):如何大幅提升行動網路下手機QQ的圖片傳輸速度和成功率

騰訊原創分享(二):如何大幅壓縮行動網路下APP的流量消耗(上篇)

騰訊原創分享(二):如何大幅壓縮行動網路下APP的流量消耗(下篇)

如約而至:微信自用的移動端IM網路層跨平臺元件庫Mars已正式開源

基於社交網路的Yelp是如何實現海量使用者圖片的無失真壓縮的?

>> 更多同類文章 ……

(本文同步釋出於:http://www.52im.net/thread-1366-1-1.html


相關文章