一致性雜湊的實現

2021-09-29 02:31:15 字數 3512 閱讀 5036

在閘道器系統的實現中,需要提供對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環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...