埋在MYSQL數據庫應用中的17個關鍵問題!

Mysql 的使用非常普遍,跟mysql有關的話題也非常多,如性能優化、高可用性、強一致性、安全、備份、集群、橫向擴展、縱向擴展、負載均衡、讀寫分離等。要想掌握其中的精髓,可得花費不少功力,雖然目前流行的mysql替代方案有很多,可是從最小成本最容易維護的角度而言,mysql還是首選。

下面從應用場景的角度切入,對mysql的技術點進行組織,寫一份知識圖譜。

如下圖整理,試著把 Mysql 的應用場景分為6種,每種場景下需要考慮的重點問題不一樣,從而引出不同問題點下需要補齊的知識點。

一、單Master

埋在MYSQL數據庫應用中的17個關鍵問題!


單Master的情況是普遍存在的,對於很多個人站點、初創公司、小型內部系統,考慮到成本、更新頻率、系統重要性等問題,系統只依賴一個單例數據庫提供服務,基本上已經滿足需求。這種場景下我覺得重點應該關注的話題有上圖所示的四點。

其中最重要的環節是數據備份,如果是交易量非常低,並且具有非常明確的服務時間段特性的話,簡單的mysqldump是可以勝任的。但是這是有缺陷的,數據還原之後註定從備份點到還原點之間的數據會丟失。然而在極多數的情況下,備份的工作是沒法馬虎的,如下列舉的幾點小細節,下學期將分享更多操作性的文章。

1)冷備:停機,直接copy物理文件,InnoDB引擎(frm文件、共享表空間文件、獨立表空間文件、重做日誌文件、my.cnf)。

恢復:把文件copy到對應目錄。

2)熱備: Ibbackup或者XtraBackup工具,記錄重做日誌文件檢查點的LSN,copy共享表空間文件以及獨立表空間文件(不產生任何阻塞),記錄copy後重做日誌文件檢查點的LSN,copy備份是產生的重做日誌。

恢復:恢復表空間文件,應用重做日誌文件。

3)溫備:mysqldump,--single-transaction參數進行事務管理保證數據一致性。備份時不能用DDL語句。 恢復:直接執行文件,mysql –uroot –p

二進制半同步複製,主從服務器增量複製

恢復:mysqlbinlog

二、一主一從

埋在MYSQL數據庫應用中的17個關鍵問題!


考慮一主一從的多數初衷是系統性能和系統高可用性問題,除了單Master場景中的備份工作需要做好以外,還有性能優化、讀寫分離、負載均衡三項重點工作需要考慮。

其中性能優化的內容比較多,也是一塊大主題,要從系統的服務指標作為依據採取相應的動作,多數系統要求的是3秒內完成請求,總體換算下來,數據庫大概可以有1.5秒的總執行時間,能滿足這個性能要求就是合理的優化方案。

三、一主 n 從

埋在MYSQL數據庫應用中的17個關鍵問題!


一旦開始考慮一主多從的服務器架構,則證明你的系統對可用性、一致性、性能中一種或者多種的要求比較高。好多系統在開始搭建的時候都會往這個方向看齊,畢竟這樣“看起來”系統會健壯很多。

不過其實並不能單單依靠mysql的配置和mysql自帶的中間件來解決可用性、一致性方面的問題。

四、橫向集群

埋在MYSQL數據庫應用中的17個關鍵問題!


系統龐大到需要分庫分表,其實是一件可喜可賀的事情,但是切記的是要前面提到性能優化工作做到極致之後才好考慮這些會增加系統複雜度的解決方案。

橫向集群主要是從業務特性的角度對系統進行切分,最徹底就是切分成了各個子系統,子系統之間通過一些數據同步的方案來把一些核心數據進行共享,以避免跨庫調用跨庫join。

然後是各種系統接口調用,把大事務拆成小事務,事務之間做好隔離和同步。上圖中的三個問題在橫向集群的架構體系中應屬於很有特色的問題,在實際項目中其實是儘量去避免這些需求的存在的,不過如果確實需要了,也得有解決方案。

五、縱向集群

埋在MYSQL數據庫應用中的17個關鍵問題!


橫向集群的切分思路最終是切分子系統,而縱向集群最後遇到的最棘手的問題是擴縮容,之前運維的一個系統是提前對數據做了256個切片,256切片中0~127切片和128~255切片分別存在兩個一主兩從的數據庫集群中,系統運維了3年多,目前還沒有擴容需求。設計初衷應該是考慮得到,假設有一天數據量非常大,可以把256個切片分4大片,分別存儲到4個一主兩從的集群中,從而實現擴容。

這個思路的確是可取的,只是我們的分庫邏輯當前是php代碼實現,也有一定程度上影響了業務代碼的邏輯,運維起來有點心驚膽戰,還是保持業務代碼清爽比較好。


分享到:


相關文章: