1. 程式人生 > >Mysql叢集原理整理

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張,將他們按照所屬型別分別存放到不同的資料庫中,這樣就是垂直拆分,最常使用的一種資料庫分庫分表方案.