Mysql集成技術

目錄

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)的技術,常用于實現數據冗余備份、讀寫分離等。

工作原理

  1. 主庫記錄二進制日志:主庫將所有對數據庫進行修改的操作(如 INSERT、UPDATE、DELETE 等)記錄到二進制日志(binary log)中。

  2. 從庫請求日志:從庫通過 I/O 線程連接到主庫,請求主庫的二進制日志。

  3. 主庫發送日志:主庫接收到從庫的請求后,通過二進制日志轉儲線程(binlog dump thread)將二進制日志發送給從庫。

  4. 從庫接收并應用日志:從庫的 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 的作用

  1. 簡化主從復制配置:傳統復制需要手動指定主庫的二進制日志文件和偏移量,而 GTID 模式下,從庫只需連接主庫并啟用 GTID,即可自動同步數據。

  2. 提高故障恢復效率:當主庫宕機后,從庫可以通過對比 GTID 集合,快速找到擁有最新數據的從庫作為新主庫,減少切換時間。

  3. 增強數據一致性:通過 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     |	
+--------------------------------------------+-------+

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91850.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《MySQL進階核心技術剖析(一): 存儲引擎》

目錄 一、存儲引擎 1.1 MySQL體系結構 1.2 存儲引擎介紹 1). 建表時指定存儲引擎 2). 查詢當前數據庫支持的存儲引擎 1.3 存儲引擎特點 1.3.1 InnoDB 1.3.2 MyISAM 1.3.3 Memory 1.3.4 區別及特點 1.4 存儲引擎選擇 一、存儲引擎 1.1 MySQL體系結構 1). 連接層 最上…

sqli-labs:Less-26關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入類型&#xff1a;字符串型&#xff08;單引號包裹&#xff09;、GET操作提示&#xff1a;參數需以閉合關鍵參數&#xff1a;id php輸出語句的部分代碼&am…

Spring Boot 的事務注解 @Transactional 失效的幾種情況

開發中我們經常會用到 Spring Boot 的事務注解&#xff0c;為含有多種操作的方法添加事務&#xff0c;做到如果某一個環節出錯&#xff0c;全部回滾的效果。但是在開發中可能會因為不了解事務機制&#xff0c;而導致我們的方法使用了 Transactional 注解但是沒有生效的情況&…

#C語言——刷題攻略:牛客編程入門訓練(四):運算

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言刷題合集》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"代碼行數決定你的下限&#xff0c;算法思維決定你的上限。" 目錄 1. BC25 牛牛買電…

阻抗分析中的軟件解調計算

接上篇 重溫無功功率測量-CSDN博客 已知被測阻抗兩端電壓與流過 通過兩個ADC同步采集到。 激勵頻率10k, 采樣率1M, 每周期100個點 關鍵是:采樣率除以激勵頻率, 得是4的倍數... 所以ADC不能自由運行, 得用一個timer來觸發. 因為要進行同相分量正交分量計算。 1&#xff1a;直…

ubuntu 鏡像克隆

一、克隆 1、準備 一個u盤&#xff08;制作啟動盤&#xff09; 一個移動固態硬盤&#xff08;大于要克隆系統盤的1.2倍&#xff09; 2、使用 rufus生成系統啟動盤 &#xff08;1&#xff09;下載ubuntu iso 桌面版 https://cn.ubuntu.com/download &#xff08;2&#x…

Axure下拉菜單:從基礎交互到高保真元件庫應用

在Web端產品設計中&#xff0c;下拉菜單&#xff08;Dropdown Menu&#xff09; 是用戶與系統交互的核心組件之一&#xff0c;它通過隱藏次要選項、節省頁面空間的方式&#xff0c;提升信息密度與操作效率。無論是基礎下拉菜單、圖標式下拉菜單&#xff0c;還是復雜的多級下拉菜…

復現YOLOV5+訓練指定數據集

一、復現YOLOV5代碼 1.github下載&#xff1a;https://github.com/MIPIT-Team/SSA-YOLO 2.配置環境&#xff1a;創建虛擬環境yolo5 conda create -n yolo5 python3.9 #對應文件夾下pip install -r requirements.txt報錯&#xff1a;ERROR: pips dependency resolver does no…

Agents-SDK智能體開發[4]之集成MCP入門

文章目錄說明一 Agents SDK接入MCP1.1 MCP技術回顧1.2 MCP基礎實踐流程1.2.1 天氣查詢服務器Server創建流程1.2.2 服務器依賴安裝和代碼編寫1.2.3 環境配置文件1.2.4 客戶端代碼編寫1.3 測試運行二 MCPAgents SDK基礎調用2.1 weather_server.py2.2 client_agent.py2.3 運行測試…

Camera相機人臉識別系列專題分析之十九:MTK ISP6S平臺FDNode傳遞三方FFD到APP流程解析

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: Camera相機人臉識別系列專題分析之十九:MTK平臺FDNode傳遞三方FFD到APP流程解析 目錄 一、背景 二、:OcamMeta傳遞FFD到APP 2.1:OcamMeta 2.2 :OcamMeta::process更新FFD 2.…

【實時Linux實戰系列】構建實時監測與報警系統

在實時系統中&#xff0c;監測與報警系統是確保系統正常運行和及時響應異常情況的關鍵組件。實時監測與報警系統能夠實時收集系統數據&#xff0c;分析關鍵事件&#xff0c;并在檢測到異常時發出警報。這種系統廣泛應用于工業自動化、醫療設備監控、網絡安全等領域。掌握實時監…

PHP入門及數據類型

PHP數據類型 PHP標記 //HTML風格 <?phpecho "hello world"; ?> //簡短風格 <?echo "hello world"; ?>數據類型 PHP 最初源于 Perl 語言&#xff0c;與 Perl 類似&#xff0c;PHP 對數據類型采取較為寬松的態度。PHP 規定&#xff0c;變量數…

沸點 | 嬴圖參加世界人工智能大會

2025 WAIC于 7 月 26 日至 28 日在上海舉行。大會展覽面積突破 7 萬平方米&#xff0c;800 余家企業參展。嬴圖作為圖數據庫領域的領先企業&#xff0c;攜前沿技術與創新應用精彩亮相。?大會期間&#xff0c;嬴圖創始人兼CEO孫宇熙與來自全球的頂尖學者、企業代表共同探討人工…

2. 字符設備驅動

一、設備號 1.1. 什么是設備號 設備號是用來標記一類設備以及區分這類設備中具體個體的一組號碼。 設備號由主設備號和次設備號組成。主設備號的作用為標記一類設備、用于標識設備驅動程序,而次設備號的作用是為了區分這類設備中的具體個體設備及用于標識同一驅動程序下的具…

uboot armv8 啟動流程之 linker script

section 詳細說明.text按如下順序&#xff0c;中斷向量表vectors, 啟動入口代碼start.o,普通text, glue &#xff08;arm thumb2 相互調用時自動生成的代碼&#xff09;*(.vectors)CPUDIR/start.o (.text*)*(.text*)*(.glue*)__image_copy_start 標記為text 段入口&#xff0c;…

xxljob總結

XXL-Job 支持多種任務類型&#xff0c;以下是常見任務類型的示例 Demo&#xff0c;包含核心配置和代碼片段&#xff0c;幫助快速理解用法&#xff1a;一、Bean模式任務&#xff08;最常用&#xff09;通過注解 XxlJob 定義任務方法&#xff0c;直接在 Spring 容器中管理&…

Python包安全工程實踐:構建安全可靠的Python生態系統

在現代計算環境中&#xff0c;性能往往是Python包成功的關鍵因素。本文將深入探討Python包的性能優化技術&#xff0c;包括并發編程模型、性能分析工具、內存優化策略以及原生代碼集成等高級主題&#xff0c;幫助你構建高性能的Python組件。1. 性能分析基礎1.1 性能分析工具矩陣…

kubernetes基礎知識

個人博客站—運維鹿: http://www.kervin24.top CSDN博客—做個超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog一、kubernetes介紹Kubernetes本質是一組服務器集群&#xff0c;它可以在集群的每個節點上運行特定的程序&#xff0c;來對節點中的容器進行…

winntsetup安裝驅動和光驅安裝F6功能一樣----NT5.2.3790源代碼分析

D:\drv>dir驅動器 D 中的卷是 新加卷卷的序列號是 443D-D64BD:\drv 的目錄2025-08-03 23:57 <DIR> . 2025-08-03 23:57 <DIR> .. 2008-05-27 10:01 119,068 yk51x86.cat 2008-05-20 10:01 969,380 yk51x86.inf…

Web 開發 11

今天完成了workshop2&#xff0c;進度有點慢&#xff0c;但是記錄一下極為愚蠢的一輪輪問答和思考~&#xff01;&#xff08;還是有點成就感的&#xff09;ps&#xff1a;【】內為我的提問1 導入語句&#xff08;ES6 模塊導入語法&#xff09;【import CatHappiness from "…