數據庫 之 Mysql複製概念介紹

Master/Slave
mysql

Master: write/read,寫操做都在主節點上操做nginx

Slaves: read,讀操做都是從節點這邊發出 sql

爲何要複製?數據庫

冗餘:promte(提高爲主),異地災備,能夠經過人工或者工具程序(MHA)實現安全

擴展:轉移一部分「讀」請求;服務器

支援安全的備份操做;多線程

測試須要; 架構

主/從架構實現:異步

在主節點上啓用二進制日誌,從節點啓動鏈接線程,請求主節點把這個事件發給本身一份,從節點上有一個線程叫IO Thread,主節點上啓用dump thread,IO Thread從節點將接受到的日誌存儲到中繼日誌,從服務器上的SQL THread負責從中繼日誌裏生成一份數據。這樣的數據同步方式是異步。主服務器負責寫操做,從服務器負責讀操做。ide

主從有可能致使主從數據不一致。如主服務多線程進程,從服務區是單線程進程,有可能致使主從數據不一致,從服務器的數據可能會落後於主服務器,這個問題是不可避免的,只能儘早發現,將不正確的數據手動更改,若是數據差異很大,手動恢復很難,能夠在主服務器上作備份,把數據直接回復到從服務器上。

主服務器存到二進制log,存到從服務器上是異步操做的。傳輸是單向的。可是這裏有個問題,若是寫操做超出主服務器的性能,解決方法,使用雙主模型

主從複製的三種形式:同步複製,異步複製,半同步複製

同步複製:

        雙主模型:寫操做都在本地寫,同步給另外一個節點,放到relay中。

主服務器都要啓動中繼日誌和二進制日誌,全部發給本節點的寫操做,都要記錄到二進制日誌中,並經過dump thread發給對端主服務器,對端主服務器經過io thread將收到的數據存儲到中繼日誌中,並依靠sql thread實現重放。主節點實現了冗餘。每一個節點均可以讀和寫操做。這種操做能夠下降讀請求,每一個服務器負載一半的請求,可是寫操做的請求數量是同樣的,由於,雙主的服務器都要寫入一份數據。

利用中間件的讀寫分離器實現請求讀寫分離,中間件能夠利用keepalive實現冗餘。可是有了雙主模型,就不須要讀寫分離,只須要用haproxy或者nginx或者lvs來實現請求的四層調度將請求調度到不一樣服務器上便可。

mysql主從複製弊端可能運行一段時間後,根據業務邏輯的不同,可能致使主從數據不一致,致使獲得的數據不一致。該狀況在數據要求強一致的狀況下是不容許存在的。

在主服務器上,操做是多線程並行的,可是記錄到二進制文件中是串行記錄,從服務器是單線程運行獲取數據,這樣致使從服務器拉取數據的速度落後於主服務器,致使了數據的差別,久而久之會致使數據嚴重不一致。若是這裏設置讀寫分離,可能致使從服務器上讀出的數據是錯誤的。雙主模型一樣有這個問題。主從數據不一致,建議解決辦法是手動修改數據。若是數據差異太大,將從服務器關閉,在主服務器上作備份,恢復到從服務器上。

異步複製:

一主多從;

一從一主;

級聯複製;一主複製給一從,同時,這個從服務器又是其餘服務器的主,其餘從服務器到這個中繼服務器複製數據,級聯的做用是下降主服務器的壓力。中間的這個從服務器要啓用二進制日誌和中繼日誌,同時,中間這臺從服務器僅起到過渡的做用,不須要保存數據,所以將block hole引擎用於這個中間從服務器上,使得不會產生數據保存,可是中繼日誌和二進制日誌都有正常保存,起到過渡的效果。

循環複製;多主模式下,採用循環複製,可是鏈條更長,可能致使數據落後嚴重。

雙主複製;

半同步複製:

一從多主模型:每一個主服務器提供不一樣的數據庫,master只保證slaves中的一個操做成功,就返回,其餘slave無論。這個功能,是由google爲MYSQL引入的。

相關文章
相關標籤/搜索