Ketama 是一種廣泛用於分佈式系統(如 Memcached 客戶端)的一致性哈希算法實現。它將服務器節點映射到一個虛擬環(Continuum)上,通過哈希值決定鍵值對應的節點,實現節點增減時只有少量鍵需要遷移,極大降低遷移成本。
提供的測試代碼展示了 libketama 的標準使用流程:
ketama.servers 文件加載節點列表(格式:IP:PORT WEIGHT)ketama_roll() 根據權重將節點在環上均勻分佈(每個節點對應 160 個虛擬點)ketama_error() 返回構建過程中的錯誤信息"0"~"9" 計算哈希值(ketama_hashi()),通過 ketama_get_server() 找到對應節點ketama_smoke() 銷毀 Continuum#include <ketama.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc == 1) {
printf("Usage: %s <ketama.servers file>\n", argv[0]);
return 1;
}
ketama_continuum c;
ketama_roll(&c, argv[1]); // 構建環
printf("%s\n", ketama_error()); // 輸出錯誤信息(若有)
for (int i = 0; i < 10; ++i) {
char key[10];
sprintf(key, "%d", i); // 測試鍵 "0"~"9"
unsigned int hash = ketama_hashi(key);
mcs *server = ketama_get_server(key, c); // 路由查詢
printf("%u %u %s\n", hash, server->point, server->ip);
}
ketama_smoke(c); // 釋放資源
return 0;
}
ketama_continuum:封裝了排序後的虛擬節點數組(point 為哈希值,ip 為服務器地址)mcs (memcached server):包含 ip、port、point 等字段IP:PORT WEIGHT,權重越大分得的虛擬節點越多ketama_roll 構建後的 Continuum 為只讀,多線程查詢無需鎖這段代碼是理解並驗證 libketama 行為的最小樣本。實際生產環境中,通常將其封裝為連接池組件,配合服務發現機制動態更新 Continuum,實現無縫擴縮容。掌握 Ketama 的核心原理與 API 用法,是構建高可用分佈式緩存層的必修課。