• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    MySQL多個Slave同一server_id的沖突原因分析

    來源:懂視網 責編:小采 時間:2020-11-09 13:19:25
    文檔

    MySQL多個Slave同一server_id的沖突原因分析

    MySQL多個Slave同一server_id的沖突原因分析:本文內容遵從CC版權協議, 可以隨意轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明網址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一個詭異問題,一個模擬Slave線程的程序,不斷
    推薦度:
    導讀MySQL多個Slave同一server_id的沖突原因分析:本文內容遵從CC版權協議, 可以隨意轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明網址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一個詭異問題,一個模擬Slave線程的程序,不斷

    本文內容遵從CC版權協議, 可以隨意轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明網址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一個詭異問題,一個模擬Slave線程的程序,不斷的被Master Ser

    本文內容遵從CC版權協議, 可以隨意轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明網址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html

    今天分析一個詭異問題,一個模擬Slave線程的程序,不斷的被Master Server給kill掉,最終發現是因為有兩個Slave使用同樣一個server id去連接Master Server,為什么兩個Slave用同一個server id會被Master Server給Kill呢?分析了源碼,這源于MySQL Replication的重連機制。

    我們首先看看一個Slave注冊到Master會發生什么,首先Slave需要向Master發送一個COM_REGISTER_SLAVE類型的請求(sql_parse.cc)命令請求,這里Master會使用register_slave函數注冊一個Slave到slave_list。

     case COM_REGISTER_SLAVE:
     {
     if (!register_slave(thd, (uchar*)packet, packet_length))
     my_ok(thd);
     break;
     }

    在注冊Slave線程的時候會發生什么呢?我們略去無用的代碼直接看重點:(repl_failsafe.cc)

    int register_slave(THD* thd, uchar* packet, uint packet_length)
    {
     int res;
     SLAVE_INFO *si;
     uchar *p= packet, *p_end= packet + packet_length;
    .... //省略
     if (!(si->master_id= uint4korr(p)))
     si->master_id= server_id;
     si->thd= thd;
     pthread_mutex_lock(&LOCK_slave_list);
     unregister_slave(thd,0,0); //關鍵在這里,先取消注冊server_id相同的Slave線程
     res= my_hash_insert(&slave_list, (uchar*) si); //把新的Slave線程注冊到slave_list
     pthread_mutex_unlock(&LOCK_slave_list);
     return res;
    .....
    }

    這是什么意思呢?這就是重連機制,slave_list是一個Hash表,server_id是Key,每一個線程注冊上來,需要刪掉同樣server_id的Slave線程,再把新的Slave線程加到slave_list表中。

    線程注冊上來后,請求Binlog,發送COM_BINLOG_DUMP請求,Master會發送binlog給Slave,代碼如下:

     case COM_BINLOG_DUMP:
     {
     ulong pos;
     ushort flags;
     uint32 slave_server_id;
     
     status_var_increment(thd->status_var.com_other);
     thd->enable_slow_log= opt_log_slow_admin_statements;
     if (check_global_access(thd, REPL_SLAVE_ACL))
     break;
     
     /* TODO: The following has to be changed to an 8 byte integer */
     pos = uint4korr(packet);
     flags = uint2korr(packet + 4);
     thd->server_id=0; /* avoid suicide */
     if ((slave_server_id= uint4korr(packet+6))) // mysqlbinlog.server_id==0
     kill_zombie_dump_threads(slave_server_id);
     thd->server_id = slave_server_id;
     
     general_log_print(thd, command, "Log: '%s' Pos: %ld", packet+10,
     (long) pos);
     mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags); //不斷的發送日志給slave端
     unregister_slave(thd,1,1); //發送完成后清理Slave線程,因為執行到這一步肯定是binlog dump線程被kill了
     /* fake COM_QUIT -- if we get here, the thread needs to terminate */
     error = TRUE;
     break;
     }

    mysql_binlog_send函數在sql_repl.cc,里面是輪詢Master binlog,發送給Slave。

    再來簡單看看unregister_slave做了什么(repl_failsafe.cc):

    void unregister_slave(THD* thd, bool only_mine, bool need_mutex)
    {
     if (thd->server_id)
     {
     if (need_mutex)
     pthread_mutex_lock(&LOCK_slave_list);
     
     SLAVE_INFO* old_si;
     if ((old_si = (SLAVE_INFO*)hash_search(&slave_list,
     (uchar*)&thd->server_id, 4)) &&
     (!only_mine || old_si->thd == thd)) //拿到slave值
     hash_delete(&slave_list, (uchar*)old_si); //從slave_list中拿掉
     
     if (need_mutex)
     pthread_mutex_unlock(&LOCK_slave_list);
     }
    }

    這就可以解釋同樣的server_id為什么會被kill,因為一旦注冊上去,就會現刪除相同server_id的Slave線程,然后把當前的Slave加入,這是因為有時Slave斷開了,重新請求上來,當然需要踢掉原來的線程,這就是線程重連機制。

    切記,一個MySQL集群中,絕不可以出現相同server_id的實例,否則各種詭異的問題可是接踵而來。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    MySQL多個Slave同一server_id的沖突原因分析

    MySQL多個Slave同一server_id的沖突原因分析:本文內容遵從CC版權協議, 可以隨意轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明網址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一個詭異問題,一個模擬Slave線程的程序,不斷
    推薦度:
    標簽: id 原因 多個
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久久91人妻无码精品蜜桃HD | 国产乱子伦精品无码专区| 日韩精品欧美国产在线| 东京热TOKYO综合久久精品| 日韩一区二区精品观看| 国产精品乱伦| 欧美精品免费在线| 99精品热这里只有精品| 久久永久免费人妻精品下载| 亚洲精品国产成人影院| 国内精品久久久久久麻豆| 亚洲精品欧美综合| 国产精品日本欧美一区二区 | 国产成人精品综合在线观看| 国产成人亚洲精品| 国产精品人人爽人人做我的可爱 | 91自慰精品亚洲| 国产精品高清一区二区三区不卡| 亚洲日韩精品一区二区三区| 久久国产精品免费| Xx性欧美肥妇精品久久久久久| 国产精品自拍一区| 国产成人精品一区二区三区免费| 欧美精品亚洲精品日韩传电影 | 国产成人高清精品免费观看| 国产精品美女久久久| laowang在线精品视频| 国产成人精品日本亚洲网站| 亚洲精品~无码抽插| 中文字幕精品无码一区二区 | 2023国产精品自拍| 999久久久国产精品| 视频二区国产精品职场同事| 亚洲精品高清久久| 思思99热在线观看精品| 亚洲国产精品一区二区久久| 51精品资源视频在线播放| 国产成人99久久亚洲综合精品| 国产精品香蕉在线观看| 国产精品免费αv视频| 国产精品欧美久久久久无广告|