国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
mysql主從雙向同步復(fù)制

MySQL主從雙向同步復(fù)制  

本文介紹了mysql主從,實(shí)現(xiàn)mysql的雙向同步復(fù)制。

MySQL支持單向、異步復(fù)制,復(fù)制過程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,而一個(gè)或多個(gè)其它服務(wù)器充當(dāng)從服務(wù)器。主服務(wù)器將更新寫入二進(jìn)制日志文件,并維護(hù)日志文件的一個(gè)索引以跟蹤日志循環(huán)。當(dāng)一個(gè)從服務(wù)器連接到主服務(wù)器時(shí),它通知主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置。從服務(wù)器接收從那時(shí)起發(fā)生的任何更新,然后封鎖并等待主服務(wù)器通知下一次更新。

 為什么使用主從復(fù)制?

1、主服務(wù)器/從服務(wù)器設(shè)置增加了健壯性。主服務(wù)器出現(xiàn)問題時(shí),你可以切換到從服務(wù)器作為備份。

2、通過在主服務(wù)器和從服務(wù)器之間切分處理客戶查詢的負(fù)荷,可以得到更好的客戶響應(yīng)時(shí)間。但是不要同時(shí)在主從服務(wù)器上進(jìn)行更新,這樣可能引起沖突。

3、使用復(fù)制的另一個(gè)好處是可以使用一個(gè)從服務(wù)器執(zhí)行備份,而不會干擾主服務(wù)器。在備份過程中主服務(wù)器可以繼續(xù)處理更新。

 MySQL使用3個(gè)線程來執(zhí)行復(fù)制功能(其中1個(gè)在主服務(wù)器上,另兩個(gè)在從服務(wù)器上。當(dāng)發(fā)出START SLAVE時(shí),從服務(wù)器創(chuàng)建一個(gè)I/O線程,以連接主服務(wù)器并讓主服務(wù)器發(fā)送二進(jìn)制日志。主服務(wù)器創(chuàng)建一個(gè)線程將二進(jìn)制日志中的內(nèi)容發(fā)送到從服務(wù)器。從服務(wù)器I/O線程讀取主服務(wù)器Binlog Dump線程發(fā)送的內(nèi)容并將該數(shù)據(jù)拷貝到從服務(wù)器數(shù)據(jù)目錄中的本地文件中,即中繼日志。第3個(gè)線程是SQL線程,從服務(wù)器使用此線程讀取中繼日志并執(zhí)行日志中包含的更新。SHOW PROCESSLIST語句可以查詢在主服務(wù)器上和從服務(wù)器上發(fā)生的關(guān)于復(fù)制的信息。

 默認(rèn)中繼日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務(wù)器主機(jī)名,nnnnnn是序列號。用連續(xù)序列號來創(chuàng)建連續(xù)中繼日志文件,從000001開始。從服務(wù)器跟蹤中繼日志索引文件來識別目前正使用的中繼日志。默認(rèn)中繼日志索引文件名為host_name-relay-bin.index。在默認(rèn)情況,這些文件在從服務(wù)器的數(shù)據(jù)目錄中被創(chuàng)建。中繼日志與二進(jìn)制日志的格式相同,并且可以用mysqlbinlog讀取。當(dāng)SQL線程執(zhí)行完中繼日志中的所有事件后,中繼日志將會被自動刪除。

 從服務(wù)器在數(shù)據(jù)目錄中另外創(chuàng)建兩個(gè)狀態(tài)文件--master.info和relay-log.info。狀態(tài)文件保存在硬盤上,從服務(wù)器關(guān)閉時(shí)不會丟失。下次從服務(wù)器啟動時(shí),讀取這些文件以確定它已經(jīng)從主服務(wù)器讀取了多少二進(jìn)制日志,以及處理自己的中繼日志的程度。

 

下面來看一下具體的配置:

一、準(zhǔn)備服務(wù)器

由于MySQL不同版本之間的(二進(jìn)制日志)binlog格式可能會不一樣,因此最好的搭配組合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。

本文中,我們假設(shè)主服務(wù)器(以下簡稱Master)和從服務(wù)器(以下簡稱Slave)的版本都是5.1.35,操作系統(tǒng)是Centos 4.7。

假設(shè)同步Master的主機(jī)名為:master(IP:192.168.1.123),Slave主機(jī)名為:slave(IP:192.168.1.124),2個(gè)MySQL的basedir目錄都是/usr/local/mysql,datadir都是:/var/lib/mysql。

二、設(shè)置同步服務(wù)器

1、設(shè)置同步Master

修改 my.cnf 文件,在

# Replication Master Server (default)

# binary logging is required for replication

添加如下內(nèi)容:


#log-bin=/var/log/mysql/updatelog  server-id = 1  auto_increment_increment = 2  auto_increment_offset = 1  binlog-do-db=discuz  binlog-ignore-db=mysql  #log-slave-updates   slave-skip-errors=all

注:

slave-skip-errors 是跳過錯(cuò)誤,繼續(xù)執(zhí)行復(fù)制操作

多主互備和主從復(fù)制有一些區(qū)別,因?yàn)槎嘀髦?都可以對服務(wù)器有寫權(quán)限,所以設(shè)計(jì)到自增長重復(fù)問題

出現(xiàn)的問題(多主自增長ID重復(fù))
1:首先我們通過A,B的test表結(jié)構(gòu)
2:掉A,在B上對數(shù)據(jù)表test(存在自增長ID)執(zhí)行插入操作,返回插入ID為1
3:后停掉B,在A上對數(shù)據(jù)表test(存在自增長ID)執(zhí)行插入操作,返回的插入ID也是1
4:然后 我們同時(shí)啟動A,B,就會出現(xiàn)主鍵ID重復(fù)

解決方法:
我們只要保證兩臺服務(wù)器上插入的自增長數(shù)據(jù)不同就可以了
如:A查奇數(shù)ID,B插偶數(shù)ID,當(dāng)然如果服務(wù)器多的話,你可以定義算法,只要不同就可以了

在這里我們在A,B上加入?yún)?shù),以實(shí)現(xiàn)奇偶插入

A:my.cnf上加入?yún)?shù)

 

auto_increment_offset = 1  auto_increment_increment = 2

這樣A的auto_increment字段產(chǎn)生的數(shù)值是:1, 3, 5, 7, …等奇數(shù)ID了

B:my.cnf上加入?yún)?shù)

 

auto_increment_offset = 2  auto_increment_increment = 2

這樣B的auto_increment字段產(chǎn)生的數(shù)值是:2, 4, 6, 8, …等偶數(shù)ID了

可以看出,你的auto_increment字段在不同的服務(wù)器之間絕對不會重復(fù),所以Master-Master結(jié)構(gòu)就沒有任何問題了。當(dāng)然,你還可以使用3臺,4臺,或者N臺服務(wù)器,只要保證auto_increment_increment = N 再設(shè)置一下auto_increment_offset為適當(dāng)?shù)某跏贾稻涂梢粤?,那樣,我們的MySQL可以同時(shí)有幾十臺主服務(wù)器,而不會出現(xiàn)自增長ID重復(fù)。

 

重啟MySQL,創(chuàng)建一個(gè)MySQL賬號為同步專用


# /usr/local/mysql/bin/mysql -u root -p  mysql> GRANT REPLICATION SLAVE ON *.* TO 'back'@'%' IDENTIFIED BY 'back';  mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO   'back'@'%' IDENTIFIED BY 'back';  mysql> FLUSH PRIVILEGES ;

如果想要在Slave上有權(quán)限執(zhí)行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 語句的話,必須授予全局的 FILE 和 SELECT 權(quán)限:

2、設(shè)置同步Slave

修改my.cnf文件,添加


server-id = 2  auto_increment_increment = 2  auto_increment_offset = 2  master-host = 192.168.1.123  master-user = back  master-password = back  master-port = 3306  replicate-ignore-db=mysql   replicate-do-db=discuz  #log-slave-updates   slave-skip-errors=all

重啟MySQL

 

3、啟動同步

在主服務(wù)器master MySQL命令符下:


# /usr/local/mysql/bin/mysql -u root -p    mysql> show master status;  顯示(當(dāng)然這個(gè)是我機(jī)器的情況,你的不可能跟我一樣哈,只是個(gè)例子):    +------------------+----------+-------------------+------------------+    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |    +------------------+----------+-------------------+------------------+    | mysql-bin.000009 | 98 | discuz | mysql |     +------------------+----------+-------------------+------------------+

 

在從服務(wù)器master MySQL命令符下:


# /usr/local/mysql/bin/mysql -u root -p  mysql> slave stop;  mysql> change master to master_host='192.168.1.123', master_user='back', master_password='back', master_log_file='mysql-bin.000009', master_log_pos=98;  mysql> slave start;  mysql> show slave status\G;    Slave_IO_Running: Yes  Slave_SQL_Running: Yes

如果都是yes,那代表已經(jīng)在同步

往表里面寫點(diǎn)數(shù)據(jù)測試一下看是否同步成功,如果不成功,絕對不是你的RP問題,再檢查一下操作步驟!

 

4、設(shè)置雙向同步

修改slave服務(wù)器的my.cnf,添加


log-bin=/var/log/mysql/updatelog  binlog-do-db=discuz  binlog-ignore-db=mysql

重啟MySQL,創(chuàng)建一個(gè)MySQL賬號為同步專用


mysql> GRANT REPLICATION SLAVE ON *.* TO 'back'@'%' IDENTIFIED BY 'back';  mysql> GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO   'back'@'%' IDENTIFIED BY 'back';  mysql> FLUSH PRIVILEGES ;

 

修改master服務(wù)器的my.cnf,添加


master-host = 192.168.1.124  master-user = back  master-password = back  master-port = 3306  replicate-ignore-db=mysql  replicate-do-db=discuz

重啟MySQL

 

在主服務(wù)器slave MySQL命令符下:

 

show master status;    +------------------+----------+-------------------+------------------+    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |    +------------------+----------+-------------------+------------------+    | mysql-bin.000013 | 98 | discuz | mysql |     +------------------+----------+-------------------+------------------+

 

在服務(wù)器A MySQL命令符下:


mysql> slave stop;  mysql> change master to master_host='192.168.1.124', master_user='back',   master_password='back', master_log_file='mysql-bin.000013', master_log_pos=98;  mysql> slave start;

其實(shí)也就是A->B單向同步的反向操作!雙向同步,就這么簡單啦! 

 

提示:如果修改了主服務(wù)器的配置,記得刪除從服務(wù)器上的master.info文件。否則從服務(wù)器使用的還是老配置,可能會導(dǎo)致錯(cuò)誤。

-----------------------------------------------------------------------------------

注意:關(guān)于要復(fù)制多個(gè)數(shù)據(jù)庫時(shí),binlog-do-db和replicate-do-db選項(xiàng)的設(shè)置,網(wǎng)上很多人說是用半角逗號分隔,經(jīng)過測試,這樣的說法是錯(cuò)誤的,MySQL官方文檔也明確指出,如果要備份多個(gè)數(shù)據(jù)庫,只要重復(fù)設(shè)置相應(yīng)選項(xiàng)就可以了。

比如:


binlog-do-db=a  binlog-do-db=b  replicate-do-db=a  replicate-do-db=b

補(bǔ):

#啟用從庫日志,這樣可以進(jìn)行鏈?zhǔn)綇?fù)制  log-slave-updates    #從庫是否只讀,0表示可讀寫,1表示只讀  read-only=1    #只復(fù)制某個(gè)表  replicate-do-table=tablename    #只復(fù)制某些表(可用匹配符)  replicate-wild-do-table=tablename%    #只復(fù)制某個(gè)庫  replicate-do-db=dbname    #只復(fù)制某些庫  replicte-wild-do-db=dbname%    #不復(fù)制某個(gè)表  replicate-ignore-table=tablename    #不復(fù)制某些表  replicate-wild-ignore-table=tablename%    #不復(fù)制某個(gè)庫  replicate-ignore-db=dbname    #復(fù)制完的sql語句是否立即從中繼日志中清除,1表示立即清除  relay-log-purge=1
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MySQL主從配置詳解
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服