MySQL 的增強(qiáng)半同步復(fù)制
傳統(tǒng)的異步復(fù)制有個(gè)很大的缺點(diǎn),主從庫(kù)的復(fù)制難免會(huì)存在一定的延遲,為了解決復(fù)制延遲問(wèn)題,MySQL 引入了半同步復(fù)制。本小節(jié)主要介紹 MySQL 的增強(qiáng)半同步復(fù)制。
1. 增強(qiáng)半同步復(fù)制
增強(qiáng)半同步復(fù)制,號(hào)稱無(wú)損半同步復(fù)制,從庫(kù)丟失數(shù)據(jù)的概率非常小。下面從實(shí)戰(zhàn)的角度一步步搭建增強(qiáng)半同步復(fù)制環(huán)境。
1.1 基本環(huán)境
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 主庫(kù)配置
1. 修改配置
--安裝半同步組件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
--動(dòng)態(tài)修改參數(shù)
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; #超過(guò)1s轉(zhuǎn)換成傳統(tǒng)復(fù)制
gtid-mode = on
enforce-gtid-consistency = 1
binlog_format = row
server-id = 330601
log-bin = /mysql/log/mysql-bin
binlog_cache_size = 1M
2. 創(chuàng)建復(fù)制用賬號(hào)
create user 'repl'@'192.168.0.2' identified by '123456';
grant replication slave on *.* to 'repl'@'192.168.0.2';
1.3 從庫(kù)配置
1. 修改配置
--安裝半同步組件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
--動(dòng)態(tài)修改
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. 導(dǎo)出導(dǎo)入
--主庫(kù)導(dǎo)出
mysqldump -uroot -p --single-transaction --master-data=2 --databases test123 > test_200908.sql
--從庫(kù)導(dǎo)入
mysql -uroot -p < test_200908.sql
--調(diào)整復(fù)制起點(diǎn)
change master to master_host='192.168.0.1', master_port=3306, master_user='repl', master_password='123456', master_auto_position=1;
--開(kāi)始復(fù)制
start slave;
--查看復(fù)制
show slave status\G;
1.4 檢查配置
#主從庫(kù)確認(rèn)半同步模塊是否加載成功
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 |
+------------------------+----------+------------------+--------------------+---------+
#主從庫(kù)確認(rèn)半同步參數(shù)是否設(shè)置成功
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 環(huán)境校驗(yàn)
1. 主庫(kù)
--主庫(kù),創(chuàng)建表t1并插入數(shù)據(jù)
use test123;
create table t1(id int);
insert into t1 values(1);
select * from t1;
2. 從庫(kù)
--從庫(kù),檢查t1表是否存在
use test123;
select * from t1;
3. 監(jiān)控增強(qiáng)半同步狀態(tài)
--主要監(jiān)控主庫(kù)相關(guān)狀態(tài)值
show global status like '%semi%';
--關(guān)注以下status
Rpl_semi_sync_master_no_tx #傳統(tǒng)方式復(fù)制,如果Rpl_semi_sync_master_no_tx的值較大,需關(guān)注
Rpl_semi_sync_master_yes_tx #半同步方式復(fù)制
Rpl_semi_sync_master_net_waits #網(wǎng)絡(luò)等待時(shí)間
2. 切換同步模式
1. 增強(qiáng)半同步 -> 半同步
--主庫(kù)
set global rpl_semi_sync_master_wait_point= 'AFTER_COMMIT'
show global variables like '%semi%';
--從庫(kù)
set global rpl_semi_sync_master_wait_point= 'AFTER_COMMIT'
show global variables like '%semi%';
2. 半同步 -> 增強(qiáng)半同步
--主庫(kù)
set global rpl_semi_sync_master_wait_point= 'AFTER_SYNC'
show global variables like '%semi%';
--從庫(kù)
set global rpl_semi_sync_master_wait_point= 'AFTER_SYNC'
show global variables like '%semi%';
3. 異步 -> 增強(qiáng)半同步
請(qǐng)參考 2.2-2.3。
3.小結(jié)
本小節(jié)主要從實(shí)戰(zhàn)角度,介紹了 MySQL 增強(qiáng)半同步復(fù)制的搭建方式,與異步復(fù)制的搭建方式相比,多了一些參數(shù)的調(diào)整。
一般來(lái)說(shuō),為了運(yùn)維的簡(jiǎn)單,主庫(kù)和從庫(kù)的參數(shù)配置建議保持一致。
--安裝半同步組件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
--動(dòng)態(tài)修改全局參數(shù)
set global rpl_semi_sync_master_enabled = 1;
set global rpl_semi_sync_master_timeout = 1000; #超過(guò)1s轉(zhuǎn)換成傳統(tǒng)復(fù)制
set global rpl_semi_sync_slave_enabled = 1;
--修改my.cnf配置文件
[mysqld]
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 1000; #超過(guò)1s轉(zhuǎn)換成傳統(tǒng)復(fù)制
rpl_semi_sync_slave_enabled = 1;