大家經(jīng)常聽說主從復(fù)制,那么主從復(fù)制的意義?能解決的問題有哪些?主從復(fù)制能解決的問題就是在我們平時(shí)開發(fā)的程序中操作數(shù)據(jù)庫的時(shí)候,大多數(shù)的情況查詢的操作大大超過了寫的操作,也就說對數(shù)據(jù)庫讀取數(shù)據(jù)的壓力比較大的問題,為了保證數(shù)據(jù)庫操作的效率,我們一般把讀的操作放在一個(gè)數(shù)據(jù)庫執(zhí)行(從庫),比較耗時(shí)與頻繁I/O的操作放在另外一個(gè)數(shù)據(jù)庫(我們稱之為主庫);這樣做的意義就是減輕主庫操作的壓力,主從庫可以各行其事,提高了數(shù)據(jù)庫的操作效率!
一、主從復(fù)制的原理
主庫會生成一個(gè)I/O操作線程進(jìn)去寫的的操作,而從庫則生成兩個(gè)線程,其一是I/O讀取線程,其二是一個(gè)SQL線程。
總結(jié)如下三點(diǎn):
1、主庫將數(shù)據(jù)的操作記錄到一個(gè)二進(jìn)制日志中(即:binary log),也就是配置文件中指定的log-bin指定的文件就是日志文件。
2、從庫將主庫的日志文件拷貝到他的中繼日志即配置文件中指定的relay log日志文件中,I/O線程去請求主庫的bin-log日志,并將日志寫入到relay log中繼日志中,此時(shí)主庫會生成一個(gè)log dump線程,用來給從庫I/O線程傳輸bin-log日志件。
3、從庫會更新relay log文件中的操作,將數(shù)據(jù)的改變在從庫中進(jìn)行數(shù)據(jù)重演即重新執(zhí)行一次,即SQL線程執(zhí)行操作,將日志文件中的記錄變?yōu)閿?shù)據(jù)操作行為再次執(zhí)行,以達(dá)到主從數(shù)據(jù)最終一致性的目的。
二、主從復(fù)制原理圖
注意
需要注意的是主從復(fù)制需要大量的I/O操作,所以延時(shí)是不可避免的。
三、準(zhǔn)備工作
準(zhǔn)備兩臺服務(wù)器(模擬一主一從),并安裝相同版本的MySQL數(shù)據(jù)庫。
主庫(master)地址:192.168.197.132 端口:3306。
從庫(slave)地址:197.168.197.131 端口:3306。
版本:MySQL 8.0.25。
準(zhǔn)備工作注意事項(xiàng):
1、 每個(gè)master可以有多個(gè)slave,每個(gè)slave只屬于一個(gè)master;
2、 數(shù)據(jù)庫的版本必須保證一致;
3、 數(shù)據(jù)庫的數(shù)據(jù)必須保證一致;
4、 主庫與從庫中配置文件中的server_id都必須唯一。
四、主庫配置
配置文件修改my.cnf的[mysqld]欄位下,所有配置文件路徑等不要出現(xiàn)中文、空格等非法操作。
4.1 配置文件
# 主機(jī)my.cnf配置文件如下:
#主服務(wù)器唯一ID
server-id=1
#啟用二進(jìn)制日志
log-bin=master-bin
#log-error=/opt/log #出錯(cuò)日志
#設(shè)置不要復(fù)制的數(shù)據(jù)庫
binlog-ignore-db=testDB
#設(shè)置需要復(fù)制的數(shù)據(jù)庫
binlog-do-db=mydb2
# 設(shè)置logbin格式,默認(rèn)就是statement
# statement:#日志記錄的是主機(jī)數(shù)據(jù)庫的寫指令 ,獲取默認(rèn)系統(tǒng)參數(shù)會出現(xiàn)數(shù)據(jù)不同步的情況,基本是可以忍受的,開發(fā)中大多數(shù)情況用的就是這種
# row:#基本不用
# mixed:#新出來的,與statement差不多,不會出現(xiàn)數(shù)據(jù)不同步現(xiàn)象
binlog_format=STATEMENT
4.2 操作命令
主庫創(chuàng)建從庫同步的用戶,并授權(quán)。
操作命令如下:
# 創(chuàng)建slave用戶
CREATE USER 'slave01'@'%';
# 設(shè)置密碼
ALTER USER 'slave01'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 授權(quán)
GRANT REPLICATION SLAVE ON *.* TO 'slave01'@'%';
flush privileges;
查詢主節(jié)點(diǎn)信息命令:
SHOW MASTER STATUS
結(jié)果如下圖:
需要記錄下Position值,需要在從庫中設(shè)置同步起始值,特別重要,到此為止主庫切記不要再動任何操作。
五、從庫配置
從庫的配置就更加少了,除了server-id依然要保持唯一性,需要再加一個(gè)中繼日志配置即可。
5.1 配置文件
# 從機(jī)my.cnf配置文件如下
# server-id保證唯一并配置修改中繼日志
server-id=2
# MySQL中繼日志
relay-log=mysql-relay
注意
修改完配置文件需要重新啟動數(shù)據(jù)庫服務(wù)。
重啟命令:
systemctl restart mysqldSUMMER
5.2 操作命令
從庫執(zhí)行配置主從關(guān)系:
CHANGE MASTER TO
MASTER_HOST = '192.168.197.132',
MASTER_PORT = 3306,
MASTER_USER = 'slave01',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'master-bin-log.000001',
MASTER_LOG_POS = 1048;
語句詳解:
master_port:主庫的ip地址
master_port:主庫的端口
master_user:用戶名
master_password:密碼
master_log_file:上節(jié)中主庫查詢的file項(xiàng)對應(yīng)的值
master_log_pos:上節(jié)中主庫查詢的的值
啟動slave同步:
START SLAVE;
查看同步狀態(tài):
SHOW SLAVE STATUS;
六、主從復(fù)制測試成果
在主庫創(chuàng)建testdb數(shù)據(jù)庫,刷新從庫即可看到新建的testdb庫;
主庫testdb創(chuàng)建test1表,從庫出現(xiàn)test1表。
主庫修改數(shù)據(jù),從庫跟著改變。
總結(jié)
通過配置主從復(fù)制在一定程度上可以減輕服務(wù)器的壓力,提高應(yīng)用的體驗(yàn);并且可以達(dá)到讀庫與寫庫在數(shù)據(jù)一致性方面達(dá)到最終一致性,寫的操作必須操作于主庫,讀數(shù)據(jù)則沒有限制。