目錄
mysql的編譯安裝與部署
1.編譯安裝mysql
2.部署mysql
mysql主從復制
什么是mysql主從復制?
1.配置master
2.配置slave
3.存在數據時添加slave2
4.GTID模式
什么是GTID模式?
配置GTID
5.延遲復制
6.慢查詢日志
核心作用
開啟慢查詢日志功能
7.并行復制
什么是并行復制?
配置并行復制
半同步模式
1.主從復制原理
2.原理架構缺陷
3.半同步模式原理
4.啟動半同步模式
mysql的編譯安裝與部署
1.編譯安裝mysql
1.安裝mtsql的依賴包跟依賴軟件
#安裝mysqld8的依賴軟件
[root@mysql ~]# yum install git bison openssl-devel ncurses-devel -y#安裝cmake3,編譯時檢測需要使用
[root@mysql mnt]# tar zxf cmake3.tar.gz
[root@mysql mnt]# cd make3/
[root@mysql make3]# yum install *.rpm -y
[root@mysql make3]# cmake3 -version
cmake3 version 3.14.7#安裝gcc-11,mysql源碼使用了C/C++特性,安裝gcc-11確保能正常編譯
[root@mysql mnt]# unzip gcc-11.zip
[root@mysql mnt]# cd gcc-11/
[root@mysql gcc-11]# yum install *.rpm -y
[root@mysql gcc-11]# source /opt/rh/devtoolset-11/enable
[root@mysql gcc-11]# gcc -v
gcc version 11.2.1 20220127 (Red Hat 11.2.1-9) (GCC)
2.源碼編譯安裝mysql
#下載并解壓源碼包
[root@mysql mnt]# tar zxf mysql-boost-8.3.0.tar.gz
[root@mysql mnt]# cd mysql-8.3.0/
#創建編譯目錄,防止編譯時與源碼包混亂
[root@mysql mysql-8.3.0]# mkdir bulit
[root@mysql mysql-8.3.0]# cd bulit
[root@mysql bulit]# cmake3 .. \ #使用cmake3進行編譯檢測
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定安裝路徑
-DMYSQL_DATADIR=/data/mysql \ #指定數據目錄
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ #指定套接字文件
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #指定啟用INNODB存儲引擎,默認用myisam
-DWITH_EXTRA_CHARSETS=all \ #擴展字符集
-DDEFAULT_CHARSET=utf8mb4 \ #指定默認字符集
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \ #指定默認校驗字符集
-DWITH_SSL=system \ #指定MySQL 使用系統已安裝的SSL庫
-DWITH_BOOST=bundled \ #指定使用 MySQL 源碼包中內置的Boost庫
-DWITH_DEBUG=OFF[root@mysqlb built]# cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_SSL=system -DWITH_BOOST=bundled -DWITH_DEBUG=OFF[root@mysql bulit]# make -j4 #-j4表示使用4個核心來跑編譯,一個核心要使用2G運行內存
[root@mysql bulit]# make install #安裝
2.部署mysql
#創建運行mysql的用戶
[root@mysqla ~]# useradd -s /sbin/nologin -M mysql#創建存儲mysql數據的目錄
[root@mysqla ~]# mkdir /data/mysql -p
[root@mysqla ~]# chown mysql:mysql /data/mysql/#添加mysql二進制啟動文件到環境變量
[root@mysqla ~]# vim ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
[root@mysqla ~]# source ~/.bash_profile#生成配置文件
[root@mysqla ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql #指定數據目錄
socket=/data/mysql/mysql.sock #指定套接
default_authentication_plugin=mysql_native_password #指定數據庫默認使用的認證插件,傳統兼容#設置mysql啟動服務
[root@mysqla ~]# cd /usr/local/mysql/support-files/
[root@mysqla support-files]# cp -p mysql.server /etc/init.d/mysqld
#開啟mysql開機自啟
[root@mysqla ~]# chkconfig mysqld on#初始化mysqld
[root@mysqla ~]# mysqld --initialize --user=mysql
[root@mysqla ~]# /etc/init.d/mysqld start#數據庫安全初始化
[root@node10 ~]# mysql_secure_installation#登錄mysql
[root@mysqla mysql]# mysql -uroot -pyyy
mysql> SELECT @@SERVER_ID;
+-------------+
| @@SERVER_ID |
+-------------+
| 10 |
+-------------+
1 row in set (0.01 sec)
mysql主從復制
什么是mysql主從復制?
MySQL 主從復制是一種將一個 MySQL 數據庫(主庫,Master)的數據復制到一個或多個 MySQL 數據庫(從庫,Slave)的技術,常用于實現數據冗余備份、讀寫分離等。
工作原理
-
主庫記錄二進制日志:主庫將所有對數據庫進行修改的操作(如 INSERT、UPDATE、DELETE 等)記錄到二進制日志(binary log)中。
-
從庫請求日志:從庫通過 I/O 線程連接到主庫,請求主庫的二進制日志。
-
主庫發送日志:主庫接收到從庫的請求后,通過二進制日志轉儲線程(binlog dump thread)將二進制日志發送給從庫。
-
從庫接收并應用日志:從庫的 I/O 線程接收主庫發送的二進制日志,并將其寫入到中繼日志(relay log)中,然后 SQL 線程讀取中繼日志,在從庫上執行這些日志中的操作,從而實現與主庫數據的同步。
1.配置master
1.更改配置文件,添加log-bin參數
[root@mysqla mysql]# vim /etc/my.cnf
[mysqld]
server-id=10
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-bin=mysql-bin #開啟二進制日志,將二進制日志文件前綴改為mysql-bin
default_authentication_plugin=mysql_native_password[root@mysqla mysql]# /etc/init.d/mysqld restart #重啟mysql
2.進入mysql,創建用戶專門做主從復制,用于slave端做認證
mysql> create user fjw@'%' identified by 'fjw'; #創建用戶,%:所有權限,identified by:設置密碼
mysql> GRANT replication slave ON *.* to fjw@'%'; #對創建的用戶進行授權
3.查看master的狀態,用于作為slave服務器連接到master的相關參數
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 437 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.配置slave
1.在從設備上安裝源碼編譯的mysql
#使用scp拷貝從master設備拷貝到slave
[root@mysqla mysql]# scr -r /usr/local/mysql root@172.25.254.20:/usr/local/#slave設備也要部署一遍mysql
2.編寫配置文件
[root@mysqlb mysql]# vim /etc/my.cnf
[mysqld]
server-id=20
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password[root@mysqlb mysql]# /etc/init.d/mysqld restart
3.設置從服務器連接到主服務器的相關參數
[root@mysqlb mysql]# mysql -uroot -pyyy
mysql> CHANGE MASTER TO #指定master-> MASTER_HOST='172.25.254.10', #指定主服務器的 IP 地址-> MASTER_USER='fjw', #指定用于主從復制的用戶名-> MASTER_PASSWORD='yyy', #指定對應用戶的密碼-> MASTER_LOG_FILE='mysql-bin.000001', #主庫二進制日志文件名-> MASTER_LOG_POS=437; #指定從日志文件在哪個位置#啟服務器的復制進程
mysql> start slave;
#檢查復制狀態,確保 Slave_IO_Running 和 Slave_SQL_Running 都為 Yes,表示主從復制配置成功并正常運行。
mysql> SHOW SLAVE STATUS\G;Slave_IO_Running: YesSlave_SQL_Running: Yes#如果要重新填入信息
mysql> stop slave;
mysql> RESET SLAVE ALL;
4.測試,在主設備上創建數據庫與表在從設備上查看是否同步上
#在master創建數據庫與表
[root@mysqla mysql]# mysql -uroot -pyyy
mysql> create database fjw;
mysql> use fjw;
mysql> create table userlist( name varchar(10) not null ,id varchar(10) not null );
mysql> insert into userlist values('fjw','123');
mysql> select * from fjw.userlist;
+------+-----+
| name | id |
+------+-----+
| fjw | 123 |
+------+-----+#在slave中查看數據是否有同步過來
mysql> select * from fjw.userlist;
+------+-----+
| name | id |
+------+-----+
| fjw | 123 |
+------+-----+
3.存在數據時添加slave2
1.完成slave2的基礎配置,部署mysql
#配置文件設置
[root@mysqlc ~]# vim /etc/my.cnf
[mysqld]
server-id=30
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password[root@mysqlc ~]# /etc/init.d/mysqld restart
2.從master節點備份數據
#在生產環境中備份需要縮表,保證備份前后的數據一致
mysql> FLUSH TABLES WITH READ LOCK;
備份后再解鎖
mysql> UNLOCK TABLES;
#備份數據
[root@mysqla ~]# mysqldump -uroot -pyyy fjw > /mnt/fjw.sql
#將備份的數據拷貝給slave2
[root@mysqla ~]# scp /mnt/fjw.sql root@172.25.254.30:/mnt/
3.在slave2導入數據
利用master節點中備份出來的lee.sql在slave2中拉平數據,只有拉平數據了才能配置組從復制
#創建與master一樣的數據庫
[root@mysqlc ~]# mysql -uroot -pyyy -e 'create database fjw;'
#導入數據到數據庫
[root@mysqlc ~]# mysql -uroot -pyyy fjw < /mnt/fjw.sql
#查看導入的數據是否與master一樣
[root@mysqlc ~]# mysql -uroot -pyyy -e 'select * from fjw.userlist;'
+------+-----+
| name | id |
+------+-----+
| fjw | 123 |
+------+-----+
#一樣即可配置為組從復制
4.配置為slave
#在master中查詢日志pos
[root@mysqla ~]# mysql -uroot -pyyy -e 'show master status;'
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 1082 | | | |
+------------------+----------+--------------+------------------+-------------------+
#在slave2進行配置
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10',MASTER_USER='fjw',MASTER_PASSWORD='fjw',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=1082;
mysql> start slave;
mysql> show slave status\G;Slave_IO_Running: YesSlave_SQL_Running: Yes
5.測試,在master插入新數據看是否同步到slave中
#在masger插入數據
[root@mysqla ~]# mysql -uroot -pyyy -e 'insert into fjw.userlist values("yyy","456");'
[root@mysqla ~]# mysql -uroot -pyyy -e 'select * from fjw.userlist'
+------+-----+
| name | id |
+------+-----+
| fjw | 123 |
| yyy | 456 |
+------+-----+#slave中查看[root@mysqlc ~]# mysql -uroot -pyyy -e 'select * from fjw.userlist'
+------+-----+
| name | id |
+------+-----+
| fjw | 123 |
| yyy | 456 |
+------+-----+
建議配置好組從復制后,從設備配置只讀不能寫
在配置文件添加參數
[root@mysqlc ~]# vim /etc/my.cnf
[mysqld]
server-id=30
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password
read-noly=1 #其他用戶只讀
super-read-only=1 #root用戶只讀[root@mysqlc ~]# /etc/init.d/mysqld restart
4.GTID模式
什么是GTID模式?
????????GTID(Global Transaction ID,全局事務標識符)是數據庫領域中用于唯一標識數據庫事務的一種機制,主要應用于 MySQL 等關系型數據庫的主從復制場景,用于簡化復制配置、提高故障切換效率和數據一致性保障;工作原理是基于 “為每個事務分配全局唯一標識”,通過追蹤事務的生成和執行狀態生產GTID集合,實現 MySQL 主從復制的自動化管理。
GTID 的作用
-
簡化主從復制配置:傳統復制需要手動指定主庫的二進制日志文件和偏移量,而 GTID 模式下,從庫只需連接主庫并啟用 GTID,即可自動同步數據。
-
提高故障恢復效率:當主庫宕機后,從庫可以通過對比 GTID 集合,快速找到擁有最新數據的從庫作為新主庫,減少切換時間。
-
增強數據一致性:通過 GTID 可以清晰追蹤每個事務的執行情況,避免重復執行或遺漏事務,確保主從數據一致。
我們可以進行一個對比:
當未啟用gtid時我們要考慮的問題
????????在傳統復制中,由于多個從庫各自維護自己的 File 和 Position,當主庫出現故障,從庫之間的數據狀態可能不一致。同時,在復制過程中,可能會因為網絡問題、日志解析錯誤等,導致部分從庫遺漏或重復執行事務,從而造成主從數據不一致。
當激活GITD之后
???????
????????當master出現問題后,會比較GTID集合比較出slave2和master的數據最接近,會被作為新的master slave1指向新的master,但是他不會去檢測新的master的pos id,只需要繼續讀取自己gtid_next即可。
????????GTID 的核心是通過 “全局唯一標識 + 事務級追蹤”,將傳統基于物理日志位置的復制,升級為基于邏輯事務的同步。主庫生成 GTID 并記錄事務,從庫通過 GTID 自動判斷是否需要執行事務,最終實現復制配置簡化、故障切換自動化和數據一致性保障。
配置GTID
1.停止傳統的主從復制
#slave1
[root@mysqlb ~]# mysql -uroot -pyyy -e 'stop slave;'
[root@mysqlb ~]# mysql -uroot -pyyy -e 'reset slave all;'
#slave2
[root@mysqlc ~]# mysql -uroot -pyyy -e 'stop slave;'
[root@mysqlc ~]# mysql -uroot -pyyy -e 'reset slave all;'
2.設置配置文件
#master端和slave端都要開啟gtid模式
#master
[root@mysqla ~]# vim /etc/my.cnf
[mysqld]
server-id=10
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-bin=mysql-bin
default_authentication_plugin=mysql_native_password
gtid_mode=ON #開啟gtid模式
enforce-gtid-consistency=ON #開啟gtid的強一致性#更改完配置文件后重啟mysql
[root@mysqla ~]# /etc/init.d/mysqld restart#slave1
[root@mysqlb ~]# vim /etc/my.cnf
[mysqld]
server-id=20
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password
gtid_mode=ON
enforce-gtid-consistency=ON[root@mysqlb ~]# /etc/init.d/mysqld restart#slave2
[root@mysqlc ~]# vim /etc/my.cnf
[mysqld]
server-id=30
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password
gtid_mode=ON
enforce-gtid-consistency=ON[root@mysqlc ~]# /etc/init.d/mysqld restart#配置完配置文件重啟后,進入mysql查看gtid的狀態顯示是開啟的
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed | |
| gtid_executed_compression_period | 0 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC | #自動記錄追蹤porid
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
3.設置slave連接master,實現gtid模式的主從
#slave1服務器進入mysql進行配置
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='fjw', MASTER_PASSWORD='fjw', MASTER_AUTO_POSITION=1; #使slave的porid與masger的一致mysql> start slave;
mysql> show slave status\G;
......Slave_IO_Running: Yes #顯示與master主從連接成功Slave_SQL_Running: Yes
......Auto_Position: 1 #開啟了與master的gtid主從模式
......#同理salve2
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='fjw', MASTER_PASSWORD='fjw', MASTER_AUTO_POSITION=1;
mysql> start slave;
mysql> show slave status\G;
5.延遲復制
延遲復制時用來控制sql線程的,和i/o線程無關
這個延遲復制不是i/o線程過段時間來復制,i/o是正常工作的
是日志已經保存在slave端了,那個sql要等多久進行回放
延遲復制控制的是sql線程回放的過程
#在slave端
mysql> STOP SLAVE SQL_THREAD;
mysql> CHANGE MASTER TO MASTER_DELAY=60;
mysql> START SLAVE SQL_THREAD;
mysql> SHOW SLAVE STATUS\G;Master_Server_Id: 1Master_UUID: db2d8c92-4dc2-11ef-b6b0-000c299355eaMaster_Info_File: /data/mysql/master.infoSQL_Delay: 60 ##延遲效果SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400
延遲復制已經在高mysql版本被取代了這里僅作了解
6.慢查詢日志
????????MySQL 的慢查詢日志(Slow Query Log)是一種用于記錄執行時間超過指定閾值的 SQL 語句的日志文件,主要用于排查和優化執行效率低下的查詢,提升數據庫性能。
核心作用
-
定位低效 SQL:記錄執行時間過長的查詢,幫助開發者或運維人員發現耗時操作(如未優化的復雜查詢、缺少索引的語句等)。
-
性能優化依據:通過分析慢查詢日志,可針對性地優化 SQL 語句、調整索引或優化數據庫結構
開啟慢查詢日志功能
#用于臨時動態開啟慢查詢日志(無需重啟 MySQL 服務)。
mysql> SET GLOBAL slow_query_log=ON;
#永久開啟,編輯配置文件
[mysqld]
slow_query_log = ON#設置 “慢查詢時間閾值” 的命令,默認是10s,超過這個閾值的命令就會被列入慢查詢日志中
mysql> SET long_query_time=4;
#永久開啟
[mysqld]
long_query_time = 4mysql> SHOW VARIABLES like "slow%";
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| slow_launch_time | 2 | #慢啟動的線程間隔,用于監控連接建立的效率
| slow_query_log | ON | #查看慢查詢日志開啟
| slow_query_log_file | /data/mysql/mysql-node1-slow.log | #指定了慢查詢日志的存儲路徑和文件名
+---------------------+----------------------------------+mysql> SHOW VARIABLES like "long%"; #查看查詢事件閾值
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 4.000000 |
+-----------------+----------+
測試慢查詢
#用于測試sql語句
mysql> select sleep (10);[root@mysqla ~]# cat /data/mysql/mysqla-slow.log
/usr/local/mysql/bin/mysqld, Version: 8.0.40 (Source distribution). started with:
Tcp port: 3306 Unix socket: /data/mysql/mysql.sock
Time Id Command Argument
# Time: 2025-08-02T00:42:59.892816Z
# User@Host: root[root] @ localhost [] Id: 13
# Query_time: 10.008170 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1
SET timestamp=1754095369;
select sleep (10);
7.并行復制
什么是并行復制?
????????MySQL 中的并行復制(Parallel Replication)是一種優化從庫并行執行主庫事務的機制,用于解決傳統單線程復制(SQL 線程串行執行)導致的延遲問題,提升從庫同步效率。
傳統復制的瓶頸
傳統主從復制中,從庫有兩個核心線程:
-
I/O 線程:負責接收主庫的二進制日志,寫入本地中繼日志(relay log)。
-
SQL 線程:單線程讀取中繼日志進行回放,逐條執行事務。
默認情況下slave中使用的是sql單線程回放
在master中時多用戶讀寫,如果使用sql單線程回放那么會造成組從延遲嚴重
開啟MySQL的多線程回放可以解決上述問題。
并行復制的核心思想
? ? ? ? 并行復制通過多線程同時執行多個事務,利用從庫的多核 CPU 資源,加快中繼日志讀取回放的速度,減少同步延遲。
其實現依賴對事務的分組策略,核心是:多個無沖突的事務可以并行執行。
配置并行復制
#在slaves中設定
[root@mysqlb ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ONslave-parallel-type=LOGICAL_CLOCK #基于邏輯時鐘的并行模式
slave-parallel-workers=16 #開啟線程數量
relay_log_recovery=ON #日志回放恢復功能開啟[root@mysqlb ~]# /etc/init.d/mysql restart
半同步模式
1.主從復制原理
三個線程
實際上主從同步的原理就是基于 binlog 進行數據同步的。在主從復制過程中,會基于3 個線程來操作,一個主庫線程,兩個從庫線程。
-
二進制日志轉儲線程(Binlog dump thread)是一個主庫線程。當從庫線程連接的時候, 主庫可以將二進制日志發送給從庫,當主庫讀取事件(Event)的時候,會在 Binlog 上加鎖,讀取完成之后,再將鎖釋放掉。
-
從庫 I/O 線程會連接到主庫,向主庫發送請求更新 Binlog。這時從庫的 I/O 線程就可以讀取到主庫的二進制日志轉儲線程發送的 Binlog 更新部分,并且拷貝到本地的中繼日志 (Relay log)。
-
從庫 SQL 線程會讀取從庫中的中繼日志,并且執行日志中的事件,將從庫中的數據與主庫保持同步。
復制三步驟
步驟1:Master將寫操作記錄到二進制日志(binlog)。
步驟2:Slave將Master的binary log events拷貝到它的中繼日志(relay log);
步驟3:Slave重做中繼日志中的事件,將改變應用到自己的數據庫中。 MySQL復制是異步的且串行化的,而且重啟后從接入點開始復制。
具體操作
1.slaves端中設置了master端的ip,用戶,日志,和日志的Position,通過這些信息取得master的認證及信息
2.master端在設定好binlog啟動后會開啟binlog dump的線程
3.master端的 dump線程把二進制的更新發送到slave端的i/o線程
4.slave端開啟兩個線程,一個是I/O線程,一個是sql線程,
-
i/o線程用于接收master端的二進制日志,此線程會在本地打開relaylog中繼日志,并且保存到本地磁盤
-
sql線程讀取本地relaylog中繼日志進行回放
5.什么時候我們需要多個slave?
當讀取的而操作遠遠高與寫操作時。我們采用一主多從架構,反之寫操作多時會采用多主的架構
數據庫外層接入負載均衡層并搭配高可用機制
2.原理架構缺陷
從架構采用的是異步機制
master更新完成后直接發送二進制日志到slave,但是slaves是否真正保存了數據master端不會檢測
master端直接保存二進制日志到磁盤
當master端到slave端的網絡出現問題時或者master端直接掛掉,二進制日志可能根本沒有到達slave
master出現問題slave端接管master,這個過程中數據就丟失了
這樣的問題出現就無法達到數據的強一致性,零數據丟失
3.半同步模式原理
1.用戶線程寫入完成后master中的dump會把日志推送到slave端
2.slave中的io線程接收后保存到relaylog中繼日志
3.保存完成后slave向master端返回ack
4.在未接受到slave的ack時master端時不做提交的,一直處于等待當收到ack后提交到存儲引擎
5.在5.6版本中用到的時after_commit模式,after_commit模式時先提交在等待ack返回后輸出ok
4.啟動半同步模式
1.master配置
#master永久開啟半同步功能
[root@mysqla ~]# vim /etc/my.cnf
[mysqld]
server-id=10
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-bin=mysql-bin
default_authentication_plugin=mysql_native_password
gtid_mode=ON
enforce-gtid-consistency=ONemi_sync_master_enabled=1 #開啟半同步功能,永久開啟重啟的話要在mysql安裝插件不然重啟會報錯[root@mysqla ~]# mysql -uroot -pyyy
#安裝半同步插件,發送ACK與接收ACK都是基于插件工作
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #SONAME服務級別的模塊,SO服務級#查看插件運行情況
mysql> SHOW PLUGINS;
rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL #臨時啟動半同步功能,重啟無效
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;#查看半同步功能狀態
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON | #已開啟
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
2.slave配置
#永久開啟半同步功能,需要安裝插件才能重啟
[root@mysqlb~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1 #開啟半同步功能
symbolic-links=0[root@mysqlb ~]# mysql -uroot -pyyy
#注意安裝的插件是slave與master不同
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;#重啟io線程,半同步才能生效
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
#同理多臺slave也是這么配置注意安裝插件跟啟動功能slave端的要改為slave
3.測試
在master寫入數據
mysql> insert into fjw.userlist values ('user4','123');
#查看同步情況
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | #slave端數量
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 1 | #master等待salve確認的總次數
| Rpl_semi_sync_master_no_times | 0 | #超時切換為半同步的次數
| Rpl_semi_sync_master_no_tx | 0 | #未同步數據為0筆
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1283 |
| Rpl_semi_sync_master_tx_wait_time | 1283 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 | #主庫等待從庫確認后成功提交的事務總數
+--------------------------------------------+-------+
?模擬故障,在salve端
[root@mysqlb ~]# mysql -pyyy
mysql> STOP SLAVE IO_THREAD;#在master端再次寫入數據
mysql> insert into fjw.userlist values ('user5','123');#等待10s超時
#查看同步情況
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 2 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 | #顯示一筆數據未同步
| Rpl_semi_sync_master_status | OFF | #當超時后自動轉為異步,slave恢復后轉回半同步
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1283 |
| Rpl_semi_sync_master_tx_wait_time | 1283 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
+--------------------------------------------+-------+