1. 主從復(fù)制前提
(1) 兩臺(tái)節(jié)點(diǎn)
(2) 二進(jìn)制日志
(3) server_id不同,uuid
(4) 復(fù)制用戶
(5) 備份恢復(fù)數(shù)據(jù)到從
(6) 復(fù)制信息提供(change master to)
(7) 開線程(start slave)
2. 主從復(fù)制的原理
(1) 從庫(kù),change master to(ip port user password binlog pos),存master.info
(2) 從庫(kù),start slave,開啟 IO和SQL
(3) 從庫(kù)IO,讀master.info,連接主庫(kù),主庫(kù)開啟binlog_dump_T
(4) 從庫(kù)IO,讀master.info,根據(jù)記錄的位置號(hào),請(qǐng)求最新的.
(5) 主庫(kù)dump進(jìn)行TP,最新的binlog,給從庫(kù)IO
(6) 從庫(kù)IO接收,存儲(chǔ)到TCP/IP緩存,在TCP/IP層面返回ACK給主庫(kù)
(7) 從庫(kù)IO,將緩存數(shù)據(jù),落地到relay-log中,并更新master.info 二進(jìn)制日志信息
(8) 從庫(kù)SQL,讀取relay.info ,獲取上次已經(jīng)執(zhí)行 到的relay-log的信息,繼續(xù)回放最新的relay
(9) SQL更新relay.info為最新狀態(tài)
(10) 補(bǔ)充1: relay-log會(huì)自動(dòng)被定時(shí)清理
(11) 補(bǔ)充2: 主庫(kù)一旦有新的binlog更新,dump會(huì)有信號(hào)通知,告知IO線程來取新的,來保證復(fù)制實(shí)時(shí)性.
================================================================================
1.
1.1 線程狀態(tài)
[root@db01 ~]# mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Running:"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
1.2 線程報(bào)錯(cuò)具體信息
[root@db01 ~]#mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Last"
Last_Errno: 0
Last_Error:
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
1.3 查看主庫(kù)連接信息有關(guān)
[root@db01 ~]#mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Master"
Master_Host: 10.0.0.51
Master_User: repl
Master_Port: 3307
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 444
Relay_Master_Log_File: mysql-bin.000006
Exec_Master_Log_Pos: 444
1.4 從庫(kù)和主庫(kù)延時(shí)時(shí)間
[root@db01 ~]#mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Seconds_Behind_Master"
Seconds_Behind_Master: 0
1.5 過濾復(fù)制相關(guān)狀態(tài)
[root@db01 ~]#mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Replicate_"
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Replicate_Ignore_Server_Ids:
Replicate_Rewrite_DB:
1.6 過濾從庫(kù)的狀態(tài)信息
[root@db01 ~]#mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Delay"
SQL_Delay: 0
SQL_Remaining_Delay: NULL
1.7 監(jiān)控Gtid的復(fù)制狀態(tài)信息
[root@db01 ~]#mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Gtid"
Retrieved_Gtid_Set:
Executed_Gtid_Set:
中繼日志監(jiān)控
[root@db01 ~]#mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Relay"
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000006
Relay_Log_Space: 526
2 主從復(fù)制故障
2.1 IO線程故障
[root@db01 ~]# mysql -S /data/3308/mysql.sock -e "show slave status \G"|grep "Running:"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(1) 讀取master.info
損壞
信息錯(cuò)誤 change master to信息錯(cuò)誤
(2) 連接主庫(kù)
網(wǎng)絡(luò)
防火墻
主庫(kù)沒啟動(dòng)
連接數(shù)上限了
以上問題:
Slave_IO_Running: Connecting
Last_IO_Error: xxxxxx
排查方法:
通過復(fù)制用戶,手工連接主庫(kù),看報(bào)錯(cuò)信息.
修復(fù):
stop slave
reset slave all
change master to
start slave
(3)請(qǐng)求日志
maste.info 復(fù)制起點(diǎn)
主庫(kù)發(fā)生了日志的損壞宛乃、誤刪除等
(4)接收日志
relaylog損壞
修復(fù):
stop slave
reset slave all
change master to
start slave
(5)更新master.info
2.2 SQL線程故障 *****
(1) relay.info
(2) 回放relaylog中的日志 *****
SQL語句為什么會(huì)失敗?
(1) 語法,SQL_Mode
版本,sql_mode不一致
(2) DDL DML 為什么會(huì)失敗
create database /table 創(chuàng)建的對(duì)象已經(jīng)存在了.
從庫(kù)被提前寫入了
drop database errdb; 要?jiǎng)h除和修改的對(duì)象不存在.
alter
insert
update
delete
處理方法(以從庫(kù)為核心的處理方案):
方法一:
stop slave;
set global sql_slave_skip_counter = 1;
#將同步指針向下移動(dòng)一個(gè)磷醋,如果多次不同步淘正,可以重復(fù)操作。
start slave;
方法二:
/etc/my.cnf
slave-skip-errors = 1032,1062,1007
常見錯(cuò)誤代碼:
1007:對(duì)象已存在
1032:無法執(zhí)行DML
1062:主鍵沖突,或約束沖突
但是尚蝌,以上操作有時(shí)是有風(fēng)險(xiǎn)的,最安全的做法就是重新構(gòu)建主從旺韭。把握一個(gè)原則,一切以主庫(kù)為主.
2.3 防止從庫(kù)寫入
(1) 可以設(shè)置從庫(kù)只讀.
oldguo[(none)]>show variables like '%read_only%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_read_only | OFF |
| read_only | OFF |
| super_read_only | OFF |
| transaction_read_only | OFF |
| tx_read_only | OFF |
+-----------------------+-------+
5 rows in set (0.01 sec)
注意:
只會(huì)影響到普通用戶,對(duì)管理員用戶無效挂谍。
(2)加中間件
讀寫分離。
2.4 自己擴(kuò)展
pt-xxx 關(guān)于主從方面的工具
檢查主從數(shù)據(jù)一致性
實(shí)現(xiàn)主從數(shù)據(jù)同步
3 主從延時(shí) *****
3.1 什么是主從延時(shí)
主庫(kù)做的事瞎饲,從庫(kù)很久才執(zhí)行
3.2 主從延時(shí)的現(xiàn)象
(1)最直觀:主庫(kù)做變更口叙,從庫(kù)看數(shù)據(jù)狀態(tài)
(2)Seconds_Behind_Master: 0 (只能證明,有或者沒有)
(3)計(jì)算日志的差異
3.3 主從延時(shí)的原因
3.3.1 外部原因
網(wǎng)絡(luò)
硬件
主庫(kù)的繁忙程度
版本差異
參數(shù)差異
3.3.2 內(nèi)部原因
主庫(kù):
(1)二進(jìn)制日志方面
二進(jìn)制日志落地不及時(shí)
解決方案:
sync_binlog=1
可以將binlog單獨(dú)存放高性能存儲(chǔ)中
(2) Dump_T (默認(rèn)是串行工作模式)
主庫(kù)的事務(wù)量大
主庫(kù)發(fā)生大事務(wù)
解決方案:
1. GTID 模式
2. 雙一的保證
如何監(jiān)控:
主庫(kù): show master status;
從庫(kù): show slave status \G
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 484
從庫(kù):
(1) IO線程方面
relaylog 寫入
解決方案:
可以將relaylog 單獨(dú)存放高性能存儲(chǔ)中
relay_log_basename | /data/3308/data/db01-relay-bin
relay_log_index | /data/3308/data/db01-relay-bin.index
(2)SQL線程方面(只有一個(gè)嗅战,串行回放)
默認(rèn)SQL線程妄田,只能逐條的回放SQL
事務(wù)并發(fā)高
大事務(wù)
5.6 版本 加入了多SQL復(fù)制
按照庫(kù)(database)級(jí)別,進(jìn)行并發(fā)回放SQL
slave_parallel_workers=16
slave_parallel_type=DATABASE
5.7 版本 進(jìn)行了多SQL復(fù)制加強(qiáng)(MTS)
真正按照事務(wù)級(jí)別,實(shí)現(xiàn)了多SQL線程回放
slave_parallel_workers=16
slave_parallel_type=logical_clock
注意: 必須依賴于GTID復(fù)制
如何監(jiān)控 :
(1) 監(jiān)控取了多少日志
show slave status \G
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1084
(2) 回放了多少日志
[root@db01 /data/3308/data]# cat relay-log.info
7
./db01-relay-bin.000003
920
mysql-bin.000001
1084
4. 主從基礎(chǔ)小結(jié)
4.1 主從前提
4.2 主從原理 *****
4.3 主從監(jiān)控
show master status;
show processlist;
show slave status\G
master.info
relay.info
4.4 主從故障
IO
連接
binlog
SQL
從庫(kù)寫入
DML,insert ,update ,delete
4.5 主從延時(shí)
主
dump 串行 : GTID,雙一 并行
show slave status\G
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1084
show master status \G
從
SQL 串行 : MTS
已經(jīng)拿過來的日志:
show slave status\G
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1084
已經(jīng)執(zhí)行過的:
./db01-relay-bin.000003
920
mysql-bin.000001
800