GroupDataSource的物理結(jié)構(gòu)
image.png
負(fù)載均衡的對(duì)象
zebra的負(fù)載均衡是在GroupDataSource的讀庫(kù) readDataSource( LoadBalanceDataSource) 中進(jìn)行的, 它內(nèi)部包含多個(gè)讀庫(kù)節(jié)點(diǎn)的SingleDataSource
LoadBalanceDataSource#getConnection() -> router.select(context);
關(guān)鍵對(duì)象DataSourceRouter 數(shù)據(jù)源路由器
負(fù)載均衡由 DataSourceRouter 數(shù)據(jù)源路由器實(shí)現(xiàn)具體的邏輯 => 它是個(gè)套娃
image.png
包含 中心路由、idc路由撕蔼、區(qū)域路由和權(quán)重乾戏, 這幾個(gè)負(fù)載均衡算法是嵌套執(zhí)行的, 從范圍大到小逐層進(jìn)行
默認(rèn)的 routerStrategy=“WeightRouter" 即 WeightDataSourceRouter 在最里層同機(jī)房范圍內(nèi)的多個(gè)讀庫(kù)是根據(jù)權(quán)重來(lái)選擇的
image.png
了解更多比肄,官方文檔 zebra路由設(shè)計(jì)
區(qū)域夹抗、中心、機(jī)房酸员,最后都會(huì)走向基于權(quán)重的路由 WeightDataSourceRouter#select()
public RouterTarget select(Set<RouterTarget> excludeTargets) {
if (!this.targets.isEmpty()) {
TreeSet<RouterTarget> weights = this.targets;
int tmpGroupDataSourceTargetSize = this.groupDataSourceTargetSize;
if (excludeTargets != null && !excludeTargets.isEmpty()) {
// 需要排除某些GroupDataSourceTarget的話匈子,就重新copy一個(gè)weights
TreeSet<RouterTarget> copyWeights = new TreeSet<RouterTarget>();
tmpGroupDataSourceTargetSize = 0;
for (RouterTarget routerTarget : weights) {
if (excludeTargets.contains(routerTarget)) {
continue;
}
// 先將節(jié)點(diǎn)先放入到排序集合中
// 假設(shè) 節(jié)點(diǎn)1 -> weight=2, 節(jié)點(diǎn)2 -> weight=3
// 則在排序樹(shù)中 節(jié)點(diǎn)1 -> sort=2, 節(jié)點(diǎn)2 -> sort = 2+3
int weight = routerTarget.getWeight();
tmpGroupDataSourceTargetSize += weight;
copyWeights.add(new RouterTarget(routerTarget.getId(), weight, tmpGroupDataSourceTargetSize - 1));
}
weights = copyWeights;
}
if (weights.isEmpty() || tmpGroupDataSourceTargetSize <= 0) {
return null;
}
// 取一個(gè)隨機(jī)數(shù)
int randomNum = random.nextInt(tmpGroupDataSourceTargetSize);
RouterTarget tempForSearch = new RouterTarget(null, -1, randomNum);
//排序集合中最靠近隨機(jī)數(shù)的entry則為目標(biāo)節(jié)點(diǎn)
return weights.ceiling(tempForSearch);
} else {
return null;
}
}
}
想要查看具體執(zhí)行細(xì)節(jié) 河胎,可以debug 源碼里 com.dianping.zebra.group.router 包下的 DataSourceRouter 單測(cè)