- 投票のバリデータを達成するための重みに基づいて:QuorumHierarchical
重量に基づいて、達成するためにマシンの議決バリデータの数に基づいて、前回の記事では解決は利点は、それがより良いマシンのパフォーマンス、ネットワーク、より良い部屋に展開することができますので、より多くを提供できることですしていますサービス飼育係の安定した、より良い品質は、議決権の多くを所有しています。 - 公式には、再設定をする権利を与えます:
group.1=1:2:3
group.2=4:5:6
group.3=7:8:9
weight.1=1
weight.2=1
weight.3=1
weight.4=1
weight.5=1
weight.6=1
weight.7=1
weight.8=1
weight.9=1
次のように解釈:
1基は、3分割され、各グループの値はSERVERID、ある「:」パーティション
2.各重み値は1つのSERVERIDある
フォーマットに従います。
group.groupId = serverId1:serverId2
weight.serverId = weight值
- コンストラクタは、体重を解決するように構成します:
public QuorumHierarchical(Properties qp) throws ConfigException {
parse(qp);
LOG.info(serverWeight.size() + ", " + serverGroup.size() + ", " + groupWeight.size());
}
private void parse(Properties quorumProp) throws ConfigException{
for (Entry<Object, Object> entry : quorumProp.entrySet()) {
String key = entry.getKey().toString();
String value = entry.getValue().toString();
if (key.startsWith("server.")) {
int dot = key.indexOf('.');
long sid = Long.parseLong(key.substring(dot + 1));
QuorumServer qs = new QuorumServer(sid, value);
allMembers.put(Long.valueOf(sid), qs);
if (qs.type == LearnerType.PARTICIPANT)
participatingMembers.put(Long.valueOf(sid), qs);
else {
observingMembers.put(Long.valueOf(sid), qs);
}
} else if (key.startsWith("group")) {
int dot = key.indexOf('.');
long gid = Long.parseLong(key.substring(dot + 1));
numGroups++;
String parts[] = value.split(":");
for(String s : parts){
long sid = Long.parseLong(s);
if(serverGroup.containsKey(sid))
throw new ConfigException("Server " + sid + "is in multiple groups");
else
serverGroup.put(sid, gid);
}
} else if(key.startsWith("weight")) {
int dot = key.indexOf('.');
long sid = Long.parseLong(key.substring(dot + 1));
serverWeight.put(sid, Long.parseLong(value));
} else if (key.equals("version")){
version = Long.parseLong(value, 16);
}
}
for (QuorumServer qs: allMembers.values()){
Long id = qs.id;
if (qs.type == LearnerType.PARTICIPANT){
if (!serverGroup.containsKey(id))
throw new ConfigException("Server " + id + "is not in a group");
if (!serverWeight.containsKey(id))
serverWeight.put(id, (long) 1);
}
}
computeGroupWeight();
}
private void computeGroupWeight(){
for (Entry<Long, Long> entry : serverGroup.entrySet()) {
Long sid = entry.getKey();
Long gid = entry.getValue();
if(!groupWeight.containsKey(gid))
groupWeight.put(gid, serverWeight.get(sid));
else {
long totalWeight = serverWeight.get(sid) + groupWeight.get(gid);
groupWeight.put(gid, totalWeight);
}
}
/*
* Do not consider groups with weight zero
*/
for(long weight: groupWeight.values()){
LOG.debug("Group weight: " + weight);
if(weight == ((long) 0)){
numGroups--;
LOG.debug("One zero-weight group: " + 1 + ", " + numGroups);
}
}
}
次のように解釈:
quorumProp分析サイクルのキー1.オブジェクト
2.「サーバー」開始時には、クラスタ内のサーバーが、それは次のSERVERIDを解析し、quorumserverを作成する場合は、マップに応じて適切なサーバーの種類に置か
3は、「グループ」、そのグループ内のコンフィギュレーション・サーバ、および次の分析のgroupId SERVERID、numGroupsグループカウンタを1インクリメントし、対応するマップに配置されているで始まる場合
に記載されている「重量」で始まる場合4.重量値SERVERIDと右を解析し、コンフィギュレーションサーバの重み、および、対応する地図へ
5.それは、この値の公表及びキャッシュ解析し、「バージョン」で始まる場合
1.のサーバーの重みのデフォルト値に設定されていない重量与え6.
7.計算サーバ重量の右のグループは、重いサーバグループの重みが0であれば、そのグループは数え投票に参加しない、カウンターはnumGroupsをデクリメント
で投票するかどうかを決定
public boolean containsQuorum(Set<Long> set){
HashMap<Long, Long> expansion = new HashMap<Long, Long>();
/*
* Adds up weights per group
*/
if(set.size() == 0) return false;
else LOG.debug("Set size: " + set.size());
for(long sid : set){
Long gid = serverGroup.get(sid);
if (gid == null) continue;
if(!expansion.containsKey(gid))
expansion.put(gid, serverWeight.get(sid));
else {
long totalWeight = serverWeight.get(sid) + expansion.get(gid);
expansion.put(gid, totalWeight);
}
}
/*
* Check if all groups have majority
*/
int majGroupCounter = 0;
for (Entry<Long, Long> entry : expansion.entrySet()) {
Long gid = entry.getKey();
LOG.debug("Group info: {}, {}, {}", entry.getValue(), gid, groupWeight.get(gid));
if (entry.getValue() > (groupWeight.get(gid) / 2))
majGroupCounter++;
}
LOG.debug("Majority group counter: {}, {}", majGroupCounter, numGroups);
if ((majGroupCounter > (numGroups / 2))){
LOG.debug("Positive set size: {}", set.size());
return true;
} else {
LOG.debug("Negative set size: {}", set.size());
return false;
}
}
次のように解釈:
1.を重み値のACK送信したサーバに蓄積された計算
groupWeight次いで数は投票によって設定され、より多くのそれの半分よりもあれば設定された重み値を対応する重み2決意ステップ得る重み値プラス
の半分以上のグループカウンタnumGroups場合は半分以上、それは投票の現在のラウンドを言った場合、投票するグループの数によって判断3.
コントラストの投票の重みで投票過半数
言葉をクラスタ化するために、サービスの後、9 ZooKeeperの正常な動作、それはバリデータの多数決に基づいている場合、共有設定のコントラストを行う資料の冒頭に乗り(9/2 + 1)が必要である前に、実行中の5のZooKeeperサービスですラインが、重量に基づいて、その後、あなただけのそれぞれ持っている2つのサーバー、つまり、4つのZooKeeperクラスタサービスが正常に動作していることを保証することができますすることができ、正常に動作し、通常の動作2つのグループを切断する必要があります