在閘道器系統的實現中,需要提供對session一致性的支援,而閘道器系統通過hash一致性來支援session一致性。
一致性雜湊實現的難點在於一是需要讓key盡量分別均勻,二是需要考慮到目標節點動態變化的情況。
一 雜湊環實現
參考rpc框架中kitc 客戶端雜湊一致性的實現:
負責雜湊一致性的負載類實現
type keyfunc func
(ctx context.context, req inte***ce)(
string
,error
)type consistbalancer struct
picker 選擇器實現:
func
(cb *consistbalancer)
newpicker
(ctx context.context, req inte***ce
, key string
, instances [
]*discovery.instance) picker
intlist := cb.
search
(hash
(hashkey))if
len(intlist)==0
return
&consistbalancepicker
}func
(cb *consistbalancer)
search
(hashcode uint64)[
]*discovery.instance ,0
,3) cb.lock.
rlock()
defer cb.lock.
rulock()
index := sort.
search
(len
(cb.sortedhash)
,func
(x int
)bool
)if index ==
len(cb.sortedhash)
for i =
0; i<
len(sortedhash)
; i++
dup[key]
=struct
results =
(results, ins)
index =
(index +1)
%len
(cb.sortedhash)
iflen
(results)==3
}return results
}type consistbalancepicker struct
func
(cbp *consistbalancepicker)
pick()
(*discovery.instance,
bool
) ret := cbp.inslist[0]
cbp.inslist = cbp.inslist[1:
]return ret,
true
}
節點資訊更新實現:
func
(cb *consistbalancer)
rebalance
(key string
, inslist [
]*discovery.instance)
cb.lock.
rlock()
oldinslist = cb.instanceinfo[key]
cb.lock.
runlock()
iflen
(inslist)
==len
(oldinslist)
,len
(inslist)
,make
(map
[string
]struct
,len
(inslist)
for_
, ins :=
range inslist
}for
_, ins :=
range oldlist }if
len(newmap)
==len
(oldmap)
}return}}
dorebalane :
cb.rebalance
(key, inslist)
}func
(cb *consistbalancer)
rebalance
(key string
, inslist [
]*discovery.instance)
sortedhash :=
make([
]uint64,0
, totallen*cb.replicas)
hash2ins :=
make
(map
[uint64
]*discovery.instance,totallen*cb.replicas)
for_
, inslist :=
range cb.instanceinfo }}
sort.
slice
(sortedhash,
func
(i, j int
)bool
cb.hash2ins = hash2ins
cb.sortedhash = sortedhash
cb.lock.
unlock()
}func
instancekey
(ins *discovery.instance)
string
func
hash
(key string
)uint64
二 谷歌雜湊一致性演算法
具體可以參考:
谷歌雜湊一致性演算法
實現方式:
var defaulthasher hash.hash64 = crc64.
new(crc64.
maketable
(crc64.ecma)
)func
hash
(key uint64
, buckets int32
)int32
for j<
int64
(buckets)
return
int32
(b)}
// key為string時呼叫的方法
func hashstring (key string
, buckets int32
)int32
func
hashstringwithhasher
(key string
, buckets int32
, hasher hash.hash64)
int32
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...