Mysql 的架構演化

DenPowell 9年前發布 | 7K 次閱讀 MySQL 數據庫服務器

3.1 來自海豚的告白

3.2 單節點數據庫

3.3 一主一從架構

3.4 Master/Slave 復制原理及方式

3.5 一主多從架構

3.6 雙主多從架構

3.7 Mysql Sharding

3.8 小張講解

3.9 課后作業

3.1 來自海豚的告白

"我是一只海豚,我很孤獨,我遨游在我的世界里,有很多人喜歡我,也有很多人厭惡我,可是,我還是我。"

這是一只Mysql 海豚的獨白。

他是那么的清高,那么的傲慢,好像動物世界里的一朵奇葩,正是因為他的輕盈、他的開放,即使他這樣傲慢無理,

還是有很多粉絲的追捧。

幾乎大部分的互聯網公司都會選用Mysql做為數據庫,體現在它的擴展性,mysql 可以架構出一個分布式集群,

相對于oracle 這種大型數據庫來說,他顯得靈活,輕盈,而且他還是開源免費的。

為什么mysql 在互聯網公司那么受到青睞, 因為互聯網公司相對于傳統企業來說,他的數據量增長的很快,單點數據庫

已經無法滿足數據的實時查詢和存儲的要求了,所以需要擴展數據庫架構。

Mysql數據庫架構的演化分為幾個階段:

單節點數據庫

一主一從架構

一主多從架構

雙主多從架構

對比上面的架構圖,來具體看看這幾種架構的區別。

3.2 單節點數據庫

大部分的童鞋接觸到的都是這種單節點的數據庫架構,

一個JAVA程序使用數據庫連接池操作一個數據庫,這個是不是很熟悉,就是J2EE的典型應用。

上點代碼看看,更熟悉一點

架構上面來說就是 一個應用連接一個數據庫 ,十分簡單,也就不多說了,如下圖:

3.3 一主一從架構

隨著互聯網訪問量的迅速增加、以及數據量的增大,單點數據庫會出現延遲,假死,更嚴重的出現崩潰的情況,在用戶端看到的現象會是這樣的

這種情況下,數據庫已經負擔不起這么大的壓力了,海豚自恃清高也沒用,于是有人想出用兩個海豚來解決這個問題,最簡單的就是這種一主一從的架構

兩只海豚

為什么要這樣子來架構呢?

這樣我們先來分析一下 造成系統性能的瓶頸在哪里

從硬件計算機系統來說 , 系統的性能主要取決于

CPU, 內存, 磁盤I/O, 網絡I/O

再仔細分析

內存的 讀寫速度 是 24165M/s

機械硬盤的讀寫速度 在100M/s

網絡帶寬一般機房可以到 千兆帶寬

很明顯我們可以看出, 硬盤的讀寫速度跟內存 相差200多倍

很容易找出,我們系統的瓶頸在硬盤讀寫這一塊,當然這里只是簡單的推理

也有一些專業的工具對其進行測試

現在我們有兩個方法來解決這個問題:

1. 提高硬盤的讀寫速度,讓其達到內存的速度

2. 分攤壓力,把硬盤讀寫的壓力分攤到不同的節點上面

第一個方法那是硬盤廠商的事情了,我們控制不了,當然現在市面上也有讀寫快的,例如固態硬盤可以選配

我們要說的就是如何用現有的硬件來解決問題,也就是第二種方法。

我們再來分析業務:

數據庫的操作 insert  , delete ,update ,select

在正式的生產環境中,我們會發現,對比insert  寫的操作,用戶更多的在 select  查詢上面的操作.

例如: 我們經常瀏覽新聞、逛淘寶,還在看我寫的這篇文章,這些都是在 進行 讀查詢.

那么我們一主一從的架構 就是 讓應用從 2個節點上面讀取, 來進行分攤壓力,

而這種從兩個節點上面讀取的策略 可以 通過 負載均衡來實現,意思就是說 如果有10個請求過來

把5個讀的請求轉發到 A 節點, 另外5個轉發到B節點上面。

那么這個一主一從是如何實現的呢?

可以通過 MySQL replication 復制的方式來做

選定一個節點的MySQL作為 master

另外一個節點的MySQL作為 slave

插入更新數據 我們通過 master 完成 ,

master 會通過 replication 的方式來完成 對 slave 的同步更新.

這時 slave 就會有相同的數據, 應用就可以通過 從 slave 讀取數據 來減輕 master 的壓力.

3.4 Master/Slave 復制原理及方式

1. Master 所有的數據更新會記錄到 日志 binlog 中,Master A 把binlog日志傳給 Slave B

2. B 先把 A 的binlog日志 放到 稱為 relaylog 中繼日志的 地方

3. 最后 B 通過relaylog 日志中的內容對自己的binlog 進行更新,復制數據。

從這種機制上我們可以看出,可以保證A 和 B 的數據一致,但是同步或許會有延時(不考慮網絡因素)

A 的執行可以并發執行, 等A 的 binlog 日志寫 到 B 的 relaylog ,然后 B 從relaylog 讀取復制到binlog

這個過程中會發生延時.

于是出現了

同步復制 的方式 :

同步復制 是  用戶在前端訪問,Master收到 insert 請求,這個時候 需要 等待 slave 復制完成后確認,

才能返回結果給用戶,

顯然這種方式不可取,因為會造成用戶請求變的很慢的情況。

而這種方式也不是 MySQL的默認方式。

異步復制:

Master 只要完成自己的數據更新就返回結果給 用戶,

而同步在異步狀態下進行。 MySQL 默認設置。

半同步復制:

即是 如果slave 有很多個 , 也是后面講的 一主多從的 架構下, master只要保證 其中一個slave 同步復制成功,

就返回結果給用戶端。

3.5 一主多從架構

一主一從 是 一主多從 架構中的特例, 一主一從學會了,很容易理解 一主多從的架構了

在Mysql 的配置上面區別不大,后面實戰進行架構的搭建會講到。

這里就不衍生開了。

3.6 雙主多從架構

為什么會有雙主多從架構出現呢,肯定是為了解決某種問題而產生的。

是的,當我們用了一主多從架構以后,我們會發現一個致命的問題, 當我有5個節點,

肯定是 1個Master ,另外4 個是 slave , 這個時候 master 就相當于是中心領導的地位,

他這么重要,如果master 崩掉了怎么辦,整個系統就不能正常運行了,

這個時候采用 雙主多從,來用副領導保證。

就像master1 是一個總經理, 如果總經理不舒服或者有事走開了

這個時候就由 master2 副總 來接替他的工作。

3.7 Mysql Sharding

master-slave 這種架構,不管是 一主多從 還是 雙主多從,我們發現他的性能瓶頸是在

master 上面,整個系統也并不是可以通過增加master 來達到性能的倍數增長的。

slave 越多,master 復制到 slave 的 日志越多,master 的負擔就越重,同步的延時就越大

會出現讀取到臟數據,以及數據不一致的問題。

問題出現了,新的架構也隨之而來。

一種分表分庫的分布式架構就出現了。

簡單來講,分表分庫 不是 在master 和 slave 之間進行數據復制 以減輕 讀的壓力。

而是把數據內容進行切分,分別放到不同的節點上  。

例如 : 現在有10個用戶的數據

master-slave 的做法是 復制10個用戶的數據到 slave 下面去,這個時候整個系統就有10 * N個slave的數據量了。

而 分表分庫則是  其中5個用戶數據放到 A 節點上 , 另外5個用戶數據放到B節點上,整個系統數據還是10個數據量。

這里簡單講這些,詳細的放到后面章節中來講。

在分表分庫我們用Mycat 中間件, 在每個節點的分庫中 ,我們還可以采用Master-Slave 這種架構 作為 混合架構使用。

3.8 小張講解

讀寫分離

通過MySQL replication 我們可以復制數據到不同的數據庫中, 但是上面講到讀取需要從不同的節點中讀取,

還要有策略作負載均衡,這個功能邏輯就需要應用來進行實現。(應用要連接不同的數據庫節點,分離讀寫)

市面上有很多成熟的中間件可以實現 負載均衡、讀寫分離,例如:MySQL-Proxy ,

應用層可以像 剛開始那樣代碼不變,所有的 讀寫分離工作交給 MySQL-Proxy中間件來實現。

MySQL replication

下一節中 ,我們具體來動手來做一個一主一從這種架構,通過配置MySQL的 replication ,以及在應用層進行

負載均衡、讀寫分離的實現,用最輕的方式來進行性能的最大提升。

3.9 課后作業

1. 什么是一主一從?

2. 同步有哪幾種方式?

3. 實驗:

> 安裝centos 7 操作系統

> 安裝mysql5.7 數據庫

> 進行一主一從的Mysql 數據庫架構

> 應用層實現一個DEMO , 進行讀寫分離以及負載均衡

 

 

 

來自:http://www.jianshu.com/p/2e6b4e0f2ee5

 

 本文由用戶 DenPowell 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!