mysql主從複製詳細部署

SunArmy發表於2024-10-22
1、非同步複製:這是MySQL預設的複製模式。在這種模式下,主庫在執行完客戶端提交的事務後會立即將結果返回給客戶端,並不關心從庫是否已經接收並處理。這種模式的優點是實現簡單,但缺點是如果主庫崩潰,已經提交的事務可能沒有傳到從庫,導致資料不一致。

2、全同步複製:在這種模式下,主庫執行完一個事務後,需要等待所有從庫都執行了該事務才能返回給客戶端。這種模式的優點是資料一致性高,但缺點是效能影響較大,因為需要等待所有從庫的確認。

3、半同步複製:這種模式介於非同步複製和全同步複製之間。主庫在執行完客戶端提交的事務後,會等待至少一個從庫接收到並寫入relay log中才返回給客戶端。這種模式提高了資料的安全性,但會造成一定的延遲。

4、增強半同步複製:這種模式在半同步複製的基礎上進一步增強了資料安全性。主庫將每個事務寫入binlog後,等待從庫重新整理到磁碟才返回給客戶端。這種模式的優點是進一步減少了資料丟失的風險,但缺點是可能會增加事務的延遲。

5、組複製:這種模式是一種高階的複製技術,支援多主多從架構,適用於讀寫參半的場景。它透過組內節點間的相互通訊和投票機制來保證資料的一致性和高可用性。

本次就用兩臺機器node1和node2兩臺機器,用node1做主庫,用node2做從庫

1、獲取myql映象

# 在node1和node2上分別拉取mysql映象,該映象mysql版本是8.4.3,
docker pull mysql:8

2、獲取預設配置檔案

​ 啟動容器,把配置檔案copy到本地,(node1和node2同步操作)

# 在/opt/下建立一個mysql目錄
# 臨時啟動一下mysql
docker run -d \
	--name mysql-master \
	-p 3306:3306 \
	-e MYSQL_ROOT_PASSWORD=123456 \
	mysql:8
	
# 把資料和配置目錄copy到本地
node1上執行
docker cp mysql-master:/etc/my.cnf /opt/mysql/my.cnf
node2上執行
docker cp mysql-master:/etc/my.cnf /opt/mysql/my.cnf

3、配置啟動主庫

1、在node1修改主庫配置檔案

在node1上執行vim my.cnf ,編輯以下配置

[mysqld]
#mysql 服務ID,保證整個叢集環境中唯一,取值範圍:1 – 2的32次方-1,預設為1
server-id=1
#是否只讀,1 代表當前伺服器只讀(不能做增刪改操作), 0代表讀寫
read-only=0
# 設定日誌格式,預設值ROW。row(記錄行資料)  statement(記錄sql)  mixed(混合模式)
binlog_format=STATEMENT
# 二進位制日誌名,預設binlog
log-bin=master_binlog
# 設定需要複製的資料庫,預設複製全部資料庫
#binlog-do-db=test
# 設定不需要複製的資料庫
# binlog-ignore-db=test

2、在node1上啟動主庫

docker run -d \
	--name mysql-master \
	-p 3306:3306 \
	-e MYSQL_ROOT_PASSWORD=123456 \
	-v /opt/mysql/mysql_data:/var/lib/mysql \
	-v /opt/mysql/my.cnf:/etc/my.cnf \
	--restart=always \
	--privileged=true \
	mysql:8

3、建立主備賬號:

# 建立專門用於複製的賬戶
CREATE USER 'backups'@'%' IDENTIFIED BY 'backups';
# 授予此帳戶複製所需的許可權
GRANT REPLICATION SLAVE ON *.* TO 'backups'@'%';

獲取複製源二進位制日誌座標

要配置副本在正確的點開始複製過程,您需要在二進位制日誌中記下源的當前座標。要獲取源二進位制日誌座標,透過使用命令列客戶端連線到源來啟動源上的會話,並透過執行以下語句重新整理所有表並阻止寫入語句

# 重新整理所有表並阻止寫入語句
mysql> FLUSH TABLES WITH READ LOCK;
# 確定當前二進位制日誌檔案的名稱和位置
mysql> SHOW BINARY LOG STATUS\G

記錄一下File和Position,在從庫配置同步源的時候需要用到

3、配置啟動從庫

1、配置從庫並啟動

在node2上執行vim my.cnf ,編輯以下配置

[mysqld]
# 伺服器唯一id,每臺伺服器的id必須不同,如果配置其他從機,注意修改id
server-id=2
# 中繼日誌名,預設xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
#是否只讀,1 代表只讀, 0 代表讀寫。對於從庫來說,我們只需要從從庫中進行查詢即可,不需要從從庫中進行寫入操所>以直接把read-only設定為1就行了。
read-only=1
#二進位制檔案的名稱
#log-bin=binlog
# 設定日誌格式,預設值ROW。row(記錄行資料)  statement(記錄sql)  mixed(混合模式)
binlog_format=STATEMENT

2、啟動從庫:

docker run -d \
        --name mysql-slave \
        -p 3306:3306 \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -v /opt/mysql/mysql_data:/var/lib/mysql \
        -v /opt/mysql/my.cnf:/etc/my.cnf \
        --restart=always \
        --privileged=true \
        mysql:8

3、使用複製使用者請求伺服器公鑰

這一步是為了避免ERROR:Authentication plugin ‘caching_sha2_password‘ reported error:Authentication錯誤的

mysql -u backups -pbackups -h 10.10.10.11 -P3306 --get-server-public-key

執行完之後需要退出當前mysql終端使用root賬號進行下面設定

設定從庫的同步源

mysql> CHANGE REPLICATION SOURCE TO
    ->     SOURCE_HOST='10.10.10.11',
    ->     SOURCE_USER='backups',
    ->     SOURCE_PASSWORD='backups',
    ->     SOURCE_LOG_FILE='master_binlog.000003',
    ->     SOURCE_LOG_POS=697;

管理從庫的同步複製狀態

# 暫停副本上的複製
mysql> STOP REPLICA;
# 開始副本上的複製
mysql> START REPLICA;
# 檢查單個副本的狀態
SHOW REPLICA STATUS\G


Replica_IO_State:副本的當前狀態
Replica_IO_Running:讀取源二進位制日誌的 I/O(接收器)執行緒是否正在執行。通常情況下為Yes,除非您尚未啟動複製或已明確停止複製,否則您希望此執行緒處於執行狀態STOP REPLICA。
Replica_SQL_Running:執行中繼日誌中事件的SQL執行緒是否正在執行。與I/O執行緒一樣,這通常應該是Yes。
Last_IO_Error, Last_SQL_Error:處理中繼日誌時I/O(接收方)和SQL(應用方)執行緒記錄的最後錯誤。理想情況下,這些應該是空白的,表示沒有錯誤。
Seconds_Behind_Source:複製SQL(應用程式)執行緒處理源二進位制日誌所落後的秒數。數字過大(或不斷增加)可能表示副本無法及時處理來自源的事件。值為0,Seconds_Behind_Source通常可以解釋為副本已趕上源;但在某些情況下這並不完全正確。例如,如果源和副本之間的網路連線中斷,但複製 I/O(接收器)執行緒尚未注意到這一點,即設定的時間段 replica_net_timeout尚未過去,則可能會發生這種情況。Seconds_Behind_Source無法準確反映情況。當複製 SQL(應用程式)執行緒趕上 I/O 時, Seconds_Behind_Source顯示 0;但當複製 I/O(接收器)執行緒仍在排隊新事件時,Seconds_Behind_Source可能會顯示較大的值,直到複製應用程式執行緒完成執行新事件。當事件具有舊時間戳時尤其可能出現這種情況;在這種情況下,如果您在相對較短的時間內執行SHOW REPLICA STATUS 多次,您可能會看到此值在 0 和相對較大的值之間反覆來回變化。

詳細執行流程看下圖

在從庫執行 SHOW REPLICA STATUS\G 之後看下面的Replica_IO_State狀態顯示:Waiting for source to send event, Replica_IO_Running: Yes,Replica_SQL_Running: Yes,說明覆制狀態正常

在主庫執行 SHOW PROCESSLIST \G;

檢查正在執行的程序列表來檢查連線的副本的狀態。副本連線包含Command欄位為:Binlog Dump
SHOW PROCESSLIST \G;

主庫看到這個程序,說明主庫Binlog Dump程序啟動

4、測試

1、連線主庫和從庫

2、在主庫建立test庫和user表,並插入三條資料

# 建立test庫
create database test;
use test;
# 在test庫中建立user表
create table user(
  id int(11) primary key not null auto_increment,
  name varchar(50) not null,
  sex varchar(1),
  age int(11)
)engine=innodb default charset=utf8mb4;
# 插入三條資料
insert into user(id,name,sex,age) values(null,'張三', '1',18),(null,'李四','0',19),(null,'王五','1',20);

3、檢視node2上的從庫是否同步

至此,主從同步已經完成,如果需要一主多從,只需要在多部署幾個從庫,按照上面從庫的部署方式就可以了

如果感覺寫的還能看,可以關注公眾號,會將最新訊息推送給你

相關文章