MySQL 高可用之主從復制


MySQL主從復制簡介

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

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

MySQL主從復制原理

1.主從復制中的線程及文件

  • 主庫線程:
    • Dump(IO) thread(也成為IO線程):在復制過程中,主庫發送二進制日志的線程
  • 從庫線程:
    • IO thread:向主庫請求binlog日志,並且接受binlog日志的線程
    • SQL thread:專門用於請求binlog日志的線程,將其內容寫入數據庫
  • 主庫的文件:
    • binlog文件:主庫的binlog日志
  • 從庫的文件:
    • relaylog:中繼日志,存儲請求過來的binlog日志
    • master.info:
      • 從庫連接主庫的重要參數(user,password,ip,port)
      • 記錄最后一次獲取過主庫的binlog日志的位置點
    • relay-log.info
      • 存儲從庫SQL線程已經執行過的relaylog日志位置點

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文件

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

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  root@10.0.0.52:/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天)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM