背景:分布式儲存系統裡,檔案是分塊儲存的,如果每個檔案塊是1m,那麼1g的檔案就會有1024個檔案塊。系統需要為每個檔案塊分配合適的儲存節點,這個過程我們稱為選舉。
問題:如果為每乙個檔案塊都選舉一次,那麼1g的檔案需要選舉1024次,這樣對系統要求較高,耗時較長。但如果為1024個檔案塊選舉一次,那麼會導致檔案分布不均勻,同時如果儲存節點沒有足夠的空間,會導致選舉失敗。
解決思路:預設按64m選舉,如每個檔案塊為1m,則64個檔案塊分布在相同的儲存節點上。如選舉因空間不足導致失敗,則減少選舉檔案大小64->32->16->8,直到無法減少。
int allotpagestorelist(
const list& page_tag_info_list, //檔案塊列表
const uint32_t replica_factor, //需要的副本數
list& page_forward_nodes_info_list, //選舉出來的儲存節點
uint32_t& max_allot_size) //每次選舉的檔案大小(64m)
//直到本次選舉的檔案大小達到要求,或檔案塊已選舉完,則開始選舉
status = root_service_.getnodemanager()->allotstorenode(allot_size,node_list,replica_factor);
//如因儲存空間不足導致失敗,則將選舉的檔案大小減半,遞迴選舉
if(error_disk_full == status)
max_allot_size = max_allot_size / 2; //將選舉的檔案大小減半
listallot_page_forward_nodes_info_list;
status = allotpagestorelist(allot_page_list,replica_factor,allot_page_forward_nodes_info_list,max_allot_size); //遞迴選舉
//直到選舉成功
if(status != btq_error_success)
if((allot_page_list.size() != allot_page_forward_nodes_info_list.size())) //如果選舉出來的檔案塊數量不對,則認為失敗
//將選舉好的檔案塊->儲存節點的資訊與需要返回的合併
page_forward_nodes_info_list.splice(page_forward_nodes_info_list.end(),allot_page_forward_nodes_info_list);
}else if(error_success == status)
} else
allot_size = 0; //選舉的檔案大小歸零
allot_page_list.clear(); //清空檔案塊列表
} if((page_tag_info_list.size() != page_forward_nodes_info_list.size()))
return status;
}
Zookeeper實現Master選舉(哨兵機制)
master選舉使用場景及結構 現在很多時候我們的服務需要7 24小時工作,假如一台機器掛了,我們希望能有其它機器頂替它繼續工作。此類問題現在多採用master salve模式,也就是常說的主從模式,正常情況下主機提供服務,備機負責監聽主機狀態,當主機異常時,可以自動切換到備機繼續提供服務 這裡有點...
Kafka Leader的選舉機制
size large color red b kafka的leader是什麼 b color size 首先kafka會將接收到的訊息分割槽 partition b 每個主題 topic 的訊息有不同的分割槽。b 這樣一方面訊息的儲存就不會受到單一伺服器儲存空間大小的限制,另一方面訊息的處理也可以在...
zookeeper的集群選舉
集群選舉型別 全新集群選舉與非全新集群選舉。全新集群選舉 假設現在有5臺伺服器均沒有資料,它們的編號分別是1,2,3,4,5,按編號依次啟動。過程如下 1.伺服器 1 啟動,給自己投票,然後發投票資訊給其他伺服器,由於其他伺服器沒有啟動,所以它收不到反饋資訊,但是由於投票還沒有到達半數 伺服器 1 ...