天天看點

http://blog.51cto.com/hongchen99/1936473

<code>mysql複制的優點:</code>

<code>    </code><code>1</code><code>、資料分布</code>

<code>    </code><code>2</code><code>、資料備份</code>

<code>    </code><code>3</code><code>、負載均衡</code>

<code>    </code><code>4</code><code>、提示高可用性</code>

mysql/slave

master/slave較為簡單,master負責響應用戶端的寫請求,slave負責響應用戶端的讀請求

實作原理:

    slave在啟動兩個線程,i/o線程和sql線程,master啟動dump線程,每當master的資料發生改變時,master就會将對應的SQL語句存儲在二進制日志檔案中,slave的通過i/o線程連接配接master的dump線程并每個一段時間就會向master詢問二進制檔案是否發生改變,如果二進制檔案發生改變slave的i/o線程就會去讀取二進制檔案中發生改變的内容存儲在本地的中繼日志中并通過sql線程對中繼日志的内容進行回放,并記錄本次讀取到的二進制檔案位置,完成複制。

存在問題:

    1、master壓力過大

    2、master當機之後将無法完成使用者寫請求

    3、節點資料可能不一緻

    4、預設使用異步複制方式

    5、延遲

     延遲的原因:

            1、 slave節點過多,master會為每個slave打開一個dump線程

            2、 并發寫請求操作,由于mysql支援并發請求,如果多個寫請求同時到達,将會将這些寫操作都記錄在二進制日志中,但在寫入二進制檔案時隻能通過串行寫入

            3、 slave通過i/o線程讀取二進制檔案并寫入中繼日志是也隻能通過串行寫入

master/master

master/master的出現正好解決了master/slave中如果master當機之後使用者的寫請求無法完成的問題,但同時引入了比master/slave更多的問題,實作原理基本和master/slave相同,隻需要在兩台master中分别啟動二進制日志和中繼日志即可

注意問題:

    1、 避免主鍵重複

    2、 server-id全局唯一

    1、 經常出現兩台master資料不一緻(存在巨大風險)

    2、 主鍵沖突

    3、 延遲

級聯複制

<a href="https://s4.51cto.com/wyfs02/M02/98/87/wKiom1k9_7iQGpVOAAHcuRx_k8o670.png" target="_blank"></a>

    在有些應用場景中,可能讀寫壓力差别比較大,讀壓力特别的大,一個Master可能需要上10台甚至更多的Slave才能夠支撐注讀的壓力。這時候,Master就會比較吃力了,因為僅僅連上來的SlaveIO線程就比較多了,這樣寫的壓力稍微大一點的時候,Master端因為複制就會消耗較多的資源,很容易造成複制的延時。這時候我們就可以利用MySQL可以在Slave端記錄複制所産生變更的BinaryLog資訊的功能,也就是打開log_slave_update選項。然後,通過二級(或者是更多級别)複制來減少Master端因為複制所帶來的壓力。

    這種多層級聯複制的架構,很容易就解決了Master端因為附屬Slave太多而成為瓶頸的風險。

但下面階級過多同一個變更傳到最底層的Slave所需要經過的MySQL也會更多,同樣可能造成延時較長的風險

    1、可能導緻延遲更為嚴重

    2、借助于BlackHole存儲引擎(黑洞引擎)

半同步複制

     mysql複制方式:

        異步:将二進制日志發送給slave不等待slave回應直接傳回給用戶端,資料儲存成功

        同步:将二進制日志發送給slave等待所有slave回應執行成功後傳回給用戶端,資料儲存成功

        半同步:将二進制日志發送給slave等待一個slave回應執行成功後傳回給用戶端,資料儲存成功

本文轉自  紅塵世間  51CTO部落格,原文連結:http://blog.51cto.com/hongchen99/1934414