日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql半同步降级_MySQL半同步复制

發布時間:2023/12/15 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql半同步降级_MySQL半同步复制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

半同步復制簡介

MySQL復制默認情況下是異步的,主庫將事件寫入binlog并不管從庫是否接受并處理它們,如果主庫崩潰時,已提交的事務可能沒有被傳送到從庫,因此主從切換可能導致數據丟失。Semisynchronous Replication(半同步復制)則一定程度上保證提交的事務已經傳給了至少一個備庫。半同步

復制中,僅僅保證事務的已經傳遞到備庫上,但是并不確保已經在備庫上執行完成了。半同步復制確實有一定的性能影響,因為需要等待的從庫確認。這是對增加數據的完整性的折衷。

工作原理:

從庫連接主庫時指明時從庫否有半同步能力

主庫啟動半同步復制且至少有一個半同步從庫,主庫線程執行事務提交之后將會阻塞直到任一半同步從庫確認接收到該事務的所有事件或者超時

從庫確認接收到事務的所有事件之后寫入到中繼日志并刷新到磁盤

如果超時沒有任何從庫確認事務,主庫恢復到異步復制,保障業務的正常使用,直到一臺從庫追趕上之后,繼續切換到半同步模式

半同步復制必須主從兩端同時啟用,如任意一端禁止將使用異步復制

當主庫被阻塞時(已經提交的事務等待從從庫確認),不會向執行事務的session返回信息;當主庫阻塞結束后,返回session執行結果。

此時,主庫事務已提交,至少一臺從庫確認接收到事務。

如果主備網絡故障或者從庫崩潰,主庫在事務提交后等待10秒(rpl_semi_sync_master_timeout默認值)后,主從復制將自動降級為異步模式。

半同步復制是通過plugin實現的,master和slave使用不同的plugin。默認情況下沒有安裝該plugin,插件位于CMAKE_INSTALL_PREFIX/lib/plugin/。安裝完插件之后,還需要手動設置系統參數以開啟半同步復制模式。

安裝配置半同步

[Master]

首先先檢查 mysql是否支持動態添加插件

mysql> show variables like 'have_dynamic_loading';

+----------------------+-------+

| Variable_name | Value |

+----------------------+-------+

| have_dynamic_loading | YES |

+----------------------+-------+

1 row in set (0.02 sec)

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

Query OK, 0 rows affected (0.04 sec)

mysql> show variables like '%sem%';

+------------------------------------+-------+

| Variable_name | Value |

+------------------------------------+-------+

| rpl_semi_sync_master_enabled | OFF |

| rpl_semi_sync_master_timeout | 10000 |

| rpl_semi_sync_master_trace_level | 32 |

| rpl_semi_sync_master_wait_no_slave | ON |

+------------------------------------+-------+

4 rows in set (0.00 sec)

mysql> set global rpl_semi_sync_master_enabled = ON;

Query OK, 0 rows affected (0.00 sec)

mysql> set global rpl_semi_sync_master_timeout=2000; #毫秒

Query OK, 0 rows affected (0.00 sec)

mysql> show status like '%sem%';

+--------------------------------------------+-------+

| Variable_name | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients | 0 | # 有多少slave設置了半同步模式

| 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 | # 一共有幾次從Semi-sync跌回普通狀態

| Rpl_semi_sync_master_no_tx | 0 | # 備庫未及時響應的事務次數

| Rpl_semi_sync_master_status | ON | # 主庫上Semi-sync是否正常開啟

| Rpl_semi_sync_master_timefunc_failures | 0 | # 時間函數未正常工作的次數

| Rpl_semi_sync_master_tx_avg_wait_time | 0 | # 開啟Semi-sync,事務返回需要等待的平均時間

| 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.01 sec)

[Slave]

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

Query OK, 0 rows affected (0.03 sec)

mysql> show variables like '%sem%';

+---------------------------------+-------+

| Variable_name | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled | OFF |

| rpl_semi_sync_slave_trace_level | 32 |

+---------------------------------+-------+

2 rows in set (0.00 sec)

mysql> set global rpl_semi_sync_slave_enabled = ON;

Query OK, 0 rows affected (0.00 sec)

然后重啟replication(stop slave;start slave;)即可。

一定需要重啟,否則master無法確認該slave是否開啟了半同步。相同的操作可以在任意多個slave中進行設置。

[slave]

mysql> show status like '%sem%';

+----------------------------+-------+

| Variable_name | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status | ON |

+----------------------------+-------+

1 row in set (0.01 sec)

[master]

mysql> show status like '%sem%';

+--------------------------------------------+-------+

| Variable_name | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients | 1 |

| Rpl_semi_sync_master_net_avg_wait_time | 9978 |

| Rpl_semi_sync_master_net_wait_time | 19957 |

| Rpl_semi_sync_master_net_waits | 2 |

| Rpl_semi_sync_master_no_times | 1 |

| Rpl_semi_sync_master_no_tx | 2 |

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

+--------------------------------------------+-------+

14 rows in set (0.00 sec)

狀態說明:

Rpl_semi_sync_master_tx_avg_wait_time:事務因開啟Semi_sync,平均需要額外等待的時間

Rpl_semi_sync_master_net_avg_wait_time:事務進入等待隊列后,到網絡平均等待時間

依據上面兩個狀態值可以知道,Semi-sync的網絡消耗有多大,給某個事務帶來的額外的消耗有多大。

Rpl_semi_sync_master_status: 表示主庫當前Semi-sync是否正常工作

Rpl_semi_sync_slave_status: 表示從庫當前Semi-sync是否正常工作

Rpl_semi_sync_master_no_times:可以知道一段時間內,Semi-sync是否有超時失敗過,該計數器則記錄了這樣的失敗次數。

Rplsemi_sync_master_wait_pos_backtraverse:在semisync_master中,維護了這樣的兩個變量wait_file_name和waitfile_pos,當主庫上多個事務都在等待從庫的響應時,這兩個變量記錄了所有等待中,最小的那一個Binlog位置。如果這時一個新的事務加入等待,并且該事務需要等待的Binlog比waitfile_name和waitfile_pos還小的話,則更新這兩個值,并將Rpl_semi_sync_master_wait_pos_backtraverse值自增1。

整理自網絡

Svoid

2015-01-29

總結

以上是生活随笔為你收集整理的mysql半同步降级_MySQL半同步复制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。