MySQL Replication
主從復(fù)制(也稱 AB 復(fù)制)允許將來自一個MySQL數(shù)據(jù)庫服務(wù)器(主服務(wù)器)的數(shù)據(jù)復(fù)制到一個或多個MySQL數(shù)據(jù)庫服務(wù)器(從服務(wù)器)。
==默認(rèn)情況下,復(fù)制是異步的 從站不需要永久連接以接收來自主站的更新逗宜。==
根據(jù)配置悯恍,您可以復(fù)制數(shù)據(jù)庫中的所有數(shù)據(jù)庫霹肝,所選數(shù)據(jù)庫甚至選定的表穆趴。
MySQL中復(fù)制的優(yōu)點包括:
- 橫向擴(kuò)展解決方案 - 在多個從站之間分配負(fù)載以提高性能饿凛。在此環(huán)境中只泼,所有寫入和更新都必須在主服務(wù)器上進(jìn)行剖笙。但是,讀取可以在一個或多個從設(shè)備上進(jìn)行请唱。該模型可以提高寫入性能(因為主設(shè)備專用于更新)枯途,同時顯著提高了越來越多的從設(shè)備的讀取速度。
- 數(shù)據(jù)安全性 - 因為數(shù)據(jù)被復(fù)制到從站籍滴,并且從站可以暫停復(fù)制過程酪夷,所以可以在從站上運行備份服務(wù)而不會破壞相應(yīng)的主數(shù)據(jù)。
- 分析 - 可以在主服務(wù)器上創(chuàng)建實時數(shù)據(jù)孽惰,而信息分析可以在從服務(wù)器上進(jìn)行晚岭,而不會影響主服務(wù)器的性能。
- 遠(yuǎn)程數(shù)據(jù)分發(fā) - 您可以使用復(fù)制為遠(yuǎn)程站點創(chuàng)建數(shù)據(jù)的本地副本勋功,而無需永久訪問主服務(wù)器坦报。
Replication 的原理
==前提是作為主服務(wù)器角色的數(shù)據(jù)庫服務(wù)器必須開啟二進(jìn)制日志==
主服務(wù)器上面的任何修改都會通過自己的 I/O tread(I/O 線程)保存在二進(jìn)制日志
Binary log
里面。從服務(wù)器上面也啟動一個 I/O thread狂鞋,通過配置好的用戶名和密碼, 連接到主服務(wù)器上面請求讀取二進(jìn)制日志片择,然后把讀取到的二進(jìn)制日志寫到本地的一個
Realy log
(中繼日志)里面。從服務(wù)器上面同時開啟一個 SQL thread 定時檢查
Realy log
(這個文件也是二進(jìn)制的)骚揍,如果發(fā)現(xiàn)有更新立即把更新的內(nèi)容在本機(jī)的數(shù)據(jù)庫上面執(zhí)行一遍字管。
每個從服務(wù)器都會收到主服務(wù)器二進(jìn)制日志的全部內(nèi)容的副本啰挪。
從服務(wù)器設(shè)備負(fù)責(zé)決定應(yīng)該執(zhí)行二進(jìn)制日志中的哪些語句。
除非另行指定嘲叔,否則主從二進(jìn)制日志中的所有事件都在從站上執(zhí)行亡呵。
如果需要,您可以將從服務(wù)器配置為僅處理一些特定數(shù)據(jù)庫或表的事件硫戈。
==重要: 您無法將主服務(wù)器配置為僅記錄特定事件锰什。==
每個從站(從服務(wù)器)都會記錄二進(jìn)制日志坐標(biāo):
- 文件名
- 文件中它已經(jīng)從主站讀取和處理的位置。
由于每個從服務(wù)器都分別記錄了自己當(dāng)前處理二進(jìn)制日志中的位置丁逝,因此可以斷開從服務(wù)器的連接汁胆,重新連接然后恢復(fù)繼續(xù)處理。
一主多從
如果一主多從的話霜幼,這時主庫既要負(fù)責(zé)寫又要負(fù)責(zé)為幾個從庫提供二進(jìn)制日志嫩码。此時可以稍做調(diào)整,將二進(jìn)制日志只給某一從辛掠,這一從再開啟二進(jìn)制日志并將自己的二進(jìn)制日志再發(fā)給其它從谢谦∈臀或者是干脆這個從不記錄只負(fù)責(zé)將二進(jìn)制日志轉(zhuǎn)發(fā)給其它從萝衩,這樣架構(gòu)起來性能可能要好得多,而且數(shù)據(jù)之間的延時應(yīng)該也稍微要好一些没咙。工作原理圖如下:
關(guān)于二進(jìn)制日志
mysqld將數(shù)字?jǐn)U展名附加到二進(jìn)制日志基本名稱以生成二進(jìn)制日志文件名猩谊。每次服務(wù)器創(chuàng)建新日志文件時,該數(shù)字都會增加祭刚,從而創(chuàng)建一系列有序的文件牌捷。每次啟動或刷新日志時,服務(wù)器都會在系列中創(chuàng)建一個新文件涡驮。服務(wù)器還會在當(dāng)前日志大小達(dá)到后自動創(chuàng)建新的二進(jìn)制日志文件 max_binlog_size
暗甥。二進(jìn)制日志文件可能會比max_binlog_size
使用大型事務(wù)時更大, 因為事務(wù)是以一個部分寫入文件捉捅,而不是在文件之間分割撤防。
為了跟蹤已使用的二進(jìn)制日志文件, mysqld還創(chuàng)建了一個二進(jìn)制日志索引文件棒口,其中包含所有使用的二進(jìn)制日志文件的名稱寄月。默認(rèn)情況下,它具有與二進(jìn)制日志文件相同的基本名稱无牵,并帶有擴(kuò)展名'.index'
漾肮。在mysqld運行時,您不應(yīng)手動編輯此文件茎毁。
術(shù)語二進(jìn)制日志文件
通常表示包含數(shù)據(jù)庫事件的單個編號文件克懊。
術(shù)語 二進(jìn)制日志
表示含編號的二進(jìn)制日志文件集加上索引文件。
SUPER
權(quán)限的用戶可以使用SET sql_log_bin=0
語句禁用其當(dāng)前環(huán)境下自己的語句的二進(jìn)制日志記錄
配置 Replication
配置步驟:
- 在主服務(wù)器上,您必須啟用二進(jìn)制日志記錄并配置唯一的服務(wù)器ID保檐。需要重啟服務(wù)器耕蝉。
編輯主服務(wù)器的配置文件 my.cnf
,添加如下內(nèi)容
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
創(chuàng)建日志目錄并賦予權(quán)限
shell> mkdir /var/log/mysql
shell> chown mysql.mysql /var/log/mysql
重啟服務(wù)
shell> systemctl restart mysqld
注意:
如果省略server-id(或?qū)⑵滹@式設(shè)置為默認(rèn)值0)夜只,則主服務(wù)器拒絕來自從服務(wù)器的任何連接垒在。
為了在使用帶事務(wù)的InnoDB進(jìn)行復(fù)制設(shè)置時盡可能提高持久性和一致性,
您應(yīng)該在master my.cnf文件中使用以下配置項:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
確保未在復(fù)制主服務(wù)器上啟用skip-networking選項扔亥。
如果已禁用網(wǎng)絡(luò)场躯,則從站無法與主站通信,并且復(fù)制失敗旅挤。
- 應(yīng)該創(chuàng)建一個專門用于復(fù)制數(shù)據(jù)的用戶
每個從站使用MySQL用戶名和密碼連接到主站踢关,因此主站上必須有用戶帳戶,從站可以使用該帳戶進(jìn)行連接粘茄。
master 上的任何賬戶都可以用于復(fù)制的操作签舞,前提是必須先被授權(quán)。
創(chuàng)建一個僅具有復(fù)制過程權(quán)限的單獨帳戶柒瓣,以最大程度地降低對其他帳戶的危害儒搭。
例如,要使用新用戶 repl
可以從任何主機(jī)上連接到 master
上進(jìn)行復(fù)制操作, 并且用戶 repl
僅可以使用復(fù)制的權(quán)限芙贫。
在 master
上執(zhí)行如下操作
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql>
- 在從服務(wù)器上使用剛才的用戶進(jìn)行測試連接
shell> mysql -urepl -p'123' -hmysql-master1
下面的操作根據(jù)如下情況繼續(xù)
主服務(wù)器中有數(shù)據(jù)
- 如果在啟動復(fù)制之前有現(xiàn)有數(shù)據(jù)需要與從屬設(shè)備同步搂鲫,請保持客戶端正常運行,以便鎖定保持不變磺平。這可以防止進(jìn)行任何進(jìn)一步的更改魂仍,以便復(fù)制到從站的數(shù)據(jù)與主站同步。
- 在主服務(wù)器中導(dǎo)出先有的數(shù)據(jù)
如果主數(shù)據(jù)庫包含現(xiàn)有數(shù)據(jù)拣挪,則必須將此數(shù)據(jù)復(fù)制到每個從站擦酌。有多種方法可以實現(xiàn):
要選擇轉(zhuǎn)儲數(shù)據(jù)庫的適當(dāng)方法,請在以下選項之間進(jìn)行選擇:
使用mysqldump工具創(chuàng)建要復(fù)制的所有數(shù)據(jù)庫的轉(zhuǎn)儲菠劝。這是推薦的方法赊舶,尤其是在使用時
InnoDB
。如果數(shù)據(jù)庫存儲在二進(jìn)制可移植文件中闸英,則可以將原始數(shù)據(jù)文件復(fù)制到從屬數(shù)據(jù)庫锯岖。這比使用mysqldump并在每個slave上導(dǎo)入文件更有效,因為它會
INSERT
在重放語句時省略更新索引的開銷 甫何。InnoDB
不建議這樣做出吹。
shell> mysqldump -u用戶名 -p密碼 --all-databases --master-data=1 > dbdump.db
這里的用戶是本機(jī)服務(wù)器的用戶
如果不使用 --master-data
,則需要手動鎖定單獨會話中的所有表辙喂。
- 從主服務(wù)器中使用
scp
或rsync
等工具捶牢,把備份出來的數(shù)據(jù)傳輸?shù)綇姆?wù)器中鸠珠。
在主服務(wù)中執(zhí)行如下命令
scp dbdump.db root@mysql-slave1:/root/
這里的
mysql-slave1
需要能在主服務(wù)器中ping
通。
- 配置從服務(wù)器秋麸,并重啟
在從服務(wù)器上編輯其配置文件my.cnf
并添加如下內(nèi)容:
// my.cnf 文件
[mysqld]
server-id=2
- 導(dǎo)入數(shù)據(jù)到從服務(wù)器渐排,并配置連接到主服務(wù)器的相關(guān)信息
在從服務(wù)器上操作
方式一:
導(dǎo)入數(shù)據(jù)
shell> mysql < /root/fulldb.dump
在從服務(wù)器上配置連接到主服務(wù)器的相關(guān)信息
進(jìn)入從服務(wù)執(zhí)行如下操作:
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master1',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
注意上面的
mysql-bin.000001
是你mysqldump
后的備份文件中出現(xiàn)的文件名。
而154
也是需要參照mysqldump
文件中的內(nèi)容灸蟆。
比如:cat /root/fulldb.dump CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
方式二:
/*導(dǎo)入數(shù)據(jù)*/
mysql> source /root/fulldb.dump
前提是mysqldump 時驯耻,使用
--master-data=1
, 這樣備份完成的文件中就會出現(xiàn)如下內(nèi)容:...略... CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; ...略...
```mysql
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master1',
MASTER_USER='repl',
MASTER_PASSWORD='123',
- 啟動從服務(wù)器的復(fù)制線程以開始復(fù)制
mysql> start slave;
Query OK, 0 rows affected (0.09 sec)
檢查是否成功
在從服務(wù)上執(zhí)行如下操作
mysql> show slave status\G
輸出結(jié)果中應(yīng)該看到 I/O 線程和 SQL 線程都是 YES
, 就表示成功。
執(zhí)行此過程后炒考,在主服務(wù)上操作的修改數(shù)據(jù)的操作都會在從服務(wù)器中執(zhí)行一遍可缚,這樣就保證了數(shù)據(jù)的一致性。
將新的服務(wù)器加入斋枢,變?yōu)閺姆?wù)器
和上面的步驟一樣帘靡,但是新加入的服務(wù)器的server-id
的值不能和現(xiàn)有都服務(wù)器 server-id
的值一樣。
假如在新加入從服務(wù)器之前瓤帚,主服務(wù)器執(zhí)行了刪除庫的操作描姚。
并且,刪除的庫剛好是在第一次mysqldump
備份時的數(shù)據(jù)中戈次。
就會出現(xiàn)問題轩勘,在從服務(wù)器上提示報錯沒有這個數(shù)據(jù)庫摄杂;
主服務(wù)器中無數(shù)據(jù)
主服務(wù)器中設(shè)置
-
my.cnf
配置文件
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
創(chuàng)建日志目錄并賦予權(quán)限
shell> mkdir /var/log/mysql
shell> chown mysql.mysql /var/log/mysql
重啟服務(wù)
從服務(wù)器設(shè)置
-
my.cnf
配置文件
[mysqld]
server-id=3
重啟服務(wù)
- 查看主服務(wù)器的二進(jìn)制日志的名稱
通過使用命令行客戶端連接到主服務(wù)器來啟動主服務(wù)器上的會話,并通過執(zhí)行以下FLUSH TABLES WITH READ LOCK
語句來刷新所有表和阻止寫語句:
mysql> mysql> FLUSH TABLES WITH READ LOCK;
mysql> show master status \G
****************** 1\. row ****************
File: mysql-bin.000001
Position: 0
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
- 在從服務(wù)器的 mysql 中執(zhí)行如下語句
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master1',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
mysql> start slave;
查看
在master上執(zhí)行show binlog events命令拳魁,可以看到第一個binlog文件的內(nèi)容篱昔。
mysql> show binlog events\G
*************************** 1\. row ***************************
Log_name: mysql-bin.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 107
Info: Server ver: 5.5.28-0ubuntu0.12.10.2-log, Binlog ver: 4
*************************** 2\. row ***************************
Log_name: mysql-bin.000001
Pos: 107
Event_type: Query
Server_id: 1
End_log_pos: 181
Info: create user rep
*************************** 3\. row ***************************
Log_name: mysql-bin.000001
Pos: 181
Event_type: Query
Server_id: 1
End_log_pos: 316
Info: grant replication slave on *.* to rep identified by '123456'
3 rows in set (0.00 sec)
- Log_name 是二進(jìn)制日志文件的名稱,一個事件不能橫跨兩個文件
- Pos 這是該事件在文件中的開始位置
- Event_type 事件的類型帅矗,事件類型是給slave傳遞信息的基本方法,每個新的binlog都以Format_desc類型開始,以Rotate類型結(jié)束
- Server_id 創(chuàng)建該事件的服務(wù)器id
- End_log_pos 該事件的結(jié)束位置搂捧,也是下一個事件的開始位置,因此事件范圍為Pos~End_log_pos - 1
- Info 事件信息的可讀文本懂缕,不同的事件有不同的信息
在從站上暫停復(fù)制
您可以使用STOP SLAVE
和 START SLAVE
語句停止并啟動從站上的復(fù)制 允跑。
要停止從主服務(wù)器處理二進(jìn)制日志,請使用 STOP SLAVE
:
mysql> STOP SLAVE;
當(dāng)復(fù)制停止時搪柑,從I / O線程停止從主二進(jìn)制日志讀取事件并將它們寫入中繼日志聋丝,并且SQL線程停止從中繼日志讀取事件并執(zhí)行它們。您可以通過指定線程類型單獨暫停I / O或SQL線程:
mysql> STOP SLAVE IO_THREAD;
mysql> STOP SLAVE SQL_THREAD;
要再次開始執(zhí)行工碾,請使用以下START SLAVE
語句:
mysql> START SLAVE;
要啟動特定線程弱睦,請指定線程類型:
mysql> START SLAVE IO_THREAD;
mysql> START SLAVE SQL_THREAD;
復(fù)制原理實現(xiàn)細(xì)節(jié)
MySQL復(fù)制功能使用三個線程實現(xiàn),一個在主服務(wù)器上渊额,兩個在從服務(wù)器上:
-
Binlog轉(zhuǎn)儲線程 主設(shè)備創(chuàng)建一個線程况木,以便在從設(shè)備連接時將二進(jìn)制日志內(nèi)容發(fā)送到從設(shè)備垒拢。可以
SHOW PROCESSLIST
在主服務(wù)器的輸出中將此線程標(biāo)識為Binlog Dump
線程火惊。二進(jìn)制日志轉(zhuǎn)儲線程獲取主機(jī)二進(jìn)制日志上的鎖求类,用于讀取要發(fā)送到從機(jī)的每個事件。一旦讀取了事件屹耐,即使在事件發(fā)送到從站之前尸疆,鎖也會被釋放。
-
從屬 I/O線程 在從屬服務(wù)器上發(fā)出
START SLAVE
語句時惶岭,從屬服務(wù)器會創(chuàng)建一個 I/O 線程仓技,該線程連接到主服務(wù)器并要求主服務(wù)器發(fā)送其在二進(jìn)制日志中的更新記錄。從屬 I/O線程讀取主
Binlog Dump
線程發(fā)送的更新 (請參閱上一項)并將它們復(fù)制到包含從屬中繼日志的本地文件俗他。此線程的狀態(tài)顯示為
Slave_IO_running
輸出SHOW SLAVE STATUS
或Slave_running
輸出中的狀態(tài)SHOW STATUS
脖捻。 從屬SQL線程 從屬設(shè)備創(chuàng)建一個SQL線程來讀取由從屬 I/O 線程寫入的中繼日志,并執(zhí)行其中包含的事件兆衅。
當(dāng)從屬服務(wù)器從放的事件地沮,追干上主服務(wù)器的事件后,從屬服務(wù)器的 I/O 線程將會處于休眠狀態(tài)羡亩,直到主服務(wù)器的事件有更新時摩疑,被主服務(wù)器發(fā)送的信號喚醒。
在前面的描述中畏铆,每個主/從連接有三個線程雷袋。具有多個從站的主站為每個當(dāng)前連接的從站創(chuàng)建一個二進(jìn)制日志轉(zhuǎn)儲線程,每個從站都有自己的I / O和SQL線程辞居。
從站使用兩個線程將讀取更新與主站分開并將它們執(zhí)行到獨立任務(wù)中楷怒。因此,如果語句執(zhí)行緩慢瓦灶,則不會減慢讀取語句的任務(wù)鸠删。例如,如果從服務(wù)器尚未運行一段時間贼陶,則當(dāng)從服務(wù)器啟動時刃泡,其I / O線程可以快速從主服務(wù)器獲取所有二進(jìn)制日志內(nèi)容,即使SQL線程遠(yuǎn)遠(yuǎn)落后碉怔。如果從服務(wù)器在SQL線程執(zhí)行了所有獲取的語句之前停止烘贴,則I / O線程至少已獲取所有內(nèi)容,以便語句的安全副本本地存儲在從屬的中繼日志中撮胧,準(zhǔn)備在下次執(zhí)行時執(zhí)行奴隸開始桨踪。
該SHOW PROCESSLIST
語句提供的信息可以告訴您主服務(wù)器和從服務(wù)器上有關(guān)復(fù)制的信息。有關(guān)主狀態(tài)的信息趴樱,請參見第8.14.4節(jié)“復(fù)制主線程狀態(tài)”馒闷。有關(guān)從站狀態(tài)酪捡,請參見第8.14.5節(jié)“復(fù)制從站I / O線程狀態(tài)”和 第8.14.6節(jié)“復(fù)制從站SQL線程狀態(tài)”。
以下示例說明了三個線程如何顯示在輸出中SHOW PROCESSLIST
纳账。
在主服務(wù)器上逛薇,輸出SHOW PROCESSLIST
如下所示:
mysql> SHOW PROCESSLIST\G
*************************** 1\. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to
be updated
Info: NULL
這里,線程2是Binlog Dump
為連接的從屬服務(wù)的復(fù)制線程疏虫。該 State
信息表明所有未完成的更新已發(fā)送到從站永罚,并且主站正在等待更多更新發(fā)生。如果Binlog Dump
在主服務(wù)器上看不到任何 線程卧秘,則表示復(fù)制未運行; 也就是說呢袱,目前沒有連接任何從站。
在從屬服務(wù)器上翅敌,輸出SHOW PROCESSLIST
如下所示:
mysql> SHOW PROCESSLIST\G
*************************** 1\. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2\. row ***************************
Id: 11
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O
thread to update it
Info: NULL
該State
信息指示線程10是與主服務(wù)器通信的I / O線程羞福,并且線程11是處理存儲在中繼日志中的更新的SQL線程。在 SHOW PROCESSLIST
運行時蚯涮,兩個線程都處于空閑狀態(tài)治专,等待進(jìn)一步更新。
Time
列中 的值可以顯示從站與主站進(jìn)行比較的時間遭顶。請參見 第A.13節(jié)“MySQL 5.7 FAQ:復(fù)制”张峰。如果主站側(cè)有足夠的時間在Binlog Dump
線程上沒有活動,則主站確定從站不再連接棒旗。對于任何其他客戶端連接喘批,這樣做的超時取決于的值 net_write_timeout
和 net_retry_count
; 有關(guān)這些的更多信息,請參見第5.1.7節(jié)“服務(wù)器系統(tǒng)變量”铣揉。
該SHOW SLAVE STATUS
語句提供有關(guān)從屬服務(wù)器上的復(fù)制處理的其他信息饶深。請參見 第16.1.7.1節(jié)“檢查復(fù)制狀態(tài)”。
基于事務(wù)的 Replication
就是利用 GTID 來實現(xiàn)的復(fù)制
GTID(全局事務(wù)標(biāo)示符)最初由google實現(xiàn)老速,在MySQL 5.6中引入.GTID在事務(wù)提交時生成粥喜,由UUID和事務(wù)ID組成.uuid會在第一次啟動MySQL時生成凸主,保存在數(shù)據(jù)目錄下的auto .CNF文件里橘券,事務(wù)ID則從1開始自增使用GTID的好處主要有兩點:
- 不再需要指定傳統(tǒng)復(fù)制中的master_log_files和master_log_pos,使主從復(fù)制更簡單可靠
- 可以實現(xiàn)基于庫的多線程復(fù)制卿吐,減小主從復(fù)制的延遲
實驗環(huán)境要求: 5.7.6 以上版本
主庫配置
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1 # 強(qiáng)制執(zhí)行GTID一致性旁舰。
重啟服務(wù)
其他和之前的一樣
- 創(chuàng)建專屬用戶并授權(quán)
- 假如有數(shù)據(jù)導(dǎo)出數(shù)據(jù)
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql>
從庫配置
測試用戶有效性
shell> mysql -urepl -p'123' -hmysql-master1
[mysqld]
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
# 可選項, 把連接到 master 的信息存到數(shù)據(jù)庫中的表中
master-info-repository=TABLE
relay-log-info-repository=TABLE
重啟服務(wù)
假如有數(shù)據(jù),先導(dǎo)入數(shù)據(jù)
mysql> source dump.db
Mysql 終端執(zhí)行連接信息
mysql> CHANGE MASTER TO
MASTER_HOST='172.16.153.10',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_AUTO_POSITION=1;
> start slave;
開啟 GTID 后的導(dǎo)出導(dǎo)入數(shù)據(jù)的注意點
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events
意思是: 當(dāng)前數(shù)據(jù)庫實例中開啟了 GTID 功能, 在開啟有 GTID 功能的數(shù)據(jù)庫實例中, 導(dǎo)出其中任何一個庫, 如果沒有顯示地指定--set-gtid-purged參數(shù), 都會提示這一行信息. 意思是默認(rèn)情況下, 導(dǎo)出的庫中含有 GTID 信息, 如果不想導(dǎo)出包含有 GTID 信息的數(shù)據(jù)庫, 需要顯示地添加--set-gtid-purged=OFF參數(shù).
mysqldump -uroot -p --set-gtid-purged=OFF --all-databases > alldb.db
導(dǎo)入數(shù)據(jù)是就可以相往常一樣導(dǎo)入了嗡官。
配置多線程復(fù)制
多線程復(fù)制在 5.6
中被引入箭窜,并且在 5.7
中得到了進(jìn)一步的完善。
5.7
中是基于邏輯時鐘的方式進(jìn)行的多線程復(fù)制衍腥。
配置過程:
- 先在從庫上查看默認(rèn)的多線程復(fù)制類型
mysql> show variables like "slave_parallel_type";
+---------------------+----------+
| Variable_name | Value |
+---------------------+----------+
| slave_parallel_type | DATABASE |
+---------------------+----------+
1 row in set (0.01 sec)
mysql>
- 接著在從庫上停止目前正在運行復(fù)制鏈路
停止之前可以查看目前的線程數(shù)
show processlist;
mysql> stop slave
- 配置并發(fā)線程的方式
mysql> set global slave_parallel_type = "logical_clock";
Query OK, 0 rows affected (0.00 sec)
- 配置并發(fā)數(shù)量
mysql> set global slave_parallel_workers = 4;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "slave_parallel_workers";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| slave_parallel_workers | 4 |
+------------------------+-------+
1 row in set (0.00 sec)
- 啟動從服務(wù)器的復(fù)制鏈路
mysql> start slave
關(guān)于復(fù)制的架構(gòu)(擴(kuò)展)
-
主主復(fù)制
上圖中磺樱,Master-Master復(fù)制的兩臺服務(wù)器纳猫,既是master,又是另一臺服務(wù)器的slave竹捉。這樣芜辕,任何一方所做的變更,都會通過復(fù)制應(yīng)用到另外一方的數(shù)據(jù)庫中块差。在這種復(fù)制架構(gòu)中侵续,各自上運行的不是同一db,比如左邊的是db1,右邊的是db2憨闰,db1的從在右邊反之db2的從在左邊状蜗,兩者互為主從,再輔助一些監(jiān)控的服務(wù)還可以實現(xiàn)一定程度上的高可以用鹉动。
-
主動—被動模式的Master-Master(Master-Master in Active-Passive Mode)
上圖中轧坎,這是由master-master結(jié)構(gòu)變化而來的,它避免了M-M的缺點泽示,實際上眶根,這是一種具有容錯和高可用性的系統(tǒng)。它的不同點在于其中只有一個節(jié)點在提供讀寫服務(wù)边琉,另外一個節(jié)點時刻準(zhǔn)備著属百,當(dāng)主節(jié)點一旦故障馬上接替服務(wù)。比如通過corosync+pacemaker+drbd+MySQL就可以提供這樣一組高可用服務(wù)变姨,主備模式下再跟著slave服務(wù)器族扰,也可以實現(xiàn)讀寫分離。
-
帶從服務(wù)器的Master-Master結(jié)構(gòu)(Master-Master with Slaves)
這種結(jié)構(gòu)的優(yōu)點就是提供了冗余定欧。在地理上分布的復(fù)制結(jié)構(gòu)渔呵,它不存在單一節(jié)點故障問題,而且還可以將讀密集型的請求放到slave上砍鸠。
半同步機(jī)制(擴(kuò)展)
MySQL-5.5 及以上支持半同步復(fù)制
早前的MySQL復(fù)制只能是基于異步來實現(xiàn)扩氢,從MySQL-5.5開始,支持半自動復(fù)制爷辱。在以前的異步(asynchronous)復(fù)制中录豺,主庫在執(zhí)行完一些事務(wù)后,是不會管備庫的進(jìn)度的饭弓。如果備庫處于落后双饥,而更不幸的是主庫此時又出現(xiàn)Crash(例如宕機(jī)),這時備庫中的數(shù)據(jù)就是不完整的弟断。簡而言之咏花,在主庫發(fā)生故障的時候,我們無法使用備庫來繼續(xù)提供數(shù)據(jù)一致的服務(wù)了阀趴。Semisynchronous Replication(半同步復(fù)制)則一定程度上保證提交的事務(wù)已經(jīng)傳給了至少一個備庫昏翰。Semi synchronous中苍匆,僅僅保證事務(wù)的已經(jīng)傳遞到備庫上,但是并不確保已經(jīng)在備庫上執(zhí)行完成了棚菊。
此外锉桑,還有一種情況會導(dǎo)致主備數(shù)據(jù)不一致。在某個session中窍株,主庫上提交一個事務(wù)后民轴,會等待事務(wù)傳遞給至少一個備庫,如果在這個等待過程中主庫Crash球订,那么也可能備庫和主庫不一致后裸,這是很致命的。如果主備網(wǎng)絡(luò)故障或者備庫掛了冒滩,主庫在事務(wù)提交后等待10秒(rpl_semi_sync_master_timeout的默認(rèn)值)后微驶,就會繼續(xù)。這時开睡,主庫就會變回原來的異步狀態(tài)因苹。
MySQL在加載并開啟Semi-sync插件后,每一個事務(wù)需等待備庫接收日志后才返回給客戶端篇恒。如果做的是小事務(wù)扶檐,兩臺主機(jī)的延遲又較小,則Semi-sync可以實現(xiàn)在性能很小損失的情況下的零數(shù)據(jù)丟失胁艰。
關(guān)于主從復(fù)制的更多參數(shù)
官網(wǎng): https://dev.mysql.com/doc/refman/5.7/en/change-master-to.html
加密復(fù)制
官網(wǎng):https://dev.mysql.com/doc/refman/5.7/en/replication-solutions-encrypted-connections.html
主服務(wù)器
創(chuàng)建 CA 證書和私鑰 公鑰
shell> mysql_ssl_rsa_setup
My.cnf 文件配置項
以下的情況是用 yum
安裝 mysql 的情況
[mysqld]
ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/server-cert.pem
ssl-key=/var/lib/mysql/server-key.pem
選項如下:
-
--ssl-ca
:證書頒發(fā)機(jī)構(gòu)(CA)證書文件的路徑名款筑。(--ssl-capath
類似但指定CA證書文件目錄的路徑名。)--ssl-cert
:服務(wù)器公鑰證書文件的路徑名腾么∧问幔可以將其發(fā)送到客戶端,并根據(jù)其擁有的CA證書進(jìn)行身份驗證解虱。--ssl-key
:服務(wù)器私鑰文件的路徑名攘须。
從服務(wù)器配置
首先要保證從服務(wù)器的 sql 線程和 io 線程處于關(guān)閉狀態(tài)
mysql> stop slave;
mysql> stop slave sql_thread;
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_hostname',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_SSL=1,
-> MASTER_SSL_CA = 'ca_file_name',
-> MASTER_SSL_CAPATH = 'ca_directory_name',
-> MASTER_SSL_CERT = 'cert_file_name',
-> MASTER_SSL_KEY = 'key_file_name';
mysql> START SLAVE;
關(guān)于復(fù)制用戶
全新創(chuàng)建
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password'
-> REQUIRE SSL;
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'%.example.com';
給原來的用戶添加 REQUIRE SSL
mysql> ALTER USER 'repl'@'%.example.com' REQUIRE SSL;
二進(jìn)制的日志的自動刪除
Mysql 終端中設(shè)置
不用重啟服務(wù)
下面的命令是只保留 10 天內(nèi)的日志,就是10天前的全部刪除
mysql> set global expire_logs_days = 10;
當(dāng)二進(jìn)制日志的大小達(dá)到max_binlog_size
系統(tǒng)變量的值時殴泰,將刷新二進(jìn)制日志 于宙。
屬性 | 值 |
---|---|
命令行格式 | --max-binlog-size=# |
系統(tǒng)變量 | max_binlog_size |
范圍 | 全局 |
動態(tài) | 是 |
類型 | 整數(shù) |
默認(rèn)值 | 1073741824 |
最低價值 | 4096 |
最大價值 | 1073741824 |
如果對二進(jìn)制日志的寫入導(dǎo)致當(dāng)前日志文件大小超過此變量的值,則服務(wù)器將輪轉(zhuǎn)二進(jìn)制日志(關(guān)閉當(dāng)前文件并打開下一個文件)艰匙。最小值為4096字節(jié)限煞。最大值和默認(rèn)值為1GB。
事務(wù)在一個塊中寫入二進(jìn)制日志员凝,因此它永遠(yuǎn)不會在幾個二進(jìn)制日志之間拆分。因此奋献,如果您有大事務(wù)健霹,您可能會看到大于的二進(jìn)制日志文件max_binlog_size
旺上。
如果max_relay_log_size
為0,則該值也 max_binlog_size
適用于中繼日志糖埋。
配置文件中設(shè)置
此方法需要重啟服務(wù)
[mysqld]
expire_logs_days=10
在 MySQL 終端中手動刪除
--清除MySQL-bin.010日志
mysql> PURGE MASTER LOGS TO 'MySQL-bin.010';
--清除2008-06-22 13:00:00前binlog日志
mysql> PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
--清除3天前binlog日志BEFORE宣吱,變量的date自變量可以為'YYYY-MM-DD hh:mm:ss'格式。
mysql> PURGE MASTER LOGS BEFORE DATE_SUB( NOW(), INTERVAL 3 DAY);