關鍵詞:mysql複製(異步複製),mysql異步複製mysql
核心原理:linux
mysql 複製流程原理sql
一個事務在 mysql異步複製中的流程與生命週期數據庫
一個事務,在傳統半同步的複製流程vim
#mysql主從基本實驗centos
步驟目錄:服務器
前提網絡
異步複製(asynchronous )架構
#【0】主從均開啓binlog,設置server-idapp
#【1】準備複製帳戶
#【2】在主庫上,設置讀鎖定有效。以便獲取一個一致性的快照(flush table with read lock)
#【3】show master status;獲取主庫當前的二進制日誌名和偏移量pos位置。
#【4】備份主庫還原到從庫(直接copy,或者mysqldump)
解鎖主庫(unlock tables;)
#【5】跳過從線程啓動Mysql (mysqld_safe --skip-slave-start &)
#【6】在mysql下配置從庫複製線程(change master to )
#【7】在mysql下啓動從線程並驗證
#【8】開始驗證
#【9】故障診斷
#【10】主從掛了怎麼快速切換恢復
#【11】一主一從結構遷移從庫架構圖
#【12】半同步複製
#【13】複製的平常管理與維護
詳情:
前提:
(0)測試環境:2臺centos6.5,都裝有單實例 mysql5.7.26
(1)網絡能夠互相ping通:ping 192.168.135.158
(2)雙方端口是否偵聽開啓:netstat -an|grep 3306
(3)防火牆策略:service iptables stop;(這裏只是測試,我就直接關閉了哈)
(4)selinux策略:getenforce(查看狀態) setenforce 0 (關閉)
(5)完全關閉開機自啓:
防火牆 ~~ chkconfig iptables off
selinux~~ vim /etc/selinux/config ,而後把selinux=disabled,以下圖
#【0】主從均開啓binlog,設置server-id(在配置文件my.cnf下的 [mysqld] 下加入下列參數)
## replication log-bin=mysql-bin server-id=1 #從設置爲server-id=2 binlog_format= ROW #gtid_mode = on #enforce_gtid_consistency = 1 log_slave_updates = 1 #是否複製日誌寫入從庫的Binlog中
binlog_rows_query_log_events=on #在row 模式的binlog中包含SQL EVENTS(即SQL語句也會保留)
master-info-repository=TABLE
relay-log-info-repository=TABLE
master-connect-retry=60
#【1】在主庫上 準備複製帳戶
mysql下操做:(這裏的host ip是從庫IP)
主:grant replication slave on *.* to 'repl'@'192.168.135.159' identified by '123456';
-- 能夠順道測試一下使用該帳戶是否能在從庫上鍊接上主庫。
#【2】在主庫上,設置讀鎖定有效。以便獲取一個一致性的快照
mysql下操做:(鎖表,獲取一致性)
flush tables with read lock;
#【3】在主庫上 show master status;獲取主庫當前的二進制名和偏移量pos位置。
show master status;
-- 查看到的日誌名:mysql-bin.000002 , postion: 881
#【4】備份主庫還原到從庫
邏輯方式:mysqldump。而後scp拷貝過去。而後登陸上從庫的mysql,直接把dump的文件加載進去便可。
物理方式:直接拷貝,備份刪除從庫原有data目錄,而後把主庫的data目錄複製過去,複製到從庫後記得刪除拷貝過來data/下的auto.cnf,不然uuid會同樣,致使沒法複製出現故障【9】。
不論是物理仍是邏輯方式,CP或者mysqldump完後,就均可以解鎖主庫了
在主庫的mysql登陸下,使用命令,unlock tables;
#【5】在從庫上 跳過從線程啓動Mysql
#注意,要這樣使用,須要配置好環境變量,不然請切換到mysql文件 bin 目錄下後,再執行該命令
mysqld_safe --skip-slave-start &
#【6】在mysql下 配置從庫複製線程
-- mysql環境下 change master to master_host='192.168.135.158', master_port=3306, master_user='repl', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=881;
#【7】在從庫上 在mysql下啓動從線程並驗證
start slave;
#【8】在從庫上 開始驗證
show processlist; -- 通常有2個以下線程,基本就是沒有問題了,可是要確認的話,仍是得用下面的命令;
show slave status\G -- 這種帶error字樣的字段沒有信息或者是0,那纔是正確的!
去主庫上作操做,而後從庫上驗證數據是否同步過來(好比給一個表插入一條數據,注意若是沒開自動提交記得commit)
#【9】故障診斷
【9.1】The slave I/O thread stops because master and slave have equal MySQL server UUIDs
緣由就是直接用主庫的文件覆蓋到從庫的,致使auto.cnf中的uuid相同;
#【10】主從掛了怎麼快速切換恢復
1.備份主庫上的data目錄 mv data data.org
2.從庫上scp data目錄到主庫上 scp -r data 主庫:/databases/data/3306/
3.檢查my.cnf配置文件,主要保證innodb_log_file_size和innodb_log_files_in_group要和從庫設置一致。
4.注意修改data目錄裏的auto.cnf文件,裏面記錄的是服務器的uuid,請修改回主庫data.org目錄下的auto.cnf文件。
5.啓動mysql,看錯誤日誌,應該能夠正常啓動了
6.恢復後的主庫上,清除複製關係 mysql> reset slave all;
7.原從庫啓動數據庫,並重作主從 mysql> reset slave all;
8.mysql> change master to ...
#【11】一主一從結構遷移從庫架構圖
具體作法是這樣:
#【12】半同步複製(Semisynchronous )
在異步複製的參數及操做以後,開啓以下步驟
【1.2】半同步複製配置(5.7) 兩種辦法 【1.2.1】手動安裝半同步複製插件(在mysql環境下,主從都安裝)
【step 1】安裝半同步插件 install plugin rpl_semi_sync_master soname 'semisync_master.so'; install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; show plugins; -- 查看插件安裝狀況 or select * from mysql.plugin;
【step 2】設置開啓半同步參數
建議都開啓,以避免主備切換時須要從新加;若是分開,以下圖;
在主庫上:set global rpl_semi_sync_master_enabled=1;
在從庫上:set global rpl_semi_sync_slave_enabled=1;
若是異步複製正在運行,須要在從庫運行一下命令 纔會使用半同步;
stop slave io_thread;start slave io_thread;
【step 3】檢查狀態
在主庫查看半同步狀態:show status like '%rpl_semi%';
圈出第1行表示,鏈接主庫的客戶端個數。
圈出第2行表示,該實例作爲半同步的主庫狀態,是on,是開啓的。
最後1行,Rpl_semi_sync_slave_status,表示該實例,做爲半同步的從庫狀態,是off,不是從庫。
(可是從庫上進行查看時,圖中的 master_status 與 slave_status 應該正好相反,做爲主庫是關閉的,做爲從庫是開啓的)
其餘重要參數,
Repl_semi_sync_master_yes_tx:表示已經同步的事務數,0表示尚未任何一個事務以半同步的方式複製到從庫
Repl_semi_sync_master_no_tx:假如爲3,表示當前有3事務不是半同步模式下從庫及時響應的(好比可能有網絡延遲,致使半同步超時切換成異步)
【1.2.2】寫入配置文件(推薦使用,my.cnf) show variables like 'plugin%'; -- 查看插件路徑 #修改my.cnf 複製代碼
#若是已經有異步複製了,也不須要改其餘的,只須要把下面參數加入到my.cnf,重啓mysql服務便可。
#若是業務不容許宕機重啓實例,那麼能夠參考方法1,而且把該段代碼加上,就能夠直接用了。 plugin_dir=/mysql/app/mysql/lib/plugin/ plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
#若是是5.7,參數前面加上loose_,以下列,若是是5.6 則直接使用 rpl_semi_sync_master_enabled=1 之類的就行了。
#我這裏是5.7就直接作加強半同步了(loseless Semisynchronous ) loose_rpl_semi_sync_master_enabled=1 #MySQL開啓主的半同步複製(rpl_semi_sync_master_enabled) loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6開啓從的半同步複製 loose_rpl_semi_sync_master_timeout=5000 #超時5秒,切回異步 rpl_semi_sync_master_wait_for_slave_count=1 #至少收到1個slave發會的ack rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default,加強半同步) & AFTER_COMMIT(傳統半同步)
#【13】複製的平常管理與維護
(1)show slave status\G :在從庫查看從庫線程狀態
(2)flush tables with read lock; :主從不一致後鎖表。
而後 show master status\G
而後 show slave status\G 來查看從庫同步狀態 或者從新 change master to....
而後 select master_pos_wait('mysql-bin.00002','389'); (即剛剛show master status找到的文件及位置),若是爲1 標識超時退出 ,若是爲1 則標識主從同步。
最後再主庫 unlock tables; 解鎖
(3)跳過錯誤
跳過錯誤有兩種方式: 1.跳過指定數量的事務:(建議若是已經出現了錯誤,使用這種辦法) mysql>slave stop; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳過一個事務 mysql>slave start 2.修改mysql的配置文件,經過slave_skip_errors參數來跳全部錯誤或指定類型的錯誤(建議配置時使用這種辦法) vi /etc/my.cnf [mysqld] #slave-skip-errors=1062,1053,1146 #跳過指定error no類型的錯誤,DDL錯誤類型包含 1007,1008,1050,1051,1054,1060,1061,1068,1091,1146(5.6能夠用這個) #slave-skip-errors=ddl_exist_errors #跳過DDL錯誤,all:跳過全部錯誤(mysql5.7纔有ddl_exist_errors)
(4)大對象blog ,text 傳輸
參考:深刻淺出mysql開發、優化與管理維護書目