MySQL主從複製

MySQL主從複製簡介
Mysql的主從複製方案,都是數據傳輸的,只不過MySQL無需藉助第三方工具,而是自帶的同步複製功能,MySQL的主從複製並不是磁盤上文件直接同步,而是將binlog日誌發送給從庫,由從庫將binlog文件裏的內容寫入本地數據庫。

在生產環境中,MySQL主從複製都是異步方式同步,即不是實時同步數據。

MySQL主從複製原理:
MySQL主從複製
從庫讀取master.info文件中的信息(連接參數,最後一次請求binlog的位置點),向主庫請求binlog文件,主庫接受到從庫發送過來的信息後(驗證通過),將本地對應的binlog日誌發送至從庫從庫接收到binlog文件後,會存儲到TCP/IP緩存中,併發送ACK給主庫,告訴主庫自己已經收到binlog日誌了,那麼主庫收到ACK後接着幹別的事了,從庫TCP/IP緩存中的內容寫入到本地的relaylog日誌文件中,從庫會將最後一次獲取到的binglog位置點更新至master.info文件,然後IO線程讀取relay-log.info中的最後一次執行到的relaylog位置點(以這個位置點爲起點,往後執行中繼日誌),最後將relaylog日誌文件中對應的位置點的內容寫入(恢復)數據庫中,執行完數據寫入後,將最後最後一次執行數據寫入(恢復)的relaylog位置點更新至relay-log.info文件

每一次binlog請求都是按照上面所寫的循序來執行

MySQL主從複製部署

MySQL主從複製條件

  1. 兩臺以上mysql實例(多臺物理機或多個mysql實例)
  2. 開啓binlog功能,確保所有實例server-id不同
  3. 主庫建立同步賬號replication slave 特殊的權限)
  4. 將全備文件恢復到從庫上(需人爲操作)
  5. 從庫配置master.info(change master..),複製的binlog位置點(需人爲操作)
  6. start slave 複製開關

1.環境規劃
所有機器統一centos7.4系統環境,並且都已經安裝好了mysql 5.7.20

主機名 IP地址 服務
db01 10.0.0.51 mysql 主庫
db02 10.0.0.52 mysql 從庫

2.所有mysql都開啓binlog功能,確保所有mysql的server-id不同

需要添加的配置如下:

#主庫 /etc/my.cnf
[mysqld]
server_id=1
log-bin=/application/mysql/data/mysql-bin
sync_binlog = 1
binlog_format = row  
skip-name-resolve   #關閉域名解析

#從庫 /etc/my.cnf
[mysqld]
server_id=2
log-bin=/application/mysql/data/mysql-bin
sync_binlog = 1
binlog_format = row
skip-name-resolve 

提示:從庫的relay-log路徑可自定義,默認在data目錄下以主機爲前綴保存

server-id 用於全網唯一標識一臺mysql機器

2.主庫授權主從複製用戶
replication slave 一個特殊的權限,專門用於主從複製

mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123456';

3.主庫將數據庫數據做全備,然後將備份文件推送至從庫

  • 主和從同時搭建新的環境,就不需要備份主庫數據,恢復從庫了,直接從第一個binlog(mysql-bin.000001)開頭位置(120)
  • 如果主庫已經工作了很長時間了,那麼需要備份主庫數據,恢復到從庫,然後從庫從備份的時間點起,自動進行復制
#1.將數據庫的數據全備到/backup目錄下
[root@db01 ~]# mysqldump -uroot -p123456  -A -B -R --master-data=2 --single-transaction |gzip >/backup/full_$(date +%F).sql.gz

#2.將全備通過scp推送到從庫的/backup目錄下
[root@db01 ~]# scp /backup/full_2019-01-15.sql.gz  [email protected]:/backup

提示:/backup 目錄請自行創建

4.從庫將備份文件恢復至數據庫

#1.解壓備份文件
[root@db02 ~]# gunzip /backup/full_2019-01-15.sql.gz

#2.進入數據庫,將備份文件導入到本地數據庫
mysql> source /backup/full_2019-01-15.sql

#3.檢查數據是否恢復成功
mysql> show databases;

5.從庫上都找到binlog位置點
雖然全備文件已經恢復到了從庫,但是全備之後的數據的變化是沒有進行備份的,所以從庫還需要指定binlog位置點,這樣從庫才知道該從哪裏開始同步數據

#直接在從庫的全備文件中找到binlog位置點
[root@db02 /]# sed -n '22p' /backup/full_2019-01-15.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;

6.從庫配置master info
master info就是指配置一系列主從複製參數,該參數爲change master to,來實現主從複製

#1.進入數據庫配置 change master to
change master to
master_host='10.0.0.51',    
master_port=3306,
master_user='rep',  
master_password='123456',
master_log_file='mysql-bin.000001',  
master_log_pos=154; 

#2.開啓主從同步功能(開啓IO和SQL線程),
mysql> start slave;

#3.查看主從複製的狀態(截取部分)
#當在slave狀態中可以看到如下參數,都爲yes表明成功,(從庫有一個IO和一個SQL)
mysql> show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

change master to參數解釋:
master_host='10.0.0.51',    #主庫的IP地址
master_port=3306,    #主庫的端口
master_user='rep',   #主庫上創建的用於複製的用戶rep
master_password='123456',      #rep用戶的密碼
master_log_file='mysql-bin.000001', #二進制日誌文件的名稱
master_log_pos=154;  #二進制日誌偏移量

提示:mysql> help change master to 可獲取配置案例

slave的操作命令:

mysql> stop slave; #停止slave
mysql> reset slave; #清空slave的配置參數(change master to)

從庫的master.info和relay-log.info文件

#執行完change master to命令後,會自動生成master.info文件,保存change master to的參數和最後一次獲取binlog日誌文件名和對應的位置點
ls /application/mysql/data/master.info

#執行完start slave命令後,會自動生成relay-log.info文件,保存已執行過的relaylog的位置點
ls /application/mysql/data/relay-log.info

7.主庫創建數據庫,在到從庫驗證數據是否同步

#1.主庫創建數據庫:sample
mysql> create database sample;

#2.從庫查看數據是否同步
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| case1              |
| case2              |
| mysql              |
| performance_schema |
| sample             |
| sys                |
| test               |
| xmh                |
+--------------------+

從庫去向主庫請求的binlog日誌會保存在從庫本地的relaylog日誌中

[root@db02 /]# ls /application/mysql/data/db02-relay-bin.*
/application/mysql/data/db02-relay-bin.000001
/application/mysql/data/db02-relay-bin.000002
/application/mysql/data/db02-relay-bin.index

擴展:從庫開啓記錄binlog功能
從庫需要記錄binlog的應用場景爲:當前的從庫還需要作爲其它從庫的主庫,例如:級聯複製和雙主互爲主從場景的情況下

#從庫的my.cnf中加入如下參數,然後重啓服務生效即可
log-slave-updates  #開啓從庫記錄binlog功能
log-bin = /application/mysql/data/mysql-bin
expire_logs_days = 7  #bin-log保留時間(只保留7天)

MySQL主從複製故障
主從複製狀態信息介紹

mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0   #記錄最後一次IO的錯誤代碼
Last_IO_Error:     #顯示導致IO的錯誤原因
Last_SQL_Errno: 0  #記錄最後一次SQL的錯誤代碼
Last_SQL_Error:    #顯示導致SQL的錯誤原因
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章