欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中半同步模式的實(shí)現(xiàn)示例

 更新時(shí)間:2024年09月09日 15:43:36   作者:妍妍的寶貝  
MySQL半同步復(fù)制是一種解決主從數(shù)據(jù)一致性問題的機(jī)制,本文就來介紹一下MySQL中半同步模式的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下

1 半同步簡介: 解決主從數(shù)據(jù)一致性問題

MySQL 半同步復(fù)制是一種機(jī)制,旨在解決主從數(shù)據(jù)的一致性問題。它的主要目標(biāo)是在主服務(wù)器提交事務(wù)之前等待至少一個(gè)從服務(wù)器確認(rèn)收到了該事務(wù)的二進(jìn)制日志事件。這樣可以確保主服務(wù)器上的事務(wù)在從服務(wù)器上至少有一個(gè)副本,從而提高數(shù)據(jù)可靠性。

在默認(rèn)情況下,MySQL的復(fù)制是異步的,這意味著主服務(wù)器及其從服務(wù)器是獨(dú)立的。異步復(fù)制可以提供最佳的性能,因?yàn)橹鞣?wù)器在將更新的數(shù)據(jù)寫入它的二進(jìn)制日志(Binlog)文件中后,無需等待驗(yàn)證更新數(shù)據(jù)是否已經(jīng)復(fù)制到從服務(wù)器中,就可以自由處理其它進(jìn)入的事務(wù)處理請求。但這也同時(shí)帶來了很高的風(fēng)險(xiǎn),如果在主服務(wù)器或從服務(wù)器端發(fā)生故障,會造成主從數(shù)據(jù)的不一致,甚至在恢復(fù)時(shí)造成數(shù)據(jù)丟失。

從MySQL5.5開始引入了一種半同步復(fù)制功能,該功能可以確保主服務(wù)器和訪問鏈中至少一臺從服務(wù)器之間的數(shù)據(jù)一致性和冗余。在這種配置結(jié)構(gòu)中,一臺主服務(wù)器和其許多從服務(wù)器都進(jìn)行了配置,這樣在復(fù)制拓?fù)渲校辽儆幸慌_從服務(wù)器在父主服務(wù)器進(jìn)行事務(wù)處理前,必須確認(rèn)更新已經(jīng)收到并寫入了其中繼日志 (Relay Log)。當(dāng)出現(xiàn)超時(shí),源主服務(wù)器必須暫時(shí)切換到異步復(fù)制模式重新復(fù)制,直到至少有一臺設(shè)置為半同步復(fù)制模式的從服務(wù)器及時(shí)收到信息。 繼5.5半同步復(fù)制后,MySQL5.6又對其進(jìn)行了優(yōu)化和改進(jìn),其中有兩個(gè)地方較為重要:

1> 在主從切換后,在傳統(tǒng)的方式里,需要找到binlog和POS點(diǎn),然后更改master指向,而在mysql5.6里,你無須再知道binlog和POS點(diǎn),你只需要知道m(xù)aster的IP、端口,賬號密碼即可,因?yàn)橥綇?fù)制是自動(dòng)的,mysql通過內(nèi)部機(jī)制GTID自動(dòng)找點(diǎn)同步。 ?

2> 多線程復(fù)制,以前的版本,同步復(fù)制是單線程的,只能一個(gè)一個(gè)執(zhí)行,在MySQL5.6里,可以做到多個(gè)庫之間的多線程復(fù)制,但一個(gè)庫里的表,多線程復(fù)制是無效的。

1.用戶線程寫入完成后master中的dump會把日志推送到slave端

2.slave中的io線程接收后保存到relaylog中繼日志

3.保存完成后slave向master端返回ack

4.在未接受到slave的ack時(shí)master端時(shí)不做提交的,一直處于等待當(dāng)收到ack后提交到存儲引擎

5.在5.6版本中用到的時(shí)after_commit模式,after_commit模式時(shí)先提交在等待ack返回后輸出ok

2 實(shí)現(xiàn)半同步模式實(shí)踐操作

2.1 MASTER

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
[root@mysql-01 ~]# vim /etc/my.cnf 

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log_bin=mysql-bin
server_id=10
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1    # 增加模塊 master 端自啟動(dòng) 


[root@mysql-01 ~]# systemctl restart mysqld


# 查看模塊是否安裝成功
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+

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 |
+-------------------------------------------+------------+

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |  -- (1) 表示當(dāng)前有多少個(gè)從服務(wù)器客戶端正在進(jìn)行半同步復(fù)制。
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |  -- (2) 表示主服務(wù)器在等待從服務(wù)器確認(rèn)時(shí)網(wǎng)絡(luò)平均等待時(shí)間(毫秒)。這里的值為0,表示沒有平均網(wǎng)絡(luò)等待時(shí)間。
| Rpl_semi_sync_master_net_wait_time         | 0     |  -- (3) 表示主服務(wù)器在網(wǎng)絡(luò)等待上的總時(shí)間(毫秒)。這里的值同樣為0,表示沒有總的網(wǎng)絡(luò)等待時(shí)間。
| Rpl_semi_sync_master_net_waits             | 0     |  -- (4) 表示主服務(wù)器因網(wǎng)絡(luò)原因等待的次數(shù)。這里的值為0,表示沒有因網(wǎng)絡(luò)原因?qū)е碌牡却?
| Rpl_semi_sync_master_no_times              | 0     |  -- (5) 表示主服務(wù)器沒有等待任何從服務(wù)器確認(rèn)的次數(shù)。這里的值為0,表示所有事務(wù)都至少等待了一個(gè)從服務(wù)器的確認(rèn)。
| Rpl_semi_sync_master_no_tx                 | 0     |  -- (6) 表示主服務(wù)器沒有提交任何事務(wù)的次數(shù)。這里的值為0,表示所有事務(wù)都進(jìn)行了半同步復(fù)制。
| Rpl_semi_sync_master_status                | ON    |  -- (7) 表示半同步復(fù)制當(dāng)前是否啟用。在這里,半同步復(fù)制是啟用的。
| Rpl_semi_sync_master_timefunc_failures     | 0     |  -- (8) 表示由于時(shí)間函數(shù)失敗而導(dǎo)致半同步復(fù)制失敗的次數(shù)。這里的值為0,表示沒有時(shí)間函數(shù)失敗。
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |  -- (9) 表示主服務(wù)器在等待從服務(wù)器確認(rèn)事務(wù)時(shí)的平均等待時(shí)間(毫秒)。這里的值為0,表示沒有平均等待時(shí)間。
| Rpl_semi_sync_master_tx_wait_time          | 0     |  -- (10) 表示主服務(wù)器等待從服務(wù)器確認(rèn)事務(wù)的總等待時(shí)間(毫秒)。這里的值為0,表示沒有總的等待時(shí)間。
| Rpl_semi_sync_master_tx_waits              | 0     |  -- (11) 表示主服務(wù)器等待從服務(wù)器確認(rèn)事務(wù)的次數(shù)。這里的值為0,表示沒有等待時(shí)間。
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |  -- (12) 表示主服務(wù)器在等待從服務(wù)器確認(rèn)時(shí)回溯binlog位置的次數(shù)。這里的值為0,表示沒有回溯binlog位置。
| Rpl_semi_sync_master_wait_sessions         | 0     |  -- (13) 表示主服務(wù)器等待從服務(wù)器確認(rèn)事務(wù)時(shí)涉及的會話數(shù)量。這里的值為0,表示沒有等待會話。
| Rpl_semi_sync_master_yes_tx                | 0     |  -- (14) 表示主服務(wù)器成功提交事務(wù)并得到從服務(wù)器確認(rèn)的次數(shù)。這里的值為0,表示沒有事務(wù)成功提交并得到確認(rèn)。
+--------------------------------------------+-------+

2.2 SLAVE 1

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

[root@mysql-02 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server_id=20
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1

[root@mysql-02 ~]# systemctl restart mysqld

[root@mysql-02 ~]# mysql -uroot -pOpenlab123!

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    |
+----------------------------+-------+

2.3 SLAVE 2 

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

[root@mysql-02 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server_id=30
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1

[root@mysql-02 ~]# systemctl restart mysqld

[root@mysql-02 ~]# mysql -uroot -pOpenlab123!

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    |
+----------------------------+-------+

2.4 查看client鏈接狀態(tài) 

再次回到MASTER

[root@mysql-01 ~]# systemctl restart mysqld


mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |  # 發(fā)現(xiàn)鏈接客戶端變成了兩個(gè)
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+

2.5 SLAVE 服務(wù)器故障模擬

2.5.1 停止 SLAVE 的 IO_THREAD 

# SLAVE 1
mysql> STOP SLAVE IO_THREAD;
mysql> SHOW SLAVE STATUS\G

# SLAVE 2 
mysql> STOP SLAVE IO_THREAD;
mysql> SHOW SLAVE STATUS\G

2.5.2 查看SLAVE 的IO線程是否關(guān)閉 

2.5.3 查看 MASTER 上 client 的連接狀態(tài)

mysql> SHOW STATUS LIKE 'Rpl_semi%';

2.5.4 在MASTER端插入數(shù)據(jù)

mysql> insert into wawa values(7,'www.shuyan');
Query OK, 1 row affected (10.00 sec)

                                    # 會卡住十秒鐘然后從同步轉(zhuǎn)為異步,再插入數(shù)據(jù)
mysql> SELECT * FROM wawa;
+----+-----------------+
| id | name            |
+----+-----------------+
|  1 | wawa            |
|  2 | shuyan          |
|  3 | shuyan and wawa |
|  4 | shuyan--------  |
|  5 | shuyan.com      |
|  6 | 12333           |
|  7 | www.shuyan      |
+----+-----------------+

mysql> SHOW STATUS LIKE 'Rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     | # 一筆數(shù)據(jù)為同步
| Rpl_semi_sync_master_status                | OFF   | # 自動(dòng)轉(zhuǎn)為異步模式,等待slave恢復(fù)
| Rpl_semi_sync_master_timefunc_failures     | 0     | # 會自動(dòng)恢復(fù)
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

2.5.5 MASTER 還能寫入數(shù)據(jù)的原因

為什么還能寫入呢?是因?yàn)樗诔^超時(shí)時(shí)間的時(shí)候,模式由同步模式轉(zhuǎn)為異步模式

開啟從服務(wù)器的 IO_THREAD 線程

# SLAVE 1
mysql> start slave io_thread;
# SLAVE 2
mysql> start slave io_thread;


# 在SLAVE上發(fā)現(xiàn)數(shù)據(jù)已經(jīng)同步過來了
mysql> select * from shuyan.wawa;
+----+-----------------+
| id | name            |
+----+-----------------+
|  1 | wawa            |
|  2 | shuyan          |
|  3 | shuyan and wawa |
|  4 | shuyan--------  |
|  5 | shuyan.com      |
|  6 | 12333           |
|  7 | www.shuyan      |
+----+-----------------+

在從服務(wù)器開啟半同步復(fù)制時(shí),主服務(wù)器會在等待從服務(wù)器響應(yīng)之前設(shè)置一個(gè)超時(shí)時(shí)間。如果超過這個(gè)時(shí)間還沒有收到從服務(wù)器的響應(yīng),主服務(wù)器會自動(dòng)轉(zhuǎn)換為異步模式。當(dāng)從服務(wù)器恢復(fù)連接時(shí),它會自動(dòng)接收到主服務(wù)器在此期間插入的所有數(shù)據(jù)。

當(dāng)從服務(wù)器IO_THREAD 線程 恢復(fù)連接時(shí),從服務(wù)器會按照 GTID 的順序接收并應(yīng)用來自主服務(wù)器的事務(wù)。

當(dāng)從服務(wù)器的 I/O 線程恢復(fù)連接時(shí),它會查找 gtid_executed 列表中缺失的 GTID,并從相應(yīng)的二進(jìn)制日志文件和位置開始復(fù)制。這樣,從服務(wù)器會按照 GTID 的順序接收并應(yīng)用來自主服務(wù)器的事務(wù),從而保證數(shù)據(jù)的一致性和完整性

MySQL 半同步復(fù)制可以通過 GTID(全局事務(wù)標(biāo)識符)來比對數(shù)據(jù)。當(dāng)從服務(wù)器恢復(fù)連接時(shí),它會根據(jù) GTID 查找主服務(wù)器上尚未應(yīng)用的事務(wù),并自動(dòng)接收到這些事務(wù)。

到此這篇關(guān)于MySQL中半同步模式的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL 半同步模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL性能優(yōu)化之路---修改配置文件my.cnf

    MySQL性能優(yōu)化之路---修改配置文件my.cnf

    mysql數(shù)據(jù)庫的優(yōu)化,算是一個(gè)老生常談的問題了,網(wǎng)上也有很多關(guān)于各方面性能優(yōu)化的例子,今天我們要談的是MySQL 系統(tǒng)參數(shù)的優(yōu)化即優(yōu)化my.cnf文件
    2014-06-06
  • 關(guān)于Mysql的InnoDB鎖概述

    關(guān)于Mysql的InnoDB鎖概述

    這篇文章主要介紹了關(guān)于Mysql的InnoDB鎖概述,對于更新操作(UPDATE、INSERT、DELETE),InnoDB會自動(dòng)給涉及到的數(shù)據(jù)集加排他鎖,需要的朋友可以參考下
    2023-05-05
  • MySQL數(shù)據(jù)庫入門之備份數(shù)據(jù)庫操作詳解

    MySQL數(shù)據(jù)庫入門之備份數(shù)據(jù)庫操作詳解

    這篇文章主要介紹了MySQL數(shù)據(jù)庫入門之備份數(shù)據(jù)庫操作,結(jié)合實(shí)例形式詳細(xì)分析了MySQL備份數(shù)據(jù)庫基本操作命令與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • centOS7安裝MySQL數(shù)據(jù)庫

    centOS7安裝MySQL數(shù)據(jù)庫

    本文給大家簡單介紹了如何在centOS7下安裝MySQL5.6數(shù)據(jù)庫的方法,以及一些注意事項(xiàng),希望對大家實(shí)用mysql能夠有所幫助
    2016-12-12
  • MySQL中一條查詢SQL語句的完整執(zhí)行流程

    MySQL中一條查詢SQL語句的完整執(zhí)行流程

    通常我們在使用MySQL時(shí),我們看到的只是輸入一條語句,返回一個(gè)結(jié)果,卻不知道這條語句在MySQL內(nèi)部的執(zhí)行過程,這篇文章主要給大家介紹了關(guān)于MySQL中一條查詢SQL語句的完整執(zhí)行流程,需要的朋友可以參考下
    2024-05-05
  • 如何解決Mysql報(bào)錯(cuò)Deadlock found when trying to get lock;try restarting transaction問題

    如何解決Mysql報(bào)錯(cuò)Deadlock found when trying to

    這篇文章主要介紹了如何解決Mysql報(bào)錯(cuò)Deadlock found when trying to get lock;try restarting transaction問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Mysql CAST函數(shù)的具體使用

    Mysql CAST函數(shù)的具體使用

    本文主要介紹了Mysql CAST函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Mysql索引常見問題匯總

    Mysql索引常見問題匯總

    這篇文章主要介紹了Mysql索引常見問題匯總,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10
  • 5招帶你輕松優(yōu)化MySQL count(*)查詢性能

    5招帶你輕松優(yōu)化MySQL count(*)查詢性能

    最近在公司優(yōu)化了幾個(gè)慢查詢接口的性能,總結(jié)了一些心得體會拿出來跟大家一起分享一下,文中的示例代碼講解詳細(xì),希望對大家會有所幫助
    2022-11-11
  • MYSQL安裝時(shí)解決要輸入current root password的解決方法

    MYSQL安裝時(shí)解決要輸入current root password的解決方法

    在裝MYSQL的時(shí)候發(fā)現(xiàn)要輸入current root password不記得以前在電腦里裝過(你的系統(tǒng)曾經(jīng)裝過MYSQL在重裝就會要求輸入原來設(shè)定的密碼,如果是第一次安裝就不會出現(xiàn)),在網(wǎng)上苦苦搜尋解決方法。
    2011-07-07

最新評論