日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql异步复制参数_MySQL Replication(异步复制)基本原理

發布時間:2024/7/5 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql异步复制参数_MySQL Replication(异步复制)基本原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、復制進程

Mysql的復制(replication)是一個異步的復制,從一個Mysql

instace(稱之為Master)復制到另一個Mysql

instance(稱之Slave)。實現整個復制操作主要由三個進程完成的,其中兩個進程在Slave(Sql進程和IO進程),另外一個進程在

Master(IO進程)上。

要實施復制,首先必須打開Master端的binary

log(bin-log)功能,否則無法實現。因為整個復制過程實際上就是Slave從Master端獲取該日志然后再在自己身上完全順序的執行日志中所記錄的各種操作。

復制的基本過程如下:

1)、Slave上面的IO進程連接上Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內容;

2)、Master接收到來自Slave的IO進程的請求后,通過負責復制的IO進程根據請求信息讀取制定日志指定位置之后的日志信息,返回給Slave

的IO進程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經到Master端的bin-log文件的名稱以及bin-log的位置;

3)、Slave的IO進程接收到信息后,將接收到的日志內容依次添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的

bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log的哪

個位置開始往后的日志內容,請發給我”;

4)、Slave的Sql進程檢測到relay-log中新增加了內容后,會馬上解析relay-log的內容成為在Master端真實執行時候的那些可執行的內容,并在自身執行。

實際上在老版本的Mysql的復制實現在Slave端并不是兩個進程完成的,而是由一個進程完成。但是后來發現這樣做存在較大的風險和性能問題,主要如下:

首先,一個進程就使復制bin-log日志和解析日志并在自身執行的過程成為一個串行的過程,性能受到了一定的限制,異步復制的延遲也會比較長。

另外,Slave端從Master端獲取bin-log過來之后,需要接著解析日志內容,然后在自身執行。在這個過程中,Master端可能又產生了大量

變化并聲稱了大量的日志。如果在這個階段Master端的存儲出現了無法修復的錯誤,那么在這個階段所產生的所有變更都將永遠無法找回。如果在Slave

端的壓力比較大的時候,這個過程的時間可能會比較長。

所以,后面版本的Mysql為了解決這個風險并提高復制的性能,將Slave端的復制改為兩個進程來完成。提出這個改進方案的人是Yahoo!的一位工程

師“Jeremy

Zawodny”。這樣既解決了性能問題,又縮短了異步的延時時間,同時也減少了可能存在的數據丟失量。當然,即使是換成了現在這樣兩個線程處理以后,同

樣也還是存在slave數據延時以及數據丟失的可能性的,畢竟這個復制是異步的。只要數據的更改不是在一個事物中,這些問題都是會存在的。如果要完全避免

這些問題,就只能用

2、復制實現級別

Mysql的復制可以是基于一條語句(Statement level),也可以是基于一條記錄(Row

level),可以在Mysql的配置參數中設定這個復制級別,不同復制級別的設置會影響到Master端的bin-log記錄成不同的形式。

Row

Level:日志中會記錄成每一行數據被修改的形式,然后在slave端再對相同的數據進行修改。

優點:在row

level模式下,bin-log中可以不記錄執行的sql語句的上下文相關的信息,僅僅只需要記錄那一條記錄被修改了,修改成什么樣了。所以row

level的日志內容會非常清楚的記錄下每一行數據修改的細節,非常容易理解。而且不會出現某些特定情況下的存儲過程,或function,以及

trigger的調用和觸發無法被正確復制的問題。

缺點:row

level下,所有的執行的語句當記錄到日志中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日志內容,比如有這樣一條update語

句:update product set owner_member_id = ‘b’ where owner_member_id =

‘a’,執行之后,日志中記錄的不是這條update語句所對應額事件(

Statement Level:每一條會修改數據的sql都會記錄到

master的bin-log中。slave在復制的時候sql進程會解析成和原來master端執行過的相同的sql來再次執行。

優點:statement level下的優點首先就是解決了row

level下的缺點,不需要記錄每一行數據的變化,減少bin-log日志量,節約IO,提高性能。因為他只需要記錄在Master上所執行的語句的細節,以及執行語句時候的上下文的信息。

缺點:由于他是記錄的執行語句,所以,為了讓這些語句在slave端也能正確執行,那么他還必須記錄每條語句在執行的時候的一些相關信息,也就是上下文信

息,以保證所有語句在slave端杯執行的時候能夠得到和在master端執行時候相同的結果。另外就是,由于Mysql現在發展比較快,很多的新功能不

斷的加入,使

從官方文檔中看到,之前的Mysql一直都只有基于statement的復制模式,直到5.1.5版本的Mysql才開始支持row

level的復制。從5.0開始,Mysql的復制已經解決了大量老版本中出現的無法正確復制的問題。但是由于存儲過程的出現,給Mysql的復制又帶來

了更大的新挑戰。另外,看到官方文檔說,從5.1.8版本開始,Mysql提供了除Statement Level和Row

Level之外的第三種復制模式:Mixed,實際上就是前兩種模式的結合。在Mixed模式下,Mysql會根據執行的每一條具體的sql語句來區分對

待記錄的日志形式,也就是在Statement和Row之間選擇一種。新版本中的Statment

level還是和以前一樣,僅僅記錄執行的語句。而新版本的Mysql中隊row level模式也被做了優化,并不是所有的修改都會以row

level來記錄,像遇到表結構變更的時候就會以statement模式來記錄,如果sql語句確實就是update或者delete等修改數據的語句,

那么還是會記錄所有行的變更。

3、復制常用架構

Mysql復制環境90%以上都是一個Master帶一個或者多個Slave的架構模式,主要用于讀壓力比較大的應用的數據庫端廉價擴展解決方案。因為只

要master和slave的壓力不是太大(尤其是slave端壓力)的話,異步復制的延時一般都很少很少。尤其是自slave端的復制方式改成兩個進程

處理之后,更是減小了slave端的延時。而帶來的效益是,對于數據實時性要求不是特別的敏感度的應用,只需要通過廉價的pc

server來擴展slave的數量,將讀壓力分散到多臺slave的機器上面,即可解決數據庫端的讀壓力瓶頸。這在很大程度上解決了目前很多中小型網站

的數據庫壓力瓶頸問題,甚至有些大型網站也在使用類似方案解決數據庫瓶頸。

一個Master帶多個slave的架構實施非常簡單,多個slave和單個slave的實施并沒有太大區別。在Master端并不care有多少個

slave連上了master端,只要有slave進程通過了連接認證,向他請求binlog信息,他就會按照連接上來的io進程的要求,讀取自己的

binlog信息,返回給slave的IO進程。對于slave的配置細節,在Mysql的官方文檔上面已經說的很清楚了,甚至介紹了多種實現slave

的配置方法。

Mysql不支持一個Slave

instance從屬于多個Master的架構。就是說,一個slave

instance只能接受一個master的同步源,聽說有patch可以改進這樣的功能,但沒有實踐過。Mysql

AB之所以不實現這樣的功能,主要是考慮到沖突解決的問題。

Mysql也可以搭建成dual master模式,也就是說兩個Mysql

instance互為對方的Master,也同時為對方的Slave。不過一般這種架構也是只有一端提供服務,避免沖突問題。因為即使在兩邊執行的修改有

先后順序,由于復制的異步實現機制,同樣會導致即使在晚做的修改也可能會被早做的修改所覆蓋,就像如下情形:

時間點?Mysql

A?Mysql B

1?更新x表y記錄為10

2?更新x表y記錄為20

3?獲取到A日志并應用,更新x表的y記錄為10(不符合期望)

4?獲取B日志更新x表y記錄為20(符合期望)

這樣,不僅在B庫上面的數據不是用戶所期望的結果,A和B兩邊的數據也出現了不一致的情況。除非能將寫操作根據某種條件固定分開在A和B兩端,保證不會交叉寫入,才能夠避免上面的問題。

總結

以上是生活随笔為你收集整理的mysql异步复制参数_MySQL Replication(异步复制)基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。