共計(jì) 2879 個字符,預(yù)計(jì)需要花費(fèi) 8 分鐘才能閱讀完成。
MySQL 主從復(fù)制怎樣實(shí)現(xiàn)高可用,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
1. MySQL 主從復(fù)制實(shí)現(xiàn)高可用 1.1. 數(shù)據(jù)庫永遠(yuǎn)是系統(tǒng)最脆弱的環(huán)節(jié)
80% 都是查詢
緩存來保護(hù)數(shù)據(jù)庫:Redis、ElasticSearch
數(shù)據(jù)庫系統(tǒng)要有一定的容災(zāi)能力
數(shù)據(jù)狀態(tài)化明顯
1.2. 數(shù)據(jù)庫的 HA 實(shí)現(xiàn)的方式 1.2.1. 高可以計(jì)算方式
MTTF:平均無故障時間
MTTR:平均維護(hù)時間
HA=MTTF/(MTTF+MTTR)* 100%(這就是常說的 99.95%)
1.2.2. 數(shù)據(jù)庫高可用的三種方式
主從(非對稱)
master-slave,熱數(shù)據(jù)備份,從庫一般是用來實(shí)時備份,從機(jī)可以快速切換為主庫,讀寫分離(數(shù)據(jù)的一致性),從庫一般設(shè)置為只讀
前端應(yīng)用走緩存,后端應(yīng)用 Report 走從庫查
對稱方式
兩個節(jié)點(diǎn),互為主從,雙主模式(兩個數(shù)據(jù)庫的主鍵如果是自動生成需要初始設(shè)置成不一樣的)
A-1001,1003,1005,B-1002,1004,1006
雙主下數(shù)據(jù)同步一定要實(shí)時
多機(jī)方式
MHA
MMM
MyCat(可以實(shí)現(xiàn)雙主機(jī)熱切)
1.2.3. 主從實(shí)現(xiàn)的邏輯
資源:兩臺數(shù)據(jù)庫
Master 會將修改記錄進(jìn) binlog
Slave 從主庫 binlog 讀取數(shù)據(jù)寫入 relaylog
relaylog 和 binlog 的格式一樣,可以用 mysqlbinlog 讀取 relaylog
mysql show relaylog events in relay-bin.000001
binlog 的 postition 方式
GTID 方式:MySQL 版本 =5.7
1.3. 配置主從復(fù)制
Master 服務(wù)器配置
# 慢查詢開關(guān)
slow_query_log=ON
slow_query_log_file=/usr/local/slowlog/slow.log
slow_launch_time=4
long_query_time=3
# chown -R mysql:mysql /usr/local/slowlog/
binlog 設(shè)置
server_id=213
log_bin=/usr/local/binlog/mysql-bin # 只需要給名字前綴
binlog_format=row
expire_logs_days=3
max_binlog_size=200m
Slave 服務(wù)器配置
# 慢查詢開關(guān)
slow_query_log=ON
slow_query_log_file=/usr/local/slowlog/slow.log
slow_launch_time=4
long_query_time=3
# chown -R mysql:mysql /usr/local/slowlog/
從庫的主從設(shè)置
server_id=214
relay_log=/usr/local/relaylog/relay-bin
relay_log_recovery=1 # 確保完整性
read_only=on # 從服務(wù)器只讀
skip_slave_start=on #slave 重啟后不會自己啟動復(fù)制鏈路,需要手動啟動,建議手動啟動,好處是檢查無誤后啟動
master_info_repository=TABLE # 將主從服務(wù)的信息保存進(jìn)表
relay_log_info_repository=TABLE # 將主從服務(wù)的信息保存進(jìn)表
主從指明不同步的數(shù)據(jù)庫
# Master
# 不同步數(shù)據(jù)庫
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 只同步某一些數(shù)據(jù)庫
binlog-do-db=icoding_admin
# Slave
# 復(fù)制哪些數(shù)據(jù)庫
replicate-do-db=icoding_admin
replicate-do-db=game
# 不復(fù)制哪些數(shù)據(jù)庫
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
先 Master 上建立授權(quán)賬號
# Master 授權(quán)給 slave
mysql use mysql;
mysql grant replication slave on *.* to synuser @ 192.168.0.214 identified by 123456
mysql flush privileges;
初始化 Slave 數(shù)據(jù)
# Master 和 Slave 的數(shù)據(jù)庫版本要一致,Master =Slave
mysqldump -uroot -p123456 -h227.0.0.1 --flush-logs --master-data=2 --routines --triggers --events --single-transaction --databases icoding_admin mydb.sql
#CHANGE MASTER TO MASTER_LOG_FILE= mysql-bin.000004 , MASTER_LOG_POS=154; 就用導(dǎo)出的日志 pos
啟動復(fù)制鏈路
# 在 slave 上執(zhí)行
mysql
change master to master_host= 192.168.0.213 ,
master_port=3306,
master_user= synuser ,
master_password= 123456 ,
master_log_file= mysql-bin.000004 ,
master_log_pos=154;
注意事項(xiàng)
主從復(fù)制的時候主從數(shù)據(jù)庫的 UUID 不能一樣,如果是鏡像方式,啟動前將 UUID 文件刪除,會重新創(chuàng)建
cd /var/lib/mysql
cat auto.cnf # 將他刪除
server-uuid=890980d9-b072-11ea-8ab8-00163e03668d
啟動主從復(fù)制
# show slave status \G 可以查看主從復(fù)制的狀態(tài)和日志錯誤
# 啟動 slave
mysql start slave;
# 停止 slave
mysql stop slave;
作業(yè) 1:搭建一個雙主的結(jié)構(gòu)
使用 GTID 方式進(jìn)行復(fù)制鏈路
# 默認(rèn) GTID 是不開啟的
# 如果開啟以下操作不可用
# create table ..... select * from xxx; 不可用
# 在一個事務(wù)里不能創(chuàng)建和刪除表
# 在一個事務(wù)里更新 innodb 引擎和 myisam 不可用
無意中刪除了一個數(shù)據(jù),可以做延時從庫
# 從庫做備份就無法做到數(shù)據(jù)的及時恢復(fù)
# 讓我的從庫做到延時同步
mysql stop slave;
mysql change master to master_delay=10; # 延時 10 秒
mysql start slave;
mysql show slave status \G;
master(實(shí)時 slave,延時 slave)
看完上述內(nèi)容,你們掌握 MySQL 主從復(fù)制怎樣實(shí)現(xiàn)高可用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!