Mysql集羣原理整理

Mysql集羣整理

申明一下:這個CSDN的新版編輯器還不大會玩,導致不少編輯效果不夠理想,目錄主次區分不夠明顯,還望各位查看時多多擔待.ps:當時做畢業設計的論文要是敢這樣主次不分,得被導師罵死不可(偷笑)….

一. 主從複製概述
在實際生產中,數據的重要性不言而喻,提供安全可靠的數據保障是技術與運維部門的職責所在;如果我們的數據庫只有一臺服務器,那麼很容易產生單點故障的問題,比如這臺服務器訪問壓力過大而沒有響應或者奔潰,那麼服務就不可用了,再比如這臺服務器的硬盤壞了,那麼整個數據庫的數據就全部丟失了,這是重大的安全事故;爲了避免服務的不可用以及保障數據的安全可靠性,我們至少需要部署兩臺或兩臺以上服務器來存儲數據庫數據,也就是我們需要將數據複製多份部署在多臺不同的服務器上,即使有一臺服務器出現故障了,其他服務器依然可以繼續提供服務;主從複製是指服務器分爲主服務器和從服務器,主服務器負責讀和寫,從服務器只負責讀,主從複製也叫 master/slave,master是主,slave是從;

二. 主從複製架構

這是一主多從架構
這裏寫圖片描述
這是雙主雙從架構
這裏寫圖片描述
說明:一般情況下,具體架構還得看數據量大小來定,數據量規模較小的情況下,使用一主一從的架構的較多.一主一從的弊端就是容易出現單點故障,一旦主庫故障便不能進行寫入操作,所以,數據量較大時就需要使用處理高併發的思想來解決問題了,比如:一方面可以做分壓處理(Nginx集羣,MySql集羣等等),一方面可以做異步處理,用時間換空間(ActiveMQ消息隊列).MySql高併發的處理方案就是多主多從,可以極大地提高數據庫的容災能力.

三. 主從複製原理
1. 當 master 主服務器上的數據發生改變時,則將其改變寫入二進制日誌文件中;
2. salve 從服務器會在一定時間間隔內對 master 主服務器上的二進制日誌進行探測,探測其是否發生過改變;
3. 如果探測到 master 主服務器的二進制日誌發生了改變,則開始一個 I/O Thread 請求 master 二進制事件;
4. 同時 master 主服務器爲每個 I/O Thread 啓動一個dump Thread,用於向其發送二進制事件;
5. slave 從服務器將接收到的二進制事件保存至自己本地的中繼日誌文件中;
6. salve 從服務器將啓動 SQL Thread 從中繼日誌中讀取二進制日誌,在本地重放,使得其數據和主服務器保持一致;
7. 最後 I/O Thread 和 SQL Thread 將進入睡眠狀態,等待下一次被喚醒;

MySQL主從複製原理圖
MySQL主從複製原理圖
說明:簡單點講就是:mysql要做到主從複製,就是A服務把自己所做的增刪改的操作全都記錄在日誌中,B數據庫就根據這份日誌上面的操作在自己身上再操作一遍,這樣就實現了主從複製;

如果在不使用中間件mycat的情況下,需要使用spring框架提供的AbstractRoutingDataSource類,通過重寫它的方法,可以實現數據源的切換.

四.MyCat中間件管理Mysql集羣原理

1.Mycat背景
Mycat的前身是阿里巴巴大名鼎鼎的Cobar,Cobar在開源了一段時間後,就沒有再維護了,阿里巴巴放棄了該項目,再加上Cobar在使用過程中也發現存在一些比較嚴重的問題;2013年有人對Cobar這個項目進行了改進,並命名爲Mycat,這就是MyCat的誕生。後來,越來越多的開源愛好者加入到MyCat的開發中,它是完全開源的,不屬於任何商業公司。Mycat發展成爲一個由衆多軟件公司的實力派架構師和資深開發人員維護的社區型開源軟件, 2014年Mycat首次在上海的《中華架構師》大會上對外宣講,更多的人蔘與進來,隨後越來越多的項目採用了Mycat;截至2015年11月,超過300個項目採用Mycat,涵蓋銀行、電信、電子商務、物流、移動應用、O2O的衆多領域和公司;MyCat開源組織致力於開發高性能數據庫中間件而努力,永不收費,永不閉源,持續推動開源社區的發展;

2.Mycat簡介
Mycat是一個開源數據庫中間件;是一個實現了MySQL協議的的數據庫中間件服務器,前端用戶可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生(Native)協議與多個MySQL服務器通信,也可以用JDBC協議與大多數主流數據庫服務器通信;Mycat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在Mycat裏,都是一個傳統的數據庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度。

簡單理解就是: Mycat就是一個近似於MySQL的數據庫服務器,你可以用連接MySQL的方式去連接Mycat(除了端口不同,默認的Mycat端口是8066而非MySQL的3306),大多數情況下,可以用你熟悉的對象映射框架比如MyBatis操作Mycat。

3.Mycat主要作用

a.數據庫的讀寫分離
也就是通過Mycat可以自動實現寫數據時操作主數據庫,讀數據時操作從數據庫;從而實現讀寫分離,當主出現故障後,mycat自動切換到另一個主上,進而提供高可用的數據庫服務,當然我需要部署多主多從的模式.

b.數據庫分庫分表
分庫分表是一個詞,不能拆分去理解,它指的是對數據的拆分;分庫分表分爲兩種:水平拆分和垂直拆分.
這裏僅憑口述我覺得很難敘述清楚,做了兩張簡單的示意圖來說明一下:
這裏寫圖片描述
說明: Mycat的水平拆分是根據表中數據的邏輯關係,將同一個表中的數據按照某種條件拆分到多臺數據庫服務器上面,這種切分稱之爲數據的水平切分,也可以稱爲橫向切分.示意圖中我按照mycat自動生成的主鍵id進行了拆分,將其id按照奇數偶數進行拆分了.mycat自身還定義了其他幾種水平拆分策略,例如按時間戳拆分等等.

水平拆分的好處就是分壓,假設原有數據1000w條操作,只在一張表上進行的話,效率會受到極大地影響,而將原數據表按拆分策略拆分爲幾張表之後,就可以更快地完成操作(每張表可以分擔500w條操作).一般的項目比較少的會使用這個,因爲一張表就有數十千萬的數據量不多見,像淘寶,京東這類使用這種拆分最適合的.水平拆分適合數據量巨大的單表.當然,水平拆分也要注意一些問題,如下.

使用水平拆分時應注意一下幾點:
1.使用水平拆分時只能按照mycat所規定的拆分方式進行拆分,比如:如果你使用UUID或者其他自定義的主鍵則無法使其自動進行拆分了,會產生矛盾.
2.當然,如果只是進行讀寫分離操作則無影響,可以使用自定義的主鍵.

關於水平拆分這裏再放個舉例:水平拆分不是將表做分類,而是按照某個字段的某種規則來分散到多個庫之中,每個表中包含一部分數據。簡單來說,我們可以將數據的水平切分理解爲是按照數據行的切分,就是將表中的某些行切分到一個數據庫,而另外的某些行又切分到其他的數據庫中,如圖:
這裏寫圖片描述

這裏寫圖片描述
說明: Mycat的垂直拆分是按照不同的表來切分到不同的數據庫服務器之上,這種切可以稱之爲數據的垂直切分,也可以稱爲縱向切分;大多數項目的分庫分表都會使用這個方案,方便管理.一般是按照業務維度進行數據庫表的切分;把相同類型的表放在一個數據庫,另一些表放在另一個數據庫;也就是在不同庫建不同表,把表分散到各個數據庫.

相信看到表之後,我不用過多解釋,也能明白什麼意思,假定每個類型的表都有N張,將他們按照所屬類型分別存放到不同的數據庫中,這樣就是垂直拆分,最常使用的一種數據庫分庫分表方案.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章