mysql 5.7 主從複製搭建及原理

運維工作棧發表於2020-12-24

1. 主從複製搭建

 1.1 環境準備

OS: Ubuntu 18.04
master: 192.168.0.3
slave: 192.168.0.6

1.2 安裝依賴包

# Ubuntu
apt-get install -y libaio-dev
# CentOS
yum install -y libaio-devel

1.3 下載二進位制安裝包

# https://downloads.mysql.com/archives/community/
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz

1.4 解壓安裝包

tar zxf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
mv /usr/local/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.30

1.5 建立 mysql 使用者和資料、日誌目錄

useradd mysql -s /usr/sbin/nologin
mkdir -p /data/mysql/3306 /data/mysql/binlog/3306
chown -R mysql:mysql /data/mysql

1.6 新增環境變數

echo "export PATH=/usr/local/mysql-5.7.30/bin:$PATH" > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh

1.7 初始化資料

mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.30 --datadir=/data/mysql/3306 --user=mysql

1.8 簡單配置

# master 節點
# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql-5.7.30
datadir=/data/mysql/3306
server_id=3
port=3306
socket=/tmp/mysql.sock
log_bin=/data/mysql/binlog/3306/logbin

[mysql]
socket=/tmp/mysql.sock

# mysqld 啟動時載入配置檔案的順序
# mysqld --help --verbose | grep my.cnf
# /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
# 指定配置檔案, 啟動 mysqld
# /etc/init.d/mysqld start --defaults-file=/etc/my.cnf
# slave 節點
# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql-5.7.30
datadir=/data/mysql/3306
server_id=6
port=3306
socket=/tmp/mysql.sock

[mysql]
socket=/tmp/mysql.sock

1.9 拷貝啟動指令碼

cp /usr/local/mysql-5.7.30/support-files/mysql.server /etc/init.d/mysqld

1.10 啟動 mysqld

# 第一次啟動需用這個命令
/etc/init.d.mysqld start

# 後面可以用 systemctl 命令管理
# 啟動/重啟/停止 mysqld
systemctl start/restart/stop mysqld

# 檢視 mysqld 狀態
systemctl status mysqld

1.11 設定 root 密碼

# --initialize-insecure 這個引數初始化後的 mysql 預設是沒有密碼的, 為了安全需要設定 root 使用者密碼
mysqladmin -uroot password
# qq.123

以上操作就是搭建mysql服務,主從節點都要做。

1.12 檢查主庫是否開啟 binlog

# 在主庫上操作
mysql -uroot -pqq.123 -e "select @@log_bin;"

1.13 主庫建立複製使用者

# 在主庫上操作
mysql -uroot -pqq.123 -e "grant replication slave on *.* to repl@'192.168.0.%' identified by '123';"
mysql -uroot -pqq.123 -e "select user,host from mysql.user;"

1.14 主庫備份並恢復到主庫

# 由於我們的資料庫都是新搭建的,這一步可以不用操作
# 如果生產環境主庫開啟時間比較早已經有業務資料的情況下這一步是要的
# 在主庫上操作
mysqldump -uroot -pqq.123 -A --master-data=2 --single-transaction > /tmp/all.sql
scp /tmp/all.sql 192.168.0.6:/tmp/

# 在從庫上操作
mysql -uroot -pqq.123 < /tmp/all.sql

1.15 告知從庫複製資訊

# grep "\-- CHANGE MASTER TO" /tmp/all.sql
# -- CHANGE MASTER TO MASTER_LOG_FILE='logbin.000001', MASTER_LOG_POS=154;

# help change master to
change master to master_host='192.168.0.3',master_user='repl',master_password='123',master_port=3306,master_log_file='logbin.000001',master_log_pos=154,master_connect_retry=10;

1.16 從庫開啟複製執行緒

# 在從庫上操作
mysql -uroot -pqq.123 -e "start slave;"

1.17 驗證主從狀態

# 在從庫上操作
mysql -uroot -pqq.123 -e "show slave status\G" | grep Running:
      # Slave_IO_Running: Yes
      # Slave_SQL_Running: Yes

1.18 如果以上步驟 12-17 中出現問題,可以執行以下命令重置,然後從新配置 12-17 步。

# 在從庫上操作
mysql -uroot -pqq.123 -e "stop slave; reset slave all;"

 

2. 主從複製原理

2.1 主從複製涉及到的資源

  • 2.1.1 檔案

    • 2.1.1.1 主庫 binlog 檔案

    • 2.1.1.2 從庫 relay-log.bin 檔案,作用是儲存接收的 binlog,預設在從庫的資料目錄下, 手工定義方法:relay_log_basename=/data/mysql/3306/${hostname}-relay-bin

    • 2.1.1.3 從庫 master.info 檔案,作用是存放連線主庫的資訊,已經接收的 binlog 位置點資訊。預設儲存在從庫的資料目錄下。手工定義方法:master_info_repository=FILE/TABLE

    • 2.1.1.4 從庫 relay-log.info 檔案,作用是記錄回放到的 relay-log 的位置點, 預設儲存在從庫的資料目錄下。手工定義方法:relay_log_info_repository=FILE/TABLE

  • 2.1.2 執行緒

    • 2.1.2.1 主庫 Binlog_dump_Thread 作用是用來接收從庫請求,並且投遞 binlog 給從庫 show processlist; 命令可以檢視

    • 2.1.2.2 從庫 IO 執行緒 作用是請求 binlog, 接收 binlog SQL 執行緒 作用是回放 relay-log show slave status; 命令可以檢視

2.2 主從複製原理說明

  

  • 2.2.1 S: change master to ip,port,user,password,binlog 位置資訊寫入到 master.info 中, 執行 slave start; (啟動 SQL, IO 執行緒)。

  • 2.2.2 S: 連線主庫

  • 2.2.3 M: 分配 Dump_Thread, 專門和 S_IO 通訊。

  • 2.2.4 S: IO 執行緒請求新日誌

  • 2.2.5 M: Dump_T 接收請求, 擷取日誌, 返回給 S_IO

  • 2.2.6 S: IO 執行緒接收 binlog, 日誌放在 TCP/IP 快取, 此時網路層返回 ACK 給主庫。主庫工作完成。

  • 2.2.7 S: IO 執行緒將 binlog 最終寫入到 relay-log 中, 並更新 master.info, IO 執行緒工作結束。

  • 2.2.8 S: SQL 執行緒讀 relay-log.info, 獲取上次執行到的位置點。

  • 2.2.9 S: SQL 執行緒向後執行新的 relay-log, 再次更新 relay-log.info

小細節:
  • S: relay-log 引數: relay_log_purge=ON, 定期刪除應用過的 relay-log

  • M: Dump 執行緒實時監控主庫的 binlog 變化, 如果有新變化, 發訊號給從庫。

 

以上就是 mysql 5.7 主從複製搭建的過程及原理的簡單說明。搭建過程也不復雜,感興趣的話自己也動動小手試一下吧。如有問題可以在評論區留言。

 

相關文章