溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL的復(fù)制原理詳解以及基礎(chǔ)配置

發(fā)布時間:2020-06-27 19:47:09 來源:網(wǎng)絡(luò) 閱讀:543 作者:蘋果與牛頓 欄目:建站服務(wù)器

MySQL 的日志類型

二進(jìn)制日志,事務(wù)日志,錯誤日志,一般查詢?nèi)罩?,中繼日志,慢查詢?nèi)罩?/p>


二進(jìn)制日志有以下內(nèi)容

    數(shù)據(jù)目錄,一般放置在mysql-bin.XXXXX編號)

    滾動:達(dá)到一個最大上限,flush logs,服務(wù)器重啟

    格式:statement

              row

              mixed

    mysql-bin.index:二進(jìn)制日志文件索引文件

    mysql > SHOW MASTER STATUS查看主服務(wù)器的狀態(tài)

    mysql > SHOW BINARY LOGS 查看二進(jìn)制日志

    mysql > SHOW BINLOG  EVENTS IN 'file'查看二進(jìn)制日志中的事件


    event中比較重要的選項:

          timestamp時間戳

          position,offset,operation,server-id


MySQL的隔離級別:

    READ-UNCOMMITED

    READ-COMMITED

            如果使用mixed可能會發(fā)生數(shù)據(jù)不一致的情況

            官方推薦使用row 的方法

    REPEATABLE-READ

    SERIALIZABLE



復(fù)制實現(xiàn)的功能

  1. 實現(xiàn)數(shù)據(jù)備份

  2. 如果有從服務(wù)器,主服務(wù)器發(fā)生故障之后,開通從服務(wù)器的寫入功能,從而提供高可用的使用功能

  3. 異地容災(zāi)

  4. 分?jǐn)傌?fù)載(scale out )主服務(wù)器:寫      從服務(wù)器:讀


復(fù)制方法有三種,分別是主從復(fù)制,半同步復(fù)制以及主主復(fù)制


首先介紹主從復(fù)制(使用較頻繁)


在主服務(wù)器上,前端用戶每次執(zhí)行一次數(shù)據(jù)庫發(fā)生修改或者引起修改的指令,都會在二進(jìn)制日志中保存為一個事件,每保存一個事件,都會通過MySQL的3306端口發(fā)送給另外一個服務(wù)器,另外一臺服務(wù)器將這個日志接收下來,然后先保存在本地的日志文件中,然后每次讀取一個操作,然后將每一次修改執(zhí)行到自己服務(wù)器上,這個過程叫做MySQL 的復(fù)制


master上存在一個二進(jìn)制文件Binary log

slave 從主服務(wù)器上二進(jìn)制文件復(fù)制而成的文件,叫做中繼日志(relay log)

在主服務(wù)器上當(dāng)有多個事務(wù)并發(fā)執(zhí)行的時候,但是在寫入二進(jìn)制文件中的時候只能一條一條寫,因此就需要一個暫時緩存的日志文件進(jìn)行緩存,接著再向二進(jìn)制文件中寫入


其中在復(fù)制方法上同時又有同步復(fù)制以及異步復(fù)制的區(qū)分:


同步復(fù)制

從服務(wù)器不能比主服務(wù)器慢,前端發(fā)生的修改不能及時的得到slave 的響應(yīng)

因此基本上是使用半同步復(fù)制的方法

半同步復(fù)制只是將數(shù)據(jù)同步發(fā)送給另一個節(jié)點,只能保證近的節(jié)點能夠及時的響應(yīng)


異步復(fù)制:一主多從,等待每一個服務(wù)器都同步完成的時候,


在多臺從服務(wù)器進(jìn)行復(fù)制的時候,可能會因為請求過多,主服務(wù)器難以有效的處理,因此就需要一個前端代理。

讀寫分離(rw-splitting):找一個MySQL的前端代理,工作在應(yīng)用層,能夠理解MySQL的語句,能夠完成將不同的操作(讀 寫)定向到不同的服務(wù)器,分別分發(fā)給主服務(wù)器和從服務(wù)器,從而完成讀寫分離


多級復(fù)制:一個從服務(wù)器可能是一個主服務(wù)器的從服務(wù)器,也可能是另一個從服務(wù)器的從服務(wù)器

如果一個從服務(wù)器不記錄中繼日志,則不能將內(nèi)容發(fā)送給下一級服務(wù)器,從服務(wù)器上不能進(jìn)行寫操作


接下來介紹雙主模型


雙主模型的時候,配置幾乎一樣,但是要很注意server-id的重要性,防止出現(xiàn)復(fù)制環(huán)路的產(chǎn)生

無法實現(xiàn)減輕寫操作,很容易出問題


例如

tutors:name,age,gender,tid

tom 10

jerry 30

A主機(jī):UPDATE tutords SET  name=jerry

B主機(jī):UPDATE tutors SET age=30 WHERE name=tom

在最終的完成同步的時候,查詢出來的結(jié)果并不認(rèn)能夠合并,會產(chǎn)生沖突


所以在生產(chǎn)環(huán)境中,一般不建議使用雙主模型



讀寫分離可以由下面的組件實現(xiàn):

mysql-proxy

amoeba


數(shù)據(jù)拆分之后實現(xiàn)路由:

cobar


補(bǔ)充:

master :slave 

    1-->N

slave :master

    1-->N X 

一個從服務(wù)器只能屬于一個主服務(wù)器


MySQL 5.5之前的復(fù)制實現(xiàn)非常簡單,

MySQL 5.6之后引用了 gtid,multi-thread replication(多線程復(fù)制)


配置MySQL復(fù)制基本步驟


主從復(fù)制

 一.master

             啟用二進(jìn)制日志

             log-bin=master-bin

             log-bi-index =master-bin.index

    1.  選擇一個唯一的server-id

      server-id ={0-2^32}

    2. 創(chuàng)建具有復(fù)制權(quán)限的用戶

            REPLICATION SLAVE

            REPLICATION CLIENT


二.slave

1.啟用中繼日志

relay-log =relay-log     

log-bin-index=

2.選擇一個唯一的server-id 

            server-id ={0-2^32}

3.連接至主服務(wù)器,并開始復(fù)制數(shù)據(jù)

   mysql > CHANGER MASTER TO MASTER_HOST= ' ',MASTER_PORT= ' ',MASTER_LOG_FILE=' ',MASTER_LOG_FILE_POS=' ',MASTER_USER=' ' ,MASTER_PASSWORD=' ';

mysql >START SLAVE

mysql>START SLAVE SQL_Thread  開啟SQL線程

mysql>START SLAVE IO_Thread開啟IO線程


復(fù)制線程:

master:dump

slave :IO_Thread,SQL_Thread


read_only=YES

在從服務(wù)器上設(shè)定,對具有SUPER權(quán)限的用戶不生效


sync-binlog = ON 

在主服務(wù)器上設(shè)定,用于事務(wù)安全


半同步復(fù)制

在master 和slave 上各自安裝一個google提供的插件

主服務(wù)器上


mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;

mysql>SET GLOBAL rpl_semi_syc_master_timeout=1000;


從服務(wù)器上

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql>SET GLOBAL rpl_semi_sync_slave_enables =1;

mysql_STOP SLAVE IO_Thread;START SLAVE IO_Thread;


雙主復(fù)制

  1. 在兩臺服務(wù)器上各自建立一個具有復(fù)制權(quán)限的用戶

  2. 修改配置文件

主服務(wù)器上

server-id =10

log-bin =mysql-bin

relay -log=relay -mysql

relay-log -index =relay -mysql.index

auto-increment-incremeng =2

auto-increment-offset =1


從服務(wù)器上

server-id=20

log-bin=mysql=bin

relay-log=relay-mysql

relay-log-index=relay-mysql.index

auto-increment-increment=2

auto-increment-offset =2


3.如果此時兩臺服務(wù)器均為新建立,且無其他寫入操作,各服務(wù)器之需記錄當(dāng)前自己的二進(jìn)制文件以及事件位置,以之作為另一臺服務(wù)器復(fù)制起始位置即可


4.各服務(wù)器接下來指定對另一臺服務(wù)器為自己的主服務(wù)器即可


A主機(jī)必須查看B的二進(jìn)制文件及位置,并以之作為自己的復(fù)制起點

B主機(jī)必須查看A的二進(jìn)制文件及位置,并以之作為自己的復(fù)制起點

兩個服務(wù)器都能進(jìn)行讀寫,即為雙主模型









向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI