函數(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 的取值邏輯如下:
- 如果最小版本大于等于 MySQL 8.0.17 , 則會(huì)將最小版本之后的第一個(gè)節(jié)點(diǎn)設(shè)置為 lowest_version_end 。
- 如果集群中既有 5.7 , 又有 8.0 , 則會(huì)將 8.0 的第一個(gè)節(jié)點(diǎn)設(shè)置為 lowest_version_end 。
- 如果最小版本小于 MySQL 8.0.17 , 且只有一個(gè)大版本(major_version) , 則會(huì)取 all_members_info->end() 。此時(shí) , 所有節(jié)點(diǎn)都是候選節(jié)點(diǎn) 。
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ò)展閱讀
- 2023年2月14日上學(xué)好嗎 2023年2月14日上學(xué)黃道吉日
- 2023年2月14日開學(xué)典禮吉日一覽表 2023年2月14日開學(xué)典禮黃道吉日
- 2023年農(nóng)歷正月廿四拜師學(xué)藝吉日 2023年2月14日是拜師學(xué)藝的黃道吉日嗎
- 2023年2月14日清掃房屋行嗎 2023年2月14日清掃房屋黃道吉日
- 2023年2月14日堵蟻穴好嗎 2023年2月14日堵蟻穴好不好
- 2023年2月14日適合取蜂蜜嗎 2023年2月14日取蜂蜜吉日一覽表
- 2023年2月14日是遇見貴人吉日嗎 2023年農(nóng)歷正月廿四宜遇見貴人嗎
- 2023年2月14日剃頭好嗎 2023年2月14日是剃頭吉日嗎
- 2023年2月14日理頭黃道吉日 2023年2月14日理頭好不好
- 2023年2月14日是剪指甲的黃道吉日嗎 2023年2月14日剪指甲黃道吉日
