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

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

函數(shù)中的 PRIMARY_ELECTION_PATCH_CONSIDERATION 是 0x080017 , 即 MySQL 8.0.17 。
在 MySQL 8.0.17 中 , Group Replication 引入了兼容性策略 。引入兼容性策略的初衷是為了避免集群中出現(xiàn)節(jié)點(diǎn)不兼容的情況 。
該函數(shù)首先會(huì)對(duì) all_members_info 按照版本從小到大排序 。
接著會(huì)基于第一個(gè)節(jié)點(diǎn)的版本(最小版本)確定 lowest_version_end 。
MGR 用 lowest_version_end 標(biāo)記最低版本的結(jié)束點(diǎn) 。只有 lowest_version_end 之前的節(jié)點(diǎn)才是候選節(jié)點(diǎn) 。
lowest_version_end 的取值邏輯如下:

  1. 如果最小版本大于等于 MySQL 8.0.17 , 則會(huì)將最小版本之后的第一個(gè)節(jié)點(diǎn)設(shè)置為 lowest_version_end 。
  2. 如果集群中既有 5.7 , 又有 8.0 , 則會(huì)將 8.0 的第一個(gè)節(jié)點(diǎn)設(shè)置為  lowest_version_end 。
  3. 如果最小版本小于  MySQL 8.0.17 , 且只有一個(gè)大版本(major_version) , 則會(huì)取 all_members_info->end() 。此時(shí) , 所有節(jié)點(diǎn)都是候選節(jié)點(diǎn) 。
為了方便大家理解代碼的邏輯 , 函數(shù)注釋部分還列舉了四個(gè)案例 , 每個(gè)案例對(duì)應(yīng)一個(gè)典型場(chǎng)景 。后面我們會(huì)具體分析下 。
sort_members_for_election最后 , 我們看看 sort_members_for_election 函數(shù)的實(shí)現(xiàn)邏輯 。
void sort_members_for_election(    std::vector<Group_member_info *> *all_members_info,    std::vector<Group_member_info *>::iterator lowest_version_end) {  Group_member_info *first_member = *(all_members_info->begin());  // 獲取第一個(gè)節(jié)點(diǎn)的版本 , 這個(gè)節(jié)點(diǎn)版本最低 。  Member_version lowest_version = first_member->get_member_version();  // 如果最小版本大于等于 MySQL 5.7.20 , 則根據(jù)節(jié)點(diǎn)的權(quán)重來排序 。權(quán)重越高 , 在 vector 中的位置越靠前 。  // 注意 , 這里只會(huì)對(duì) [all_members_info->begin(), lowest_version_end) 這個(gè)區(qū)間內(nèi)的元素進(jìn)行排序 , 不包括 lowest_version_end 。  if (lowest_version >= PRIMARY_ELECTION_MEMBER_WEIGHT_VERSION)    std::sort(all_members_info->begin(), lowest_version_end,              Group_member_info::comparator_group_member_weight);  else   // 如果最小版本小于 MySQL 5.7.20 , 則根據(jù)節(jié)點(diǎn)的 server_uuid 來排序 。server_uuid 越小 , 在 vector 中的位置越靠前 。    std::sort(all_members_info->begin(), lowest_version_end,              Group_member_info::comparator_group_member_uuid);}函數(shù)中的 PRIMARY_ELECTION_MEMBER_WEIGHT_VERSION 是 0x050720 , 即 MySQL 5.7.20 。
如果最小節(jié)點(diǎn)的版本大于等于 MySQL 5.7.20 , 則會(huì)基于權(quán)重來排序 。權(quán)重越高 , 在 all_members_info 中的位置越靠前 。
如果最小節(jié)點(diǎn)的版本小于 MySQL 5.7.20 , 則會(huì)基于節(jié)點(diǎn)的 server_uuid 來排序 。server_uuid 越小 , 在 all_members_info 中的位置越靠前 。
注意 , std::sort 中的結(jié)束位置是 lowest_version_end , 所以 lowest_version_end 這個(gè)節(jié)點(diǎn)不會(huì)參與排序 。
comparator_group_member_weight在基于權(quán)重進(jìn)行排序時(shí) , 如果兩個(gè)節(jié)點(diǎn)的權(quán)重一致 , 還會(huì)進(jìn)一步比較這兩個(gè)節(jié)點(diǎn)的 server_uuid 。
這個(gè)邏輯是在 comparator_group_member_weight 中定義的 。
權(quán)重一致 , 節(jié)點(diǎn)的 server_uuid 越小 , 在 all_members_info 中的位置越靠前 。

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀