mysql主备模型_MySQL主从复制 - 基于二进制日志(理论篇)
mysql日志類型
1????二進(jìn)制日志
2????事務(wù)日志
3????一般查詢?nèi)罩?/p>
4????中繼日志
5????慢查詢?nèi)罩?/p>
二進(jìn)制日志
二進(jìn)制日志通常記錄的是可能潛在引起數(shù)據(jù)庫發(fā)生改變的操作,每一個(gè)操作我們稱為一個(gè)event。
二進(jìn)制日志記錄一個(gè)event的時(shí)候,通常還會(huì)記錄timestamp,position(偏移量offset),server-id,event本身。
二進(jìn)制日志的數(shù)據(jù)存儲(chǔ)形式,形如mysql-bin.xxxxxx這種,二進(jìn)制日志除了mysql-bin.xxxxxx之外,還有mysql-bin.index(二進(jìn)制日志索引文件)
二進(jìn)制日志滾動(dòng)條件:容量達(dá)到定義的最大上限,flush logs ,服務(wù)器重啟
二進(jìn)制日志刪除:一般不建議用rm直接刪除,建議用mysql的PURGE命令清除
語法:PURGE {MASTER | BINARY} LOGS TO ‘log_name‘ ? ?# 刪除指定的日志PURGE {MASTER | BINARY} LOGS BEFORE ‘date‘ ?# 刪除日期之前的日志,BEFORE變量的date自變量可以為‘YYYY-MM-DD hh:mm:ss‘格式如:(MASTER 和BINARY 在這里都是等效的)PURGE MASTER LOGS TO ‘test-bin.000001‘;PURGE MASTER LOGS BEFORE ‘2011-01-0100:00:00‘;
二進(jìn)制日志格式:statement(mysql官方不推薦)
row(mysql 5.6以后推薦)
mixed
二進(jìn)制日志查看:
查看當(dāng)前mysql使用的二進(jìn)制文件及處在哪個(gè)position上:SHOW MASTER STATUS;
查看當(dāng)前mysql上使用的二進(jìn)制文件列表:SHOW BINARY LOGS;
查看某個(gè)二進(jìn)制日志文件的具體內(nèi)容:SHOW BINARY EVENTS IN ‘mysql-bin.1234567‘;
二進(jìn)制日志用途:
二進(jìn)制日志可以即時(shí)點(diǎn)還原,因?yàn)槎M(jìn)制日志中記錄的是潛在引起數(shù)據(jù)庫發(fā)生改變的操作。要注意的是,通過二進(jìn)制日志恢復(fù)的數(shù)據(jù)可能跟原始數(shù)據(jù)不一樣,在多顆cpu并行工作的情況下,會(huì)同時(shí)執(zhí)行多個(gè)事務(wù),如果mysql的隔離級(jí)別較低,事務(wù)之間可能交叉執(zhí)行(互相影響),當(dāng)前能夠被使用的二進(jìn)制日志只有一個(gè),寫入二進(jìn)制日志的方式是串行寫入,而事務(wù)是并行執(zhí)行的,事務(wù)執(zhí)行的次序和記錄在二進(jìn)制日志中的次序可能不一致。
mysql隔離級(jí)別:(由低到高)
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ(缺省隔離級(jí)別)
SERIALIZABLE
如果你的mysql隔離級(jí)別是REPEATABLE-READ,二進(jìn)制日志格式是statement,在某些場(chǎng)景下絕對(duì)會(huì)出現(xiàn)通過二進(jìn)制日志恢復(fù)的數(shù)據(jù)和原始數(shù)據(jù)不一致的情況。
如果你的mysql隔離級(jí)別是READ-COMMITED,二進(jìn)制日志格式推薦row。
主從復(fù)制原理
主從復(fù)制模式
mysql支持一主多從
同步:?確保event發(fā)送到所有的slave
半同步: ?只要本地event寫入本地的二進(jìn)制日志文件中即可,但是不確保event一定發(fā)送到slave,它是不管的
異步:?確保event發(fā)送到其中一個(gè)slave
注:mysql 5.5 之前是不支持半同步的(google貢獻(xiàn)的mysql半同步補(bǔ)丁)
多級(jí)復(fù)制
一個(gè)從可以是某個(gè)主的從,也可以是某個(gè)從的從。
中繼日志(relay log)不能發(fā)送給其它節(jié)點(diǎn)
復(fù)制的作用:
實(shí)現(xiàn)備份
高可用
異地容災(zāi)
分?jǐn)傌?fù)載(scale out)
Mysql一主多從、讀寫分離架構(gòu)
分析:這種架構(gòu)隨著mysql從服務(wù)器的增加會(huì)消耗mysql主服務(wù)器的性能(cpu、IO、內(nèi)存),因?yàn)閺姆?wù)器直接接受二進(jìn)制日志中的event。有幾個(gè)從服務(wù)器接受主服務(wù)器發(fā)送的event,相應(yīng)地mysql主服務(wù)器就要啟幾個(gè)線程,這些mysql線程各自獨(dú)立地從二進(jìn)制日志中讀取數(shù)據(jù),讀完后發(fā)送給對(duì)應(yīng)的mysql從服務(wù)器,所以下面引入新架構(gòu)。
Mysql一主多從、讀寫分離、多級(jí)復(fù)制架構(gòu)
分析:"主的從,從的主" mysql server實(shí)際上它只是起把二進(jìn)制日志的event從主服務(wù)器發(fā)送到從服務(wù)器的中間件而已,實(shí)在沒有必要把數(shù)據(jù)持久化存儲(chǔ)下來,浪費(fèi)IO。但是從中繼日志中讀取的event不在本地執(zhí)行寫入數(shù)據(jù)文件是不會(huì)記錄到二進(jìn)制日志文件中的,沒有二進(jìn)制日志就不能發(fā)送event給從服務(wù)器了。
解決思路:
mysql有種存儲(chǔ)引擎叫black hole,功能類似于linux的/dev/null,"主的從,從的主" mysql 數(shù)據(jù)庫使用black hole存儲(chǔ)引擎,這樣從中繼日志中讀取的event在本地執(zhí)行完后,數(shù)據(jù)并沒有保存下來。
主從架構(gòu)中,如果不使用mysql-proxy,如何到主服務(wù)器寫,到從服務(wù)器讀?
就lamp架構(gòu)來說,可以在前端程序中指定到哪個(gè)主服務(wù)器寫,到哪個(gè)從服務(wù)器讀;如果有多個(gè)從服務(wù)器,還可以在程序中使用rr輪詢調(diào)度訪問,增加了前端程序的復(fù)雜度。
mysql實(shí)際上是支持雙主模型的,
雙主模型可以減輕讀操作,但是無法減輕寫操作,所有在第一個(gè)節(jié)點(diǎn)的寫操作,第二個(gè)節(jié)點(diǎn)也同樣要執(zhí)行一遍,不然就出現(xiàn)數(shù)據(jù)不一致了。
一般來說,在生產(chǎn)環(huán)境中絕對(duì)不建議使用雙主模型
雙主模型原理實(shí)現(xiàn)預(yù)測(cè)
雙主模型很容易出問題,舉個(gè)例子:
keystone數(shù)據(jù)庫的user表:
字段: id ?name ?default_project_id
id ?name default_project_id
1 ? ? user1 ? ? 111
2 ? ? user2 ? ? 222
server1: update user set name=‘yao‘ where default_project_id=‘111‘;
server2: update user set default_project_id=‘123‘ where name=‘user1‘
最后怎么合并呢,就會(huì)出現(xiàn)數(shù)據(jù)不一致了,雙主模型存在這種 mysql邏輯問題
Mysql集群規(guī)模擴(kuò)大
當(dāng)一個(gè)服務(wù)器承受的壓力過大的時(shí)候,兩種方式提升它的性能:
scale on:縱向擴(kuò)展,增加單臺(tái)服務(wù)器的性能
scale out: 橫向擴(kuò)展,增加服務(wù)器分?jǐn)傌?fù)載
當(dāng)規(guī)模越來越大的時(shí)候,我們的主服務(wù)器怎么都無法承擔(dān)寫操作的時(shí)候,怎么辦?
數(shù)據(jù)庫服務(wù)器之所以壓力大,那是因?yàn)閹炖锩嬗泻芏鄰埍?#xff0c;每個(gè)表可能都需要讀寫操作;雙主也無法減輕寫操作,需要垂直拆分(分庫),就是將一個(gè)大的數(shù)據(jù)庫拆分成n個(gè)小的數(shù)據(jù)庫,把那些查詢(聯(lián)合查詢)或操作的時(shí)候相關(guān)聯(lián)的表放在一起,每一個(gè)小的數(shù)據(jù)庫放在一個(gè)物理服務(wù)器上;
當(dāng)需要對(duì)某張表操作的時(shí)候,我們只需要聯(lián)系這張表所在的數(shù)據(jù)庫,但是垂直拆分治標(biāo)不治本,數(shù)據(jù)庫的數(shù)據(jù)也是有熱區(qū)的,比如說我們有50G的數(shù)據(jù),其中有2G的數(shù)據(jù)最繁忙,而這2G的數(shù)據(jù)都在同一張表上,這時(shí)候就需要水平拆分(分表)了,分表的目的就是把熱區(qū)數(shù)據(jù)分開。
注:拆分是根據(jù)業(yè)務(wù)來拆的,不了解業(yè)務(wù)是不行的。
一般來說,能不拆盡量不拆,一旦出現(xiàn)問題,trouble shooting起來將變得很困難。
實(shí)現(xiàn)讀寫分離的開源軟件
mysql-proxy(mysql官方)
amoeba(阿里巴巴貢獻(xiàn),java編寫)
cobar(在amoeba基礎(chǔ)上開發(fā),java編寫,這實(shí)際上是一個(gè)數(shù)據(jù)拆分后實(shí)現(xiàn)路由的軟件)
原文:http://iceyao.blog.51cto.com/9426658/1571865
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的mysql主备模型_MySQL主从复制 - 基于二进制日志(理论篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java dom4j 去除空行_如何从X
- 下一篇: java logic_Java Logi