溫馨提示×

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

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

MySQL主從復(fù)制基本要義和總結(jié)

發(fā)布時(shí)間:2020-04-26 15:25:14 來(lái)源:億速云 閱讀:233 作者:三月 欄目:建站服務(wù)器

本文主要給大家介紹MySQL主從復(fù)制基本要義和總結(jié),希望可以給大家補(bǔ)充和更新些知識(shí),如有其它問(wèn)題需要了解的可以持續(xù)在億速云行業(yè)資訊里面關(guān)注我的更新文章的。

1.1 MySQL主從復(fù)制介紹

MySQL數(shù)據(jù)庫(kù)的主從復(fù)制方案,和使用scp/rsync等命令進(jìn)行的文件級(jí)別復(fù)制類(lèi)似,都是數(shù)據(jù)的遠(yuǎn)程傳輸,只不過(guò)MySQL的主從復(fù)制是其自帶的功能,無(wú)需借助第三方工具,而且,MySQL的主從復(fù)制并不是數(shù)據(jù)庫(kù)磁盤(pán)上的文件直接拷貝,而是通過(guò)邏輯的binlog日志復(fù)制到要同步的云服務(wù)器本地,然后由本地的線(xiàn)程讀取日志里面的SQL語(yǔ)句重新應(yīng)用到MySQL數(shù)據(jù)庫(kù)中。

 

MySQL數(shù)據(jù)庫(kù)支持單向、雙向、鏈?zhǔn)郊?jí)聯(lián)、環(huán)狀等不同業(yè)務(wù)場(chǎng)景的復(fù)制。在復(fù)制過(guò)程中,一臺(tái)服務(wù)器充當(dāng)主服務(wù)器(Master),接收來(lái)自用戶(hù)的內(nèi)容更新,而一個(gè)或多個(gè)其他的服務(wù)器充當(dāng)從服務(wù)器(Slave),接收來(lái)自主服務(wù)器binlog文件的日志內(nèi)容,解析出SQL重新更新到從服務(wù)器,使得主從服務(wù)器達(dá)到一致。

 MySQL主從復(fù)制基本要義和總結(jié)

如果設(shè)置了鏈?zhǔn)郊?jí)復(fù)制,那么,從(slave)服務(wù)器本身除了充當(dāng)從服務(wù)器外,也會(huì)同時(shí)充當(dāng)其下面從服務(wù)器的主服務(wù)器。鏈?zhǔn)郊?jí)聯(lián)復(fù)制類(lèi)似A-->B-->C的復(fù)制形式。

                            MySQL主從復(fù)制基本要義和總結(jié)

1.2 MySQL主從復(fù)制的企業(yè)應(yīng)用場(chǎng)景

MySQL主從復(fù)制集群功能使得MySQL數(shù)據(jù)庫(kù)支持大規(guī)模高并發(fā)讀寫(xiě)成為可能,同時(shí)有效地保護(hù)了物理服務(wù)器宕機(jī)場(chǎng)景的數(shù)據(jù)備份。

 

應(yīng)用場(chǎng)景一:從服務(wù)器作為主服務(wù)器的實(shí)時(shí)數(shù)據(jù)備份

主從服務(wù)器架構(gòu)的設(shè)置,可以大大加強(qiáng)MySQL數(shù)據(jù)庫(kù)架構(gòu)的強(qiáng)壯性。例如:當(dāng)主服務(wù)器出現(xiàn)問(wèn)題時(shí),我們可以人工或設(shè)置自動(dòng)切換到從服務(wù)器繼續(xù)提供服務(wù),此時(shí)從服務(wù)器的數(shù)據(jù)和宕機(jī)時(shí)的主數(shù)據(jù)庫(kù)幾乎是一致的。

這類(lèi)似NFS存儲(chǔ)數(shù)據(jù)通過(guò)inotify+rsync同步到備份的NFS服務(wù)器,只不過(guò)MySQL的復(fù)制方案是其自帶的工具

利用MySQL的復(fù)制功能做數(shù)據(jù)備份時(shí),在硬件故障、軟件故障的場(chǎng)景下,該數(shù)據(jù)備份是有效的,但對(duì)于人為地執(zhí)行drop、delete等語(yǔ)句刪除數(shù)據(jù)的情況,從庫(kù)的備份功能就沒(méi)用了,因?yàn)閺姆?wù)器也會(huì)執(zhí)行刪除的語(yǔ)句。

 

應(yīng)用場(chǎng)景二:主從服務(wù)器實(shí)現(xiàn)讀寫(xiě)分離,從服務(wù)器實(shí)現(xiàn)負(fù)載均衡

主從服務(wù)器架構(gòu)可通過(guò)程序(PHP、java等)或代理軟件(mysql-proxyAmoeba)實(shí)現(xiàn)對(duì)用戶(hù)(客戶(hù)端)的請(qǐng)求讀寫(xiě)分離,即讓從服務(wù)器僅僅處理用戶(hù)的select查詢(xún)請(qǐng)求,降低用戶(hù)查詢(xún)響應(yīng)時(shí)間及讀寫(xiě)同時(shí)在主服務(wù)器上帶來(lái)的訪(fǎng)問(wèn)壓力。對(duì)于更新的數(shù)據(jù)(例如uodateinsert、delete語(yǔ)句)仍然交給主服務(wù)器處理,確保主服務(wù)器和從服務(wù)器保持實(shí)時(shí)同步。

MySQL主從復(fù)制基本要義和總結(jié)

 

應(yīng)用場(chǎng)景三:把多個(gè)從服務(wù)器根據(jù)業(yè)務(wù)重要性進(jìn)行拆分訪(fǎng)問(wèn)

可以把幾個(gè)不同的從服務(wù)器,根據(jù)公司的業(yè)務(wù)進(jìn)行拆分。例如:有為外部用戶(hù)提供查詢(xún)服務(wù)的從服務(wù)器,有內(nèi)部DBA用來(lái)數(shù)據(jù)備份的從服務(wù)器,還有為公司內(nèi)部人員提供訪(fǎng)問(wèn)的后臺(tái)、腳本、日志分析及供開(kāi)發(fā)人員查詢(xún)使用的從服務(wù)器。這樣的拆分除了減輕主服務(wù)器的壓力外,還可以使數(shù)據(jù)庫(kù)對(duì)外部用戶(hù)瀏覽、內(nèi)部用戶(hù)業(yè)務(wù)處理及DBA人員的備份等互不影響。

MySQL主從復(fù)制基本要義和總結(jié)

 

1.3 MySQL主從復(fù)制原理介紹

MySQL的主從復(fù)制是一個(gè)異步的復(fù)制過(guò)程(雖然一般情況下感覺(jué)是實(shí)時(shí)的),數(shù)據(jù)將從一個(gè)MySQL數(shù)據(jù)庫(kù)(我們稱(chēng)之為Master)復(fù)制到另一個(gè)MySQL數(shù)據(jù)庫(kù)(我們稱(chēng)之為Slave),在MasterSlave之間實(shí)現(xiàn)整個(gè)主從復(fù)制的過(guò)程是由三個(gè)線(xiàn)程參與完成的。其中有兩個(gè)線(xiàn)程(SQL線(xiàn)程和IO線(xiàn)程)在Slave端,另外一個(gè)線(xiàn)程(I/O線(xiàn)程)在Master端。

 

要實(shí)現(xiàn)MySQL的主從復(fù)制,首先必須要打開(kāi)Master端的Binlog記錄功能,否則就無(wú)法實(shí)現(xiàn)。因?yàn)檎麄€(gè)復(fù)制過(guò)程實(shí)際上就是SlaveMaster端獲取Binlog日志,然后在Slave上以相同順序執(zhí)行獲取的Binlog日志中所記錄的各種SQL操作。

MySQL主從復(fù)制基本要義和總結(jié)

 

下面針對(duì)MySQL主從復(fù)制原理的重點(diǎn)進(jìn)行小結(jié)。

◆   主從復(fù)制是異步的邏輯的SQL語(yǔ)句級(jí)的復(fù)制。

◆   復(fù)制時(shí),主庫(kù)有一個(gè)I/O線(xiàn)程,從庫(kù)有兩個(gè)線(xiàn)程,I/O和SQL線(xiàn)程。

◆   實(shí)現(xiàn)主從復(fù)制的必要條件是主庫(kù)要開(kāi)啟記錄binlog功能。

◆   作為復(fù)制的所有MySQL節(jié)點(diǎn)的server-id都不能相同。

◆   binlog文件只記錄對(duì)數(shù)據(jù)有更改的SQL語(yǔ)句(來(lái)自主數(shù)據(jù)庫(kù)內(nèi)容的變更),不記錄任何查詢(xún)(select,show)語(yǔ)句。

 

忘了數(shù)據(jù)庫(kù)密碼

mysqld_safe--defaults-file=/data/3306/my.cnf --skip-grant-table --user=mysql &

然后不用輸入密碼進(jìn)行登錄

mysql-uroot -p -S /data/3306/mysql.sock

進(jìn)入數(shù)據(jù)庫(kù)后設(shè)置密碼

updatemysql.user set password=password('oldboy123') where user='root' andhost='localhost';

刷新權(quán)限

flushprivileges; 

1.4 MySQL主從復(fù)制操作步驟

架構(gòu)實(shí)踐:

3306---->3307

--->

 

1.開(kāi)啟主庫(kù)binlog,配置server-id

[root@db02~]# egrep -i "server-id|log-bin" /data/3306/my.cnf

log-bin= /data/3306/mysql-bin

server-id= 6

重啟服務(wù)

/data/3306/mysqlrestart

從庫(kù)

[root@db02~]# egrep -i "server-id|log-bin" /data/3307/my.cnf

#log-bin= /data/3307/mysql-bin

server-id= 7

 

2.主庫(kù)創(chuàng)建用戶(hù)

grantreplication slave on *.* to 'rep'@'172.16.1.%' identified by 'oldboy123';

mysql>grant replication slave on *.* to 'rep'@'172.16.1.%' identified by 'oldboy123';

Query OK, 0rows affected (0.04 sec)

 

mysql>select user,host from mysql.user;

+------+------------+

| user |host       |

+------+------------+

| root |127.0.0.1  |

| rep  | 172.16.1.% |

 

3.從主庫(kù)導(dǎo)出數(shù)據(jù)

按照我們講過(guò)的內(nèi)容,直接取今天00點(diǎn)的備份就可以.

先鎖表flush table with read lock;

mysql>flush table with read lock;

Query OK, 0rows affected (0.00 sec)

 

mysql> showmaster status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

|mysql-bin.000001 |      120 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set(0.00 sec)

mysqldump

cp/tar

xtrabackup

拿到位置點(diǎn)是關(guān)鍵[A1]  sed -n '22p'all_2017-06-28.sql

 

主庫(kù)全備

[root@db02 ~]# mysqldump -B --master-data=2 --single-transaction-S /data/3306/mysql.sock  -A|gzip>/data/backup/all_$(date+%F).sql.gz

[root@db02 ~]#ls -l /data/backup/

總用量 228

-rw-r--r-- 1root  root  178468 6月  28 11:11 all_2017-06-28.sql.gz

 

主庫(kù)解鎖:

mysql> unlock table;

Query OK, 0rows affected (0.00 sec)

 

 

4.從庫(kù)導(dǎo)入全備的數(shù)據(jù)

[root@db02scripts]# cd /data/backup/

[root@db02backup]# gzip -d all_2017-06-28.sql.gz

[root@db02backup]# mysql -S /data/3307/mysql.sock<all_2017-06-28.sql

 

5.找位置點(diǎn),然后change master從庫(kù)

[root@db02backup]# sed -n '22p' all_2017-06-28.sql

-- CHANGEMASTER TO MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;

 

change master從庫(kù)

 

CHANGE MASTER TO 

MASTER_HOST='172.16.1.52',

MASTER_PORT=3306,

MASTER_USER='rep',

MASTER_PASSWORD='oldboy123',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=120;

打開(kāi)slave

mysql> start slave;

Query OK, 0rows affected (0.03 sec)

 

mysql> show slave status\G

顯示如下就說(shuō)明成功

[root@db02backup]# mysql -S /data/3307/mysql.sock -e"show slave status\G"|egrep "_Running|Behind_Master"|head-3

             Slave_IO_Running:Yes

             Slave_SQL_Running:Yes

             Seconds_Behind_Master:0

 

 

3306查看管理的主機(jī)

mysql> show slave hosts;

+-----------+------+------+-----------+--------------------------------------+

| Server_id |Host | Port | Master_id | Slave_UUID                           |

+-----------+------+------+-----------+--------------------------------------+

|         7 |      | 3307 |         6 |295750c8-54c1-11e7-80dd-000c29fc02ee |

|         8 |      | 3308 |         6 |328e8c80-54c1-11e7-80dd-000c29fc02ee |

+-----------+------+------+-----------+--------------------------------------+

2 rows in set(0.00 sec)

 

 

 

 


看了以上關(guān)于MySQL主從復(fù)制基本要義和總結(jié),希望能給大家在實(shí)際運(yùn)用中帶來(lái)一定的幫助。本文由于篇幅有限,難免會(huì)有不足和需要補(bǔ)充的地方,如有需要更加專(zhuān)業(yè)的解答,可在官網(wǎng)聯(lián)系我們的24小時(shí)售前售后,隨時(shí)幫您解答問(wèn)題的。

 


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

免責(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)容。

AI