您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Replication主從復(fù)制機(jī)制原理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Replication主從復(fù)制機(jī)制原理是什么”吧!
Replication復(fù)制是指將主數(shù)據(jù)庫(kù)的DDL和DML操作通過(guò)二進(jìn)制日志傳到從庫(kù)服務(wù)器中,然后在從庫(kù)上對(duì)這些日志重新執(zhí)行(也叫重做),從而使得從庫(kù)和主庫(kù)的數(shù)據(jù)保持同步。
MySQL支持一臺(tái)主庫(kù)同時(shí)向多臺(tái)從庫(kù)進(jìn)行復(fù)制, 從庫(kù)同時(shí)也可以作為其他從服務(wù)器的主庫(kù),實(shí)現(xiàn)鏈狀復(fù)制。
MySQL 的主從復(fù)制原理如下:
從上層來(lái)看,復(fù)制分成三步:
Master主庫(kù)在事務(wù)提交時(shí),會(huì)把數(shù)據(jù)的更新記錄作為時(shí)間Events記錄在二進(jìn)制日志文件Binlog中。(Dump線程 - 主庫(kù)線程)
Master主庫(kù)推送二進(jìn)制日志文件Binlog中的日志事件到從庫(kù)的并且通過(guò)寫入中繼日志Relay Log(I/O線程 - 從庫(kù)線程)。
Slave從庫(kù) 讀取且重做(重放)中繼日志(Relay Log) 中的事件,將改變反映它自己的數(shù)據(jù)。(SQL線程 - 從庫(kù)線程)
MySQL復(fù)制的有點(diǎn)主要包含以下三個(gè)方面:
主庫(kù)出現(xiàn)問(wèn)題,可以快速切換到從庫(kù)提供服務(wù)(提供故障切換機(jī)制)。
從庫(kù)上執(zhí)行查詢操作,從主庫(kù)中更新,實(shí)現(xiàn)讀寫分離,降低主庫(kù)的訪問(wèn)壓力(提高讀寫分離并且提高高可用和負(fù)載以及吞吐)。
從庫(kù)中執(zhí)行備份,以避免備份期間影響主庫(kù)的服務(wù)(提高數(shù)據(jù)的安全性)。
在master 的配置文件(/usr/my.cnf)中,配置如下內(nèi)容:
mysql 服務(wù)ID,保證整個(gè)集群環(huán)境中唯一
server-id=1
mysql binlog 日志的存儲(chǔ)路徑和文件名
log-bin=/var/lib/mysql/mysqlbin
log-bin-index = mysql-bin.index(設(shè)置二進(jìn)制日志索引文件名)
binlog_format = mixed (binlog的模式)
STATEMENT:語(yǔ)句復(fù)制
ROW:行復(fù)制
MIXED:混和復(fù)制,默認(rèn)選項(xiàng)
sync-binlog = 1(是否開(kāi)啟同步方式): 默認(rèn)為0,為保證不會(huì)丟失數(shù)據(jù),需設(shè)置為1,用于強(qiáng)制每次提交事務(wù)時(shí),同步二進(jìn)制日志到磁盤上。
character-set-server = utf8(字符串編碼)
錯(cuò)誤日志,默認(rèn)已經(jīng)開(kāi)啟
log-err
mysql的安裝目錄
basedir
mysql的臨時(shí)目錄
tmpdir
mysql的數(shù)據(jù)存放目錄
datadir
是否只讀,1 代表只讀, 0 代表讀寫
read-only=0
忽略的數(shù)據(jù), 指不需要同步的數(shù)據(jù)庫(kù)(逗號(hào)分割)
binlog-ignore-db=mysql
指定同步的數(shù)據(jù)庫(kù)
binlog-do-db=db01
執(zhí)行完畢之后,需要重啟Mysql:
service mysql restart;
創(chuàng)建同步數(shù)據(jù)的賬戶,并且進(jìn)行授權(quán)操作:
grant replication slave on . to 'itcast'@'192.168.192.131' identified by 'itcast'; flush privileges;
為了獲取一個(gè)一致性的快照,需對(duì)所有表設(shè)置讀鎖:
flush tables with read lock;
備份主數(shù)據(jù)庫(kù)數(shù)據(jù)
主庫(kù)可以停機(jī),則直接拷貝所有數(shù)據(jù)庫(kù)文件。
主庫(kù)是在線生產(chǎn)庫(kù),可采用mysqldump備份數(shù)據(jù),它對(duì)所有存儲(chǔ)引擎均可使用。
mysqldump -uroot -ptiger --all-database -e --single-transaction --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql
mysqldump -uroot --all-database -e -l --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql
主從數(shù)據(jù)庫(kù)都是數(shù)據(jù)都是一致的,直接執(zhí)行 show master status 查看日志坐標(biāo)。
show master status;
File : 從哪個(gè)日志文件開(kāi)始推送日志文件
Position : 從哪個(gè)位置開(kāi)始推送日志
Binlog_Ignore_DB : 指定不需要同步的數(shù)據(jù)庫(kù)
恢復(fù)主庫(kù)的寫操作:
unlock tables;
導(dǎo)入備份數(shù)據(jù)
mysql -uroot -p < /data/all_db.sql
在 slave 端配置文件中,配置如下內(nèi)容:
mysql服務(wù)端ID,唯一
server-id=2
指定binlog日志
log-bin=/var/lib/mysql/mysqlbin
binlog_format = mixed
log-slave-updates = 0(控制 slave 上的更新是否寫入二進(jìn)制日志,默認(rèn)為0;若 slave 只作為從服務(wù)器,則不必啟用;若 slave 作為其他服務(wù)器的 master,則需啟用,啟用時(shí)需和 log-bin、binlog-format 一起使用,這樣 slave 從主庫(kù)讀取日志并重做,然后記錄到自己的二進(jìn)制日志中;)
relay-log = mysql-relay-bin(設(shè)置中繼日志文件基本名)
relay-log-index = mysql-relay-bin.index(設(shè)置中繼日志索引文件名)
read-only = 1(設(shè)置 slave 為只讀,但具有super權(quán)限的用戶仍然可寫)
slave_net_timeout = 10(設(shè)置網(wǎng)絡(luò)超時(shí)時(shí)間,即多長(zhǎng)時(shí)間測(cè)試一下主從是否連接,默認(rèn)為3600秒,即1小時(shí),這個(gè)值在生產(chǎn)環(huán)境過(guò)大,我們將其修改為10秒,即若主從中斷10秒,則觸發(fā)重新連接動(dòng)作。)
執(zhí)行完畢之后,需要重啟Mysql:
service mysql restart;
執(zhí)行如下指令 :
change master to master_host='192.168.2.21', master_user='repl', master_password='repl', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=120;
指定當(dāng)前從庫(kù)對(duì)應(yīng)的主庫(kù)的IP地址,用戶名,密碼,從哪個(gè)日志文件開(kāi)始的那個(gè)位置開(kāi)始同步推送日志。
開(kāi)啟同步操作
start slave;
show slave status;
可以看到圖中顯示出來(lái)的:IO線程和SQL線程都處于運(yùn)行狀態(tài):
Slave_IO_Running:此進(jìn)程負(fù)責(zé) slave 從 master 上讀取 binlog 日志,并寫入 slave 上的中繼日志。
Slave_SQL_Running:此進(jìn)程負(fù)責(zé)讀取并執(zhí)行中繼日志中的 binlog 日志。
這兩個(gè)進(jìn)程的狀態(tài)需全部為 YES,只要有一個(gè)為 NO,則復(fù)制就會(huì)停止。當(dāng) Relay_Master_Log_File = Master_Log_File 且 Read_Master_Log_Pos = Exec_Master_Log_Pos 時(shí),則表明 slave 和 master 處于完全同步的狀態(tài)。
停止同步操作
stop slave;
在主庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建表,并插入數(shù)據(jù) :
create database db01; user db01; create table user ( id int(11) not null auto_increment, name varchar(50) not null, sex varchar(1), primary key (id) ) engine = innodb default charset = utf8; insert into user(id, name, sex) values (null, 'Tom', '1'); insert into user(id, name, sex) values (null, 'Trigger', '0'); insert into user(id, name, sex) values (null, 'Dawn', '1');
在從庫(kù)中查詢數(shù)據(jù),進(jìn)行驗(yàn)證 :
在從庫(kù)中,可以查看到剛才創(chuàng)建的數(shù)據(jù)庫(kù):
在該數(shù)據(jù)庫(kù)中,查詢user表中的數(shù)據(jù):
到此,相信大家對(duì)“Replication主從復(fù)制機(jī)制原理是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。