MySQL5.7主庫安裝半同步插件導(dǎo)致主庫hang住無響應(yīng)

1. 背景

MySQL 1主2從,半同步復(fù)制,主庫有較高的寫入量,此時在主庫重復(fù)安裝半同步插件,可能導(dǎo)致主庫hang住,無響應(yīng),只能通過重啟數(shù)據(jù)庫來恢復(fù)。

MySQL版本:Percona Server 5.7.19
操作系統(tǒng):Red Hat Enterprise Linux Server release 6.3

2. 復(fù)現(xiàn)步驟

  1. 準(zhǔn)備環(huán)境MySQL 5.7.19 1主2從,半同步復(fù)制
  2. 使用sysbench往主庫寫數(shù)據(jù)
  3. 在主庫循環(huán)執(zhí)行安裝半同步插件命令:
    a) INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    b) INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  4. 在應(yīng)用機(jī)器上連接到主庫,多線程循環(huán)執(zhí)行:
    a) select @@session.tx_read_only
  5. 運(yùn)行一段時間,復(fù)現(xiàn)故障。
    a) 主庫無法連接,無響應(yīng)
    b) 從庫Slave_IO_Running: Connecting

3. 原因分析

通過分析MySQL源碼,安裝半同步插件過程中,加鎖順序為:

//sql/sql_plugin.cc
mysql_mutex_lock(&LOCK_plugin);
mysql_rwlock_wrlock(&LOCK_system_variables_hash);
…
if (plugin_find_internal(name_cstr, MYSQL_ANY_PLUGIN))
  {
    mysql_mutex_unlock(&LOCK_plugin);
    report_error(report, ER_UDF_EXISTS, name->str);
    mysql_mutex_lock(&LOCK_plugin);
    DBUG_RETURN(TRUE);
  }
…
mysql_rwlock_unlock(&LOCK_system_variables_hash);
mysql_mutex_unlock(&LOCK_plugin);

在發(fā)現(xiàn)半同步插件已經(jīng)安裝的情況下,會先釋放鎖 mysql_mutex_unlock(&LOCK_plugin); 然后報告錯誤(report_error) ,也就是常見到的 Function 'rpl_semi_sync_master' already exists, 之后再加鎖mysql_mutex_lock(&LOCK_plugin);
這個釋放鎖,報告錯誤信息,再加鎖的間隙,LOCK_plugin 可能會被其他線程拿到。

其他線程加鎖順序為:

mysql_mutex_lock(&LOCK_plugin);
mysql_rwlock_rdlock(&LOCK_system_variables_hash);

拿到第一個鎖,等LOCK_system_variables_hash, 而LOCK_system_variables_hash這個鎖被安裝半同步插件線程持有,導(dǎo)致死鎖。

擴(kuò)展一下,安裝插件,除了插件已經(jīng)存在之外,無法打開動態(tài)庫(Can't open shared library)和 動態(tài)庫無法找到符號入口(Can't find symbol in library),都有可能與業(yè)務(wù)SQL產(chǎn)生死鎖。

mysql_mutex_unlock(&LOCK_plugin);
report_error(report, ER_CANT_OPEN_LIBRARY, dl->str, 0, buf);
mysql_mutex_lock(&LOCK_plugin);
mysql_mutex_unlock(&LOCK_plugin);
report_error(report, ER_CANT_FIND_DL_ENTRY, name->str);
mysql_mutex_lock(&LOCK_plugin);

另外,除了半同步插件外,其他的插件,如審計插件(Audit)等,都有可能會觸發(fā)死鎖。


Percona Server 5.7.25 已修復(fù)該Bug。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、復(fù)制架構(gòu)衍生史 在談這個特性之前,我們先來看看MySQL的復(fù)制架構(gòu)衍生史。 在2000年,MySQL 3.23...
    張偉科閱讀 11,349評論 0 9
  • (第二十一周作業(yè)) 1、對數(shù)據(jù)庫實現(xiàn)lvm2的備份和慢查詢優(yōu)化 1.1 LVM2備份操作 配合lvm2實現(xiàn)數(shù)據(jù)庫備...
    haoxi2018閱讀 398評論 0 1
  • MySQL運(yùn)維實踐 5.1-MySQL日志系統(tǒng) 什么是日志 日志(log)是一種順序記錄事件流水的文件 記錄計算機(jī)...
    極客圈閱讀 1,439評論 1 11
  • MariaDB是MySQL的一個主要的開源分支。由于oracle收購MySQL之后,擔(dān)心將其閉源,MySQL之父m...
    家里蹲大叔閱讀 1,869評論 0 1
  • 時間:2019.3.18~2019.3.124 誰享受誰快樂,誰堅持誰痛苦 【上周計劃 2019.3.12~201...
    騰飛的葉子閱讀 257評論 0 0