主從復(fù)制
概念
MySQL主從復(fù)制谁帕,可以將一臺MySQL數(shù)據(jù)庫服務(wù)器(主)上的數(shù)據(jù)復(fù)制
到另外一臺或者多臺數(shù)據(jù)庫服務(wù)器(從)上辩蛋,保持主從數(shù)據(jù)的一致性
技健。
根據(jù)不同的配置骄呼,可以選擇將主庫中的所有數(shù)據(jù)庫、指定數(shù)據(jù)庫或者數(shù)據(jù)庫中的指定表
復(fù)制到從庫中琼富。
作用
MySQL主從復(fù)制的作用包括:
-
數(shù)據(jù)備份仪吧,高可用性
。對數(shù)據(jù)進(jìn)行熱備份
鞠眉,將主從部署在不同的服務(wù)器上薯鼠。當(dāng)主庫宕機(jī)故障
,可以快速進(jìn)行主從切換
械蹋,提高可用性出皇。
-
-
讀寫分離,橫向擴(kuò)展朝蜘,提高性能
。將所有的更新操作路由至主庫涩金,查詢操作路由至從庫谱醇,進(jìn)行讀寫分離
暇仲。同時可以通過配置多個從庫進(jìn)行擴(kuò)展
,提高查詢性能副渴。
-
-
數(shù)據(jù)安全
奈附。在從庫上執(zhí)行備份操作,而不影響主庫的數(shù)據(jù)煮剧。也可以配置延遲復(fù)制
斥滤,在出現(xiàn)異常操作時,可以及時進(jìn)行數(shù)據(jù)恢復(fù)
勉盅。
-
-
數(shù)據(jù)分析與長距離分發(fā)
佑颇。使用從庫進(jìn)行數(shù)據(jù)分析和供遠(yuǎn)端站點(diǎn)使用,而不影響主庫的性能草娜。
-
原理
MySQL的主從復(fù)制依賴于MySQL binlog詳解與解析工具指南文章中提及的MySQL的binlog功能
挑胸。
- ? 主庫將
數(shù)據(jù)變更的語句或者行數(shù)據(jù)變化
,記錄到binlog中宰闰; - ? 主庫上的
dump線程
茬贵,采集binlog數(shù)據(jù)與從庫的IO線程進(jìn)行交互; - ? 從庫的
IO線程
將獲取到的數(shù)據(jù)轉(zhuǎn)儲成relaylog文件移袍; - ? 從庫的
SQL線程
將relaylog中的數(shù)據(jù)讀取出來解藻,并在從庫上進(jìn)行回放。
主從庫相應(yīng)的線程信息如下圖:
主庫:
從庫:
主從同步模式
異步:MySQL默認(rèn)
的復(fù)制模式葡盗。主庫執(zhí)行完并寫入binlog后螟左,不關(guān)心從庫是否處理了事務(wù)
,立即將結(jié)果返回給客戶端戳粒。
在該模式下路狮,無法保證任何事務(wù)都被傳達(dá)到副本,若此時主庫宕機(jī)崩潰蔚约,進(jìn)行故障轉(zhuǎn)移后出現(xiàn)數(shù)據(jù)丟失
奄妨。
全同步:當(dāng)主庫提交事務(wù)后,要等待所有的從庫
都提交事務(wù)后苹祟,才能將結(jié)果返回給客戶端砸抛。
該模式下,可以隨時從主庫進(jìn)行故障轉(zhuǎn)移到任何從庫树枫,不擔(dān)心數(shù)據(jù)丟失直焙。但是可能導(dǎo)致事務(wù)的執(zhí)行時間延長
。
半同步:介于異步與全同步之間砂轻。主庫提交事務(wù)后奔誓,等待至少一個(數(shù)量可配)從庫
收到并記錄事務(wù),然后提交事務(wù)返回結(jié)果搔涝。
延遲同步:故意配置
從庫落后于主庫指定的時間厨喂。
該模式下和措,可以防止用戶在主庫上犯錯,DBA可以進(jìn)行數(shù)據(jù)恢復(fù)
蜕煌;可以檢查延遲之前的數(shù)據(jù)庫狀態(tài)
派阱。
基于binlog文件位置的復(fù)制
根據(jù)不同的場景,要使用不同的方法來配置主從同步斜纪。但是通用的一般步驟
如下(不同的場景只是在相應(yīng)的步驟上進(jìn)行特定的優(yōu)化與修改):
- ? 在主庫上開啟binlog贫母,同時配置唯一的server ID。注意:該操作可能需要
重啟主庫
盒刚。
[mysqld]
log-bin=mysql-bin
server-id=1
在配置文件中開啟binlog腺劣,設(shè)置server-id(范圍1-2<sup>32</sup> - 1,且不同于其他數(shù)據(jù)庫實例
)
- ? 在從庫上配置唯一server ID伪冰。注意:該操作可能需要重啟從庫誓酒。
- ? 在庫上創(chuàng)建單獨(dú)的用戶,用于從庫讀取主庫的binlog贮聂。
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
- ? 獲取主庫當(dāng)前binlog文件及其位置靠柑。
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 73
Binlog_Do_DB: test
Binlog_Ignore_DB: manual, mysql
Executed_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
1 row in set (0.00 sec)
使用SHOW MASTER STATUS
語句可以確定二進(jìn)制文件:mysql-bin.000003,位置:73吓懈。
這些信息用來配置從庫時歼冰,告訴從庫開始復(fù)制主庫的起始點(diǎn)。
- ? 如果主實例已經(jīng)有數(shù)據(jù)耻警,需要創(chuàng)建數(shù)據(jù)快照隔嫡,將其數(shù)據(jù)copy到從實例。不同的存儲引擎創(chuàng)建數(shù)據(jù)快照的方法不一樣甘穿。
創(chuàng)建數(shù)據(jù)快照的方法有很多種:MySQL dump
腮恩;copy數(shù)據(jù)庫原始數(shù)據(jù)文件
;使用第三方工具等
温兼,在之后會詳細(xì)分享不同的方法秸滴。 - ? 配置從庫連接主庫:
mysql> CHANGE MASTER TO
-> MASTER_HOST='source_host_name',
-> MASTER_PORT='source_port_num',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
->
MASTER_HOST、MASTER_PORT
主庫的主機(jī)和端口募判,
MASTER_USER荡含、MASTER_PASSWORD
上述步驟中在主庫上創(chuàng)建的賬號與密碼,
MASTER_LOG_FILE届垫、MASTER_LOG_POS
上述步驟中獲取的主庫的二進(jìn)制文件及位置释液。
- ? 開啟同步并查看同步狀態(tài)
start slave;
開啟同步;
show slave status\G
查看同步狀態(tài)装处;
至此误债,配置的主從的一般步驟就完成了。
如果是主庫與從庫都是新安裝
,主庫沒有數(shù)據(jù)需要copy到從庫寝蹈,使用上述步驟就可以配置成功糟袁。
但是如果主庫存在數(shù)據(jù)
,或者要將新安裝的從庫加入到已有的主從關(guān)系中
躺盛,就需要在配置從庫連接主庫前,進(jìn)行額外的操作形帮,
主要是根據(jù)主庫的狀態(tài)和數(shù)據(jù)槽惫,使用不同的方法將數(shù)據(jù)copy到從庫
中,在之后會詳細(xì)分享不同的方法辩撑。