1. 程式人生 > MYSQL進階教學 ><p>MySQL 的增強半同步複製</p>

<p>MySQL 的增強半同步複製</p>

傳統的非同步複製有個很大的缺點,主從庫的複製難免會存在一定的延遲,為了解決複製延遲問題,MySQL 引入了半同步複製。本小節主要介紹 MySQL 的增強半同步複製。

1. 增強半同步複製

增強半同步複製,號稱無損半同步複製,從庫丟失資料的概率非常小。下面從實戰的角度一步步搭建增強半同步複製環境。

1.1 基本環境

Master Slave
MySQL版本 MySQL-5.7.31-x86_64 MySQL-5.7.31-x86_64
IP 192.168.0.1 192.168.0.2
port 3306 3306

1.2 主庫配置

1. 修改配置

--安裝半同步元件
install plugin rpl_semi_sync_master soname
'semisync_master.so'; --動態修改引數 set global rpl_semi_sync_master_enabled = 1; set global rpl_semi_sync_master_timeout = 1000; #1 second --修改my.cnf配置檔案 [mysqld] rpl_semi_sync_master_enabled = 1; rpl_semi_sync_master_timeout = 1000; #超過1s轉換成傳統複製 gtid-mode = on enforce-gtid-consistency = 1 binlog_format = row
server-id = 330601 log-bin = /mysql/log/mysql-bin binlog_cache_size = 1M

2. 建立複製用賬號

create user 'repl'@'192.168.0.2' identified by '123456';
grant replication slave on *.* to 'repl'@'192.168.0.2';

1.3 從庫配置

1. 修改配置

--安裝半同步元件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
--動態修改
set global
rpl_semi_sync_slave_enabled = 1; --修改my.cnf配置檔案 [mysqld] rpl_semi_sync_slave_enabled = 1; gtid-mode = on enforce-gtid-consistency = 1 binlog_format = row server-id = 330602 log-bin = /mysql/log/mysql-bin binlog_cache_size = 1M skip_slave_start = 1

2. 匯出匯入

--主庫匯出
mysqldump -uroot -p --single-transaction --master-data=2 --databases test123 > test_200908.sql

--從庫匯入
mysql -uroot -p < test_200908.sql

--調整複製起點
change master to master_host='192.168.0.1', master_port=3306, master_user='repl', master_password='123456', master_auto_position=1;

--開始複製
start slave;

--檢視複製
show slave status\G;

1.4 檢查配置

#主從庫確認半同步模組是否載入成功
show plugins;
+------------------------+----------+------------------+--------------------+---------+
| Name                   | Status   | Type             | Library            | License |
+------------------------+----------+------------------+--------------------+---------+
| rpl_semi_sync_master   | ACTIVE   | REPLICATION      | semisync_master.so | GPL     |
| rpl_semi_sync_slave    | ACTIVE   | REPLICATION      | semisync_slave.so  | GPL     |
+------------------------+----------+------------------+--------------------+---------+
#主從庫確認半同步引數是否設定成功
show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+

1.5 環境校驗

1. 主庫

--主庫,建立表t1並插入資料
use test123;
create table t1(id int);
insert into t1 values(1);
select * from t1;

2. 從庫

--從庫,檢查t1表是否存在
use test123;
select * from t1;

3. 監控增強半同步狀態

--主要監控主庫相關狀態值
show global status like '%semi%';
--關注以下status
Rpl_semi_sync_master_no_tx #傳統方式複製,如果Rpl_semi_sync_master_no_tx的值較大,需關注
Rpl_semi_sync_master_yes_tx #半同步方式複製
Rpl_semi_sync_master_net_waits #網路等待時間

2. 切換同步模式

1. 增強半同步 -> 半同步

--主庫
set global rpl_semi_sync_master_wait_point= 'AFTER_COMMIT' 
show global variables like '%semi%';

--從庫
set global rpl_semi_sync_master_wait_point= 'AFTER_COMMIT' 
show global variables like '%semi%';

2. 半同步 -> 增強半同步

--主庫
set global rpl_semi_sync_master_wait_point= 'AFTER_SYNC' 
show global variables like '%semi%';

--從庫
set global rpl_semi_sync_master_wait_point= 'AFTER_SYNC' 
show global variables like '%semi%';

3. 非同步 -> 增強半同步

請參考 2.2-2.3。

3.小結

本小節主要從實戰角度,介紹了 MySQL 增強半同步複製的搭建方式,與非同步複製的搭建方式相比,多了一些引數的調整。

一般來說,為了運維的簡單,主庫和從庫的引數配置建議保持一致。

--安裝半同步元件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

--動態修改全域性引數
set global rpl_semi_sync_master_enabled = 1;
set global rpl_semi_sync_master_timeout = 1000; #超過1s轉換成傳統複製
set global rpl_semi_sync_slave_enabled = 1;

--修改my.cnf配置檔案
[mysqld]
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 1000; #超過1s轉換成傳統複製
rpl_semi_sync_slave_enabled = 1;