這篇文章主要介紹“MySQL的binlog怎么用”,在日常操作中,相信很多人在mysql的binlog怎么用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”mysql的binlog怎么用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)是專(zhuān)業(yè)的蠡縣網(wǎng)站建設(shè)公司,蠡縣接單;提供成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行蠡縣網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
既然我們可以模仿Mysql的主從復(fù)制來(lái)完成我們的需求,那么我們需要先了解一下mysql主從的原理,如下圖所示:
?Stpe 1: 作為master的mysql需要在每個(gè)事務(wù)更新數(shù)據(jù)完成之前,將該操作記錄串行地寫(xiě)入到binlog文件中,存儲(chǔ)在本地磁盤(pán)中。
?Step 2: 在我們的salve服務(wù)器中開(kāi)啟一個(gè)I/O Thread,它會(huì)不斷的從binlog中讀取如果讀取。如果進(jìn)度已經(jīng)跟上了master,就進(jìn)入睡眠狀態(tài)并等待master產(chǎn)生新的事件。所有讀取的數(shù)據(jù)都會(huì)寫(xiě)到Relay log(中繼日志)中。?Step 3:SQL Thread會(huì)讀取中繼日志,并順序執(zhí)行該日志中的SQL事件,從而與主數(shù)據(jù)庫(kù)中的數(shù)據(jù)保持一致。
在主從復(fù)制中過(guò)程中,其中最為重要的就是binlog,從庫(kù)會(huì)根據(jù)binlog的信息從而來(lái)復(fù)制出一份主庫(kù)的數(shù)據(jù)。
如果我們能在業(yè)務(wù)代碼中拿到binlog,通過(guò)binlog的數(shù)據(jù),復(fù)制到redis或者es中,那我們就完全不用擔(dān)心數(shù)據(jù)的一致性的問(wèn)題了。
binlog(Binary Log)顧名思義就是Mysql中二進(jìn)制的日志,記錄了Mysql對(duì)數(shù)據(jù)庫(kù)執(zhí)行更改的所有操作。binlog也是server層產(chǎn)生的日志和我們的存儲(chǔ)引擎沒(méi)有關(guān)系,不論你使用哪種存儲(chǔ)引擎,都可以使用我們的binlog。
在binlog中有三種格式,分別是:Statement
,Row
, Mixed
三種,可以通過(guò)show variables like 'binlog_format'
進(jìn)行查看當(dāng)前數(shù)據(jù)庫(kù)的binlog格式,如下圖所示就是一個(gè)Row格式的binlog:
Statement也就是語(yǔ)句類(lèi)型,他會(huì)記錄每一條修改數(shù)據(jù)的Sql到binlog中。
?優(yōu)點(diǎn):空間占比是最小的,不會(huì)記錄沒(méi)有修改的字段。相比其他模式減少了很多的日志亮,提高I/O性能。?缺點(diǎn):異構(gòu)系統(tǒng)不方便使用,比如redis緩存復(fù)制的時(shí)候,很難模擬mysql的從操作,需要數(shù)據(jù)重查一次。并且slave也會(huì)有問(wèn)題,比如使用一些UUID函數(shù),slave重放的時(shí)候并不能保證兩邊是一致的。我們可以查看下Statement的日志內(nèi)容到底是什么?我們這里可以輸入命令:show master status;
查看我們當(dāng)前master正在使用的binlog,如下圖:
然后再使用命令show binlog events in 'mysql-bin.000003'
, 查看這個(gè)日志中的內(nèi)容是什么:我們可以發(fā)現(xiàn)我們所有的操作都會(huì)在一個(gè)完整的事務(wù)中進(jìn)行,如果事務(wù)沒(méi)有提交是不會(huì)出現(xiàn)在我們的binlog當(dāng)中的,這個(gè)大家可以下來(lái)進(jìn)行實(shí)驗(yàn)一下,我們?cè)跀?shù)據(jù)庫(kù)中的更新原始sql都會(huì)被完全的記錄下來(lái)。
Row模式和Statement不同,他會(huì)記錄每一行被修改后的所有的數(shù)據(jù):
?優(yōu)點(diǎn):異構(gòu)系統(tǒng)也能比較方便的同步數(shù)據(jù),并且不會(huì)出現(xiàn)UUID函數(shù)的那種問(wèn)題,無(wú)論什么情況都能被復(fù)制。?缺點(diǎn):數(shù)據(jù)量比較多,比如update語(yǔ)句,他還會(huì)記錄更新前的每一個(gè)字段和更新后的每一個(gè)字段。造成日志量比較大,對(duì)I/O有一定的影響。
同樣的我們也查看一下其中的內(nèi)容:
在show binlog events in 'mysql-bin.000004'
命令中,我們發(fā)現(xiàn)在事務(wù)中是查看不了我們具體的數(shù)據(jù)的,這個(gè)時(shí)候就需要我們工具幫忙了mysqlbinlog,他也在mysql的bin目錄下我們直接調(diào)用就好了,輸入命令/usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -v mysql-bin.000004
,我們可以看見(jiàn):
這里展示的是一個(gè)update語(yǔ)句,他不僅顯示了原始值,也展示了修改后的值。
這里要注意的是binlog_row_image
用于決定row是否會(huì)記錄原始值,默認(rèn)是FULL代表會(huì)記錄,也就是我們上面的這種情況,還有個(gè)參數(shù)是minimal,代表只記錄更新后的值。
在mixed模式下,MySQL默認(rèn)仍然采用statement格式進(jìn)行記錄,但是一旦它判斷可能會(huì)有數(shù)據(jù)不一致的情況(UUID函數(shù))發(fā)生,則會(huì)采用row格式來(lái)記錄。
我們目前默認(rèn)使用的是Row模式,在Row模式下可以比較方便的將數(shù)據(jù)異構(gòu),其實(shí)Row模式對(duì)I/O影響在業(yè)務(wù)當(dāng)中來(lái)說(shuō)感知并不是特別明顯。
當(dāng)我們知道binlog是什么之后,我們就需要怎么去使用這個(gè)binlog。binlog的同步工具常見(jiàn)的有:databus,canal,maxwell,阿里云dts等等,在這里我們就不比較他們各自的優(yōu)劣點(diǎn)了,重點(diǎn)去介紹canal。
canal(github地址:https://github.com/alibaba/canal),譯意為水道/管道/溝渠,主要用途是基于 MySQL 數(shù)據(jù)庫(kù)增量日志解析,提供增量數(shù)據(jù)訂閱和消費(fèi)
早期阿里巴巴因?yàn)楹贾莺兔绹?guó)雙機(jī)房部署,存在跨機(jī)房同步的業(yè)務(wù)需求,實(shí)現(xiàn)方式主要是基于業(yè)務(wù) trigger 獲取增量變更。從 2010 年開(kāi)始,業(yè)務(wù)逐步嘗試數(shù)據(jù)庫(kù)日志解析獲取增量變更進(jìn)行同步,由此衍生出了大量的數(shù)據(jù)庫(kù)增量訂閱和消費(fèi)業(yè)務(wù)。后面在阿里云中逐漸演化稱(chēng)DTS項(xiàng)目。
canal大體原理也是模仿mysql的slave,從master上不斷的去拉取binlog,然后將binlog可以投放到不同的地方,比如我們常見(jiàn)的消息隊(duì)列:kafka,rocketmq等等。當(dāng)然在阿里云的付費(fèi)dts上面也是可以直接同步到redis,es或者其他的一些存儲(chǔ)介質(zhì)當(dāng)中。
canal的簡(jiǎn)單使用可以查看quickStart:https://github.com/alibaba/canal/wiki/QuickStart ,這里不做過(guò)多的介紹。接下來(lái)主要是更多的介紹canal的整體架構(gòu),以及實(shí)現(xiàn)的原理等等。
CanalServer:一個(gè)Jvm就可以理解成一個(gè)CanalServer,如果是集群模式的Canal的話 那么就會(huì)有多個(gè)CanalServer。
CanalInstance: 可以理解為一個(gè)作業(yè)為一個(gè)Instance,比如有一個(gè)把A庫(kù)的binlog同步到A消息隊(duì)列,B庫(kù)的binlog同步到B的消息隊(duì)列,那么這就是兩個(gè)不同的Instance,至于哪個(gè)Instance在哪個(gè)CanalServer上跑,需要看誰(shuí)先在ZK搶占到臨時(shí)節(jié)點(diǎn),如果分配得足夠均勻得話,可以在集群模式下緩解很多壓力。
CanalParser: 用于拉取mysql-binlog,并進(jìn)行解析。
EventSink: 將解析的數(shù)據(jù)進(jìn)行處理加工(過(guò)濾,合并等)。
CanalEventStore: 這個(gè)有點(diǎn)類(lèi)似slave中的relay log,用于將日志進(jìn)行中繼存儲(chǔ),但是在canal中目前只支持了在內(nèi)存中存儲(chǔ),目前不支持落盤(pán)存儲(chǔ)。
CanalParser,EventSink,CanalEventStore這三個(gè)都是屬于Canal中非常重要的組件,他們之間的關(guān)系如下:
CanalParser產(chǎn)生數(shù)據(jù)讓EventSink進(jìn)行加工,加工后的數(shù)據(jù)會(huì)存儲(chǔ)在CanalEventStore中,然后MQ從CanalEventStore中不斷的拉取最新數(shù)據(jù),然后投遞到MQ。
我們來(lái)講講在CanalParser中Canal是如何偽裝成slave去拉數(shù)據(jù)的,在AbstractEventParser.java
這個(gè)類(lèi)中有如下步驟:
?Step1: 構(gòu)建一個(gè)數(shù)據(jù)庫(kù)鏈接,并且生成一個(gè)slaveId,用于標(biāo)示自己slave的身份。?Step2: 獲取數(shù)據(jù)庫(kù)的元信息,比如binlogFormat,binRowImage等等。?Step3: 通過(guò)show variables like 'server_id'
命令,獲取我們需要監(jiān)聽(tīng)binlog服務(wù)的serverId。
?Step4: 獲取這一次需要消費(fèi)的位置,如果有存儲(chǔ)上一次的就從上一次中獲取,如果沒(méi)有的話需要通過(guò)show master status
命令中獲取到的最新的Position進(jìn)行消費(fèi)。
?Step5: 進(jìn)行dump操作,模擬slave發(fā)送注冊(cè)slave請(qǐng)求,以及dump binlog請(qǐng)求,然后用一個(gè)死循環(huán)不斷的從binlog中拉取數(shù)據(jù):
?Step6: 將獲取到的二進(jìn)制數(shù)據(jù),根據(jù)mysql binlog協(xié)議轉(zhuǎn)換成logEntry,方便后續(xù)處理。
EventSink會(huì)將上面獲取到的logEntry來(lái)進(jìn)行加工:
?過(guò)濾:
?過(guò)濾空的事務(wù)?過(guò)濾心跳?自定義過(guò)濾
?記錄,這里使用了Prometheus,來(lái)進(jìn)行數(shù)據(jù)的統(tǒng)計(jì)上報(bào)。?合并,現(xiàn)在有很多分庫(kù)分表的業(yè)務(wù)需要,他們的數(shù)據(jù)來(lái)源都是從不同的Parser中來(lái)的,但是最后都需要匯總到同一個(gè)EventStore中。在這個(gè)場(chǎng)景需要注意的我們可以需要注意的是會(huì)做時(shí)間歸并控制,也就是盡量讓每個(gè)分庫(kù)的數(shù)據(jù)匯總后都是遞增的方式提交,避免出現(xiàn)某個(gè)分庫(kù)的數(shù)據(jù)比其他的領(lǐng)先或者落后很多。
我們先看看EventStore中提供的接口:可以看見(jiàn)EventStore其實(shí)就是一個(gè)簡(jiǎn)單的存儲(chǔ),在canal中提供了MemoryEventStoreWithBuffer,在內(nèi)存中進(jìn)行中轉(zhuǎn)的數(shù)據(jù),其中的原理是通過(guò)RingBuffer(無(wú)鎖,高性能隊(duì)列)實(shí)現(xiàn)的,有關(guān)于RingBuffer的信息可以參考我之前的文章你應(yīng)該知道的Disruptor,在3.1中有對(duì)RingBuffer進(jìn)行詳細(xì)講解。
然后CanalMq通過(guò)EventStore不斷的獲取數(shù)據(jù),來(lái)進(jìn)行數(shù)據(jù)發(fā)送。
到此,關(guān)于“mysql的binlog怎么用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
網(wǎng)站欄目:mysql的binlog怎么用
URL分享:http://jinyejixie.com/article16/jpdedg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站制作、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、Google、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)