免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

從源碼分析 MGR 的新主選舉算法

MGR 的新主選舉算法 , 在節(jié)點版本一致的情況下 , 其實也挺簡單的 。
首先比較權(quán)重 , 權(quán)重越高 , 選為新主的優(yōu)先級越高 。
如果權(quán)重一致 , 則會進一步比較節(jié)點的 server_uuid 。server_uuid 越小 , 選為新主的優(yōu)先級越高 。
所以 , 在節(jié)點版本一致的情況下 , 會選擇權(quán)重最高 , server_uuid 最小的節(jié)點作為新的主節(jié)點 。
節(jié)點的權(quán)重由 group_replication_member_weight 決定 , 該參數(shù)是 MySQL 5.7.20 引入的 , 可設(shè)置 0 到 100 之間的任意整數(shù)值 , 默認是 50 。
但如果集群節(jié)點版本不一致 , 實際的選舉算法就沒這么簡單了 。
下面 , 我們結(jié)合源碼具體分析下 。
代碼實現(xiàn)邏輯新主選舉算法主要會涉及三個函數(shù):

  1. pick_primary_member
  2. sort_and_get_lowest_version_member_position
  3. sort_members_for_election
這三個函數(shù)都是在 primary_election_invocation_handler.cc 中定義的 。
其中 , pick_primary_member 是主函數(shù) , 它會基于其它兩個函數(shù)的結(jié)果選擇 Primary 節(jié)點 。
下面 , 我們從 pick_primary_member 出發(fā) , 看看這三個函數(shù)的具體實現(xiàn)邏輯 。
pick_primary_memberbool Primary_election_handler::pick_primary_member(    std::string &primary_uuid,    std::vector<Group_member_info *> *all_members_info) {  DBUG_TRACE;  bool am_i_leaving = true;#ifndef NDEBUG  int n = 0;#endif  Group_member_info *the_primary = nullptr;  std::vector<Group_member_info *>::iterator it;  std::vector<Group_member_info *>::iterator lowest_version_end;  // 基于 member_version 選擇候選節(jié)點 。  lowest_version_end =      sort_and_get_lowest_version_member_position(all_members_info);  // 基于節(jié)點權(quán)重和 server_uuid 對候選節(jié)點進行排序 。  sort_members_for_election(all_members_info, lowest_version_end);  // 遍歷所有節(jié)點 , 判斷 Primary 節(jié)點是否已定義 。  for (it = all_members_info->begin(); it != all_members_info->end(); it++) {#ifndef NDEBUG    assert(n <= 1);#endif    Group_member_info *member = *it;    // 如果當(dāng)前節(jié)點是單主模式且遍歷的節(jié)點中有 Primary 節(jié)點 , 則將該節(jié)點賦值給 the_primary    if (local_member_info->in_primary_mode() && the_primary == nullptr &&        member->get_role() == Group_member_info::MEMBER_ROLE_PRIMARY) {      the_primary = member;#ifndef NDEBUG      n++;#endif    }    // 檢查當(dāng)前節(jié)點的狀態(tài)是否為 OFFLINE 。    if (!member->get_uuid().compare(local_member_info->get_uuid())) {      am_i_leaving =          member->get_recovery_status() == Group_member_info::MEMBER_OFFLINE;    }  }  // 如果當(dāng)前節(jié)點的狀態(tài)不是 OFFLINE 且 the_primary 還是為空 , 則選擇一個 Primary 節(jié)點  if (!am_i_leaving) {    if (the_primary == nullptr) {      // 因為循環(huán)的結(jié)束條件是 it != lowest_version_end 且 the_primary 為空 , 所以基本上會將候選節(jié)點中的第一個節(jié)點作為 Primary 節(jié)點 。      for (it = all_members_info->begin();           it != lowest_version_end && the_primary == nullptr; it++) {        Group_member_info *member_info = *it;        assert(member_info);        if (member_info && member_info->get_recovery_status() ==                               Group_member_info::MEMBER_ONLINE)          the_primary = member_info;      }    }  }  if (the_primary == nullptr) return true;  primary_uuid.assign(the_primary->get_uuid());  return false;}

經(jīng)驗總結(jié)擴展閱讀