国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【負(fù)載均衡——一致性哈希算法】

這篇具有很好參考價(jià)值的文章主要介紹了【負(fù)載均衡——一致性哈希算法】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.一致性哈希是什么

一致性哈希算法就很好地解決了分布式系統(tǒng)在擴(kuò)容或者縮容時(shí),發(fā)生過多的數(shù)據(jù)遷移的問題。

一致哈希算法也用了取模運(yùn)算,但與哈希算法不同的是,哈希算法是對(duì)節(jié)點(diǎn)的數(shù)量進(jìn)行取模運(yùn)算,而一致哈希算法是對(duì) 2^32 進(jìn)行取模運(yùn)算,是一個(gè)固定的值。

一致性哈希要進(jìn)行兩步哈希:
第一步:對(duì)存儲(chǔ)節(jié)點(diǎn)進(jìn)行哈希計(jì)算,也就是對(duì)存儲(chǔ)節(jié)點(diǎn)做哈希映射,比如根據(jù)節(jié)點(diǎn)的 IP 地址進(jìn)行哈希;
第二步:當(dāng)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)或訪問時(shí),對(duì)數(shù)據(jù)進(jìn)行哈希映射;

一致性哈希是指將【存儲(chǔ)節(jié)點(diǎn)】和【數(shù)據(jù)】都映射到一個(gè)首尾相連的哈希環(huán)上。
【負(fù)載均衡——一致性哈希算法】,負(fù)載均衡,哈希算法,運(yùn)維

  • 首先,對(duì)key進(jìn)行哈希計(jì)算,確定此key在換上的位置
  • 然后,從這個(gè)位置沿著順時(shí)針方向走,遇到的第一節(jié)點(diǎn)就上存儲(chǔ)key的節(jié)點(diǎn)

2. 使用的場(chǎng)景是什么

在負(fù)載均衡問題中,不同的負(fù)載均衡算法,對(duì)應(yīng)的就是不同的分配策略,適應(yīng)的業(yè)務(wù)場(chǎng)景也不同。

  • 最簡(jiǎn)單的方式,引入一個(gè)中間的負(fù)載均衡層,讓它將外界的請(qǐng)求「輪流」的轉(zhuǎn)發(fā)給內(nèi)部的集群。
  • 考慮到每個(gè)節(jié)點(diǎn)的硬件配置有所區(qū)別,我們可以引入權(quán)重值,將硬件配置更好的節(jié)點(diǎn)的權(quán)重值設(shè)高,然后根據(jù)各個(gè)節(jié)點(diǎn)的權(quán)重值,按照一定比重分配在不同的節(jié)點(diǎn)上,讓硬件配置更好的節(jié)點(diǎn)承擔(dān)更多的請(qǐng)求,這種算法叫做加權(quán)輪詢。
    【負(fù)載均衡——一致性哈希算法】,負(fù)載均衡,哈希算法,運(yùn)維

但是,加權(quán)輪詢算法是無法應(yīng)對(duì)「分布式系統(tǒng)(數(shù)據(jù)分片的系統(tǒng))」的,因?yàn)榉植际较到y(tǒng)中,每個(gè)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)是不同的。

比如一個(gè)分布式 KV(key-valu) 緩存系統(tǒng),某個(gè) key 應(yīng)該到哪個(gè)或者哪些節(jié)點(diǎn)上獲得,應(yīng)該是確定的,不是說任意訪問一個(gè)節(jié)點(diǎn)都可以得到緩存結(jié)果的。

3. 使用哈希算法的問題

哈希算法能夠?qū)ν粋€(gè)關(guān)鍵字進(jìn)行哈希計(jì)算,每次計(jì)算都是相同的值,這樣就可以將某個(gè)key確定到一個(gè)節(jié)點(diǎn)了,可以滿足分布式系統(tǒng)的負(fù)載均衡需求。

存在的致命問題:如果節(jié)點(diǎn)數(shù)量發(fā)生了變化,也就是在對(duì)系統(tǒng)做擴(kuò)容或者縮容時(shí),必須遷移改變了映射關(guān)系的數(shù)據(jù),否則會(huì)出現(xiàn)查詢不到數(shù)據(jù)的問題。

要解決這個(gè)問題的辦法,就需要我們進(jìn)行遷移數(shù)據(jù),比如節(jié)點(diǎn)的數(shù)量從 3 變化為 4 時(shí),要基于新的計(jì)算公式 hash(key) % 4 ,重新對(duì)數(shù)據(jù)和節(jié)點(diǎn)做映射。

假設(shè)總數(shù)據(jù)條數(shù)為 M,哈希算法在面對(duì)節(jié)點(diǎn)數(shù)量變化時(shí),最壞情況下所有數(shù)據(jù)都需要遷移,所以它的數(shù)據(jù)遷移規(guī)模是 O(M),這樣數(shù)據(jù)的遷移成本太高了。

4.一致性哈希算法進(jìn)階

4.1 一致性哈希算法存在的問題

一致性哈希算法并不保證節(jié)點(diǎn)能夠在哈希環(huán)上分布均勻,這樣就會(huì)帶來一個(gè)問題,會(huì)有大量的請(qǐng)求集中在一個(gè)節(jié)點(diǎn)上。
【負(fù)載均衡——一致性哈希算法】,負(fù)載均衡,哈希算法,運(yùn)維
上圖中如果節(jié)點(diǎn) A 被移除了,當(dāng)節(jié)點(diǎn) A 宕機(jī)后,根據(jù)一致性哈希算法的規(guī)則,其上數(shù)據(jù)應(yīng)該全部遷移到相鄰的節(jié)點(diǎn) B 上,這樣,節(jié)點(diǎn) B 的數(shù)據(jù)量、訪問量都會(huì)迅速增加很多倍,一旦新增的壓力超過了節(jié)點(diǎn) B 的處理能力上限,就會(huì)導(dǎo)致節(jié)點(diǎn) B 崩潰,進(jìn)而形成雪崩式的連鎖反應(yīng)。

所以,一致性哈希算法雖然減少了數(shù)據(jù)遷移量,但是存在節(jié)點(diǎn)分布不均勻的問題。

4.2 通過虛擬節(jié)點(diǎn)提高均衡度

要想解決節(jié)點(diǎn)能在哈希環(huán)上分配不均勻的問題,就是要有大量的節(jié)點(diǎn),節(jié)點(diǎn)數(shù)越多,哈希環(huán)上的節(jié)點(diǎn)分布的就越均勻。

但問題是,實(shí)際中我們沒有那么多節(jié)點(diǎn)。所以這個(gè)時(shí)候我們就加入虛擬節(jié)點(diǎn),也就是對(duì)一個(gè)真實(shí)節(jié)點(diǎn)做多個(gè)副本。

具體做法是,不再將真實(shí)節(jié)點(diǎn)映射到哈希環(huán)上,而是將虛擬節(jié)點(diǎn)映射到哈希環(huán)上,并將虛擬節(jié)點(diǎn)映射到實(shí)際節(jié)點(diǎn),所以這里有「兩層」映射關(guān)系。

比如對(duì)每個(gè)節(jié)點(diǎn)分別設(shè)置 3 個(gè)虛擬節(jié)點(diǎn):

對(duì)節(jié)點(diǎn) A 加上編號(hào)來作為虛擬節(jié)點(diǎn):A-01、A-02、A-03
對(duì)節(jié)點(diǎn) B 加上編號(hào)來作為虛擬節(jié)點(diǎn):B-01、B-02、B-03
對(duì)節(jié)點(diǎn) C 加上編號(hào)來作為虛擬節(jié)點(diǎn):C-01、C-02、C-03
引入虛擬節(jié)點(diǎn)后,原本哈希環(huán)上只有 3 個(gè)節(jié)點(diǎn)的情況,就會(huì)變成有 9 個(gè)虛擬節(jié)點(diǎn)映射到哈希環(huán)上,哈希環(huán)上的節(jié)點(diǎn)數(shù)量多了 3 倍。

【負(fù)載均衡——一致性哈希算法】,負(fù)載均衡,哈希算法,運(yùn)維
節(jié)點(diǎn)數(shù)量多了后,節(jié)點(diǎn)在哈希環(huán)上的分布就相對(duì)均勻了。這時(shí)候,如果有訪問請(qǐng)求尋址到「A-01」這個(gè)虛擬節(jié)點(diǎn),接著再通過「A-01」虛擬節(jié)點(diǎn)找到真實(shí)節(jié)點(diǎn) A,這樣請(qǐng)求就能訪問到真實(shí)節(jié)點(diǎn) A 了。

總結(jié)

  • 一個(gè)真實(shí)節(jié)點(diǎn)對(duì)應(yīng)N個(gè)虛擬節(jié)點(diǎn)
  • 一個(gè)虛擬節(jié)點(diǎn)對(duì)應(yīng)N個(gè)key

5. 代碼實(shí)現(xiàn)

下面是用go實(shí)現(xiàn)的代碼:

import (
	"hash/crc32"
	"sort"
	"strconv"
)

// Hash map bytes to uint32
type Hash func(data []byte) uint32

// 包含所有的hashed keys
type Map struct {
	hash     Hash           //Hash 函數(shù)
	replicas int            //虛擬節(jié)點(diǎn)倍數(shù)
	keys     []int          //虛擬節(jié)點(diǎn)的哈希環(huán)
	hashMap  map[int]string //虛擬節(jié)點(diǎn)與真實(shí)節(jié)點(diǎn)的映射表,鍵是虛擬節(jié)點(diǎn)的哈希值,值是真實(shí)節(jié)點(diǎn)的名稱。
}

// New create a Map instance
func New(replicas int, fn Hash) *Map {
	m := &Map{
		replicas: replicas,
		hash:     fn,
		hashMap:  make(map[int]string),
	}
	if m.hash == nil {
		m.hash = crc32.ChecksumIEEE
	}
	return m
}

func (m *Map) Add(keys ...string) {
	for _, key := range keys {
		for i := 0; i < m.replicas; i++ {
			// 虛擬節(jié)點(diǎn)在哈希環(huán)上的hash值
			hash := int(m.hash([]byte(strconv.Itoa(i) + key)))
			m.keys = append(m.keys, hash)
			// 虛擬節(jié)點(diǎn)和真實(shí)節(jié)點(diǎn)的映射
			m.hashMap[hash] = key
		}
	}
	sort.Ints(m.keys)
}

func (m *Map) Get(key string) string {
	if len(m.keys) == 0 {
		return ""
	}
	// 要查詢的key的hash
	hash := int(m.hash([]byte(key)))
	// 找到最近的虛擬節(jié)點(diǎn)對(duì)應(yīng)的下標(biāo)idx
	idx := sort.Search(len(m.keys), func(i int) bool {
		return m.keys[i] >= hash
	})
	//順時(shí)針找到第一個(gè)匹配的虛擬節(jié)點(diǎn)的下標(biāo) idx,從 m.keys 中獲取到對(duì)應(yīng)的哈希值。如果 idx == len(m.keys),說明應(yīng)選擇 m.keys[0],因?yàn)?m.keys 是一個(gè)環(huán)狀結(jié)構(gòu),所以用取余數(shù)的方式來處理這種情況。
	//m.keys[idx%len(m.keys)]獲得虛擬節(jié)點(diǎn)的hash
	//根據(jù)虛擬節(jié)點(diǎn)的hash值獲取真實(shí)節(jié)點(diǎn)
	return m.hashMap[m.keys[idx%len(m.keys)]]
}

6.總結(jié)

一致性哈希是指將「存儲(chǔ)節(jié)點(diǎn)」和「數(shù)據(jù)」都映射到一個(gè)首尾相連的哈希環(huán)上,如果增加或者移除一個(gè)節(jié)點(diǎn),僅影響該節(jié)點(diǎn)在哈希環(huán)上順時(shí)針相鄰的后繼節(jié)點(diǎn),其它數(shù)據(jù)也不會(huì)受到影響。

但是一致性哈希算法不能夠均勻的分布節(jié)點(diǎn),會(huì)出現(xiàn)大量請(qǐng)求都集中在一個(gè)節(jié)點(diǎn)的情況,在這種情況下進(jìn)行容災(zāi)與擴(kuò)容時(shí),容易出現(xiàn)雪崩的連鎖反應(yīng)。

為了解決一致性哈希算法不能夠均勻的分布節(jié)點(diǎn)的問題,就需要引入虛擬節(jié)點(diǎn),對(duì)一個(gè)真實(shí)節(jié)點(diǎn)做多個(gè)副本。不再將真實(shí)節(jié)點(diǎn)映射到哈希環(huán)上,而是將虛擬節(jié)點(diǎn)映射到哈希環(huán)上,并將虛擬節(jié)點(diǎn)映射到實(shí)際節(jié)點(diǎn),所以這里有「兩層」映射關(guān)系。

引入虛擬節(jié)點(diǎn)后,可以會(huì)提高節(jié)點(diǎn)的均衡度,還會(huì)提高系統(tǒng)的穩(wěn)定性。所以,帶虛擬節(jié)點(diǎn)的一致性哈希方法不僅適合硬件配置不同的節(jié)點(diǎn)的場(chǎng)景,而且適合節(jié)點(diǎn)規(guī)模會(huì)發(fā)生變化的場(chǎng)景。文章來源地址http://www.zghlxwxcb.cn/news/detail-847043.html

到了這里,關(guān)于【負(fù)載均衡——一致性哈希算法】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 區(qū)塊鏈:哈希算法與一致性哈希算法

    本篇主要介紹區(qū)塊鏈中常用到的哈希算法。 1 哈希算法 1.1 定義及特性 ??哈希算法是指通過哈希函數(shù)(Hash Function)對(duì)任意長(zhǎng)度的輸入數(shù)據(jù)(比如文件、消息、數(shù)字等)進(jìn)行轉(zhuǎn)換,生成一個(gè)固定長(zhǎng)度的哈希值(Hash Value)的過程。 ??在區(qū)塊鏈中,哈希算法常用于區(qū)塊驗(yàn)證及安全性保

    2024年02月17日
    瀏覽(22)
  • 談?wù)勔恢滦怨K惴? decoding=
  • 07. 算法之一致性哈希算法介紹

    07. 算法之一致性哈希算法介紹

    哈希算法在程序開發(fā)中的很多地方都能看到他的身影,但是哈希有他的局限性,比如如果兩個(gè)key哈希到同一個(gè)位置的時(shí)候,此時(shí)就不好處理。本節(jié)我們介紹一下常規(guī)處理方式。 哈希算法將任意長(zhǎng)度的二進(jìn)制值映射為較短的固定長(zhǎng)度的二進(jìn)制值,這個(gè)小的二進(jìn)制值稱為哈希值。

    2024年02月06日
    瀏覽(24)
  • Python小知識(shí) - 一致性哈希算法

    Python小知識(shí) - 一致性哈希算法

    一致性哈希算法 一致性哈希算法(Consistent Hashing Algorithm)是用于解決分布式系統(tǒng)中節(jié)點(diǎn)增減比較頻繁的問題。它的思想是,將數(shù)據(jù)映射到0~2^64-1的哈??臻g中,并通過哈希函數(shù)對(duì)數(shù)據(jù)進(jìn)行映射,計(jì)算出數(shù)據(jù)所在的節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)增加或減少時(shí),只需要重新計(jì)算數(shù)據(jù)所在的節(jié)點(diǎn)即

    2024年02月09日
    瀏覽(17)
  • 一致性哈希算法優(yōu)勢(shì)在哪?如何實(shí)現(xiàn)?

    1.1 簡(jiǎn)介Hash 哈希算法即散列算法,是一種從任意文件中創(chuàng)造小的數(shù)字「指紋」的方法。與指紋一樣,散列算法就是一種以較短的信息來保證文件唯一性的標(biāo)志,這種標(biāo)志與文件的每一個(gè)字節(jié)都相關(guān),而且難以找到逆向規(guī)律。因此,當(dāng)原有文件發(fā)生改變時(shí),其標(biāo)志值也會(huì)發(fā)生改

    2024年02月03日
    瀏覽(34)
  • Redis擴(kuò)容機(jī)制與一致性哈希算法解析

    在分布式系統(tǒng)設(shè)計(jì)中,Redis是一個(gè)備受歡迎的內(nèi)存數(shù)據(jù)庫,而一致性哈希算法則是分布式系統(tǒng)中常用的數(shù)據(jù)分片和負(fù)載均衡技術(shù)。本文將深入探討Redis的擴(kuò)容機(jī)制以及一致性哈希算法的原理,同時(shí)提供示例代碼以幫助讀者更好地理解這兩個(gè)重要概念。 Redis是一種高性能的內(nèi)存數(shù)

    2024年02月11日
    瀏覽(42)
  • 什么是一致性哈希?一致性哈希是如何工作的?如何設(shè)計(jì)一致性哈希?

    如果你有 n 個(gè)緩存服務(wù)器,一個(gè)常見的負(fù)載均衡方式是使用以下的哈希方法: 服務(wù)器索引 = 哈希(鍵) % N ,其中 N 是服務(wù)器池的大小。 讓我們通過一個(gè)例子來說明這是如何工作的。如表5-1所示,我們有4臺(tái)服務(wù)器和8個(gè)字符串鍵及其哈希值。 為了獲取存儲(chǔ)某個(gè)鍵的服務(wù)器,我們

    2024年02月06日
    瀏覽(32)
  • Sharding-JDBC 自定義一致性哈希算法 + 虛擬節(jié)點(diǎn) 實(shí)現(xiàn)數(shù)據(jù)庫分片策略

    分片操作是分片鍵 + 分片算法,也就是分片策略。目前Sharding-JDBC 支持多種分片策略: 標(biāo)準(zhǔn)分片策略 對(duì)應(yīng)StandardShardingStrategy。提供對(duì)SQL語句中的=, IN和BETWEEN AND的分片操作支持。 復(fù)合分片策略 對(duì)應(yīng)ComplexShardingStrategy。復(fù)合分片策略。提供對(duì)SQL語句中的=, IN和BETWEEN AND的分片操作

    2024年02月02日
    瀏覽(93)
  • 【分布式】一致性哈希和哈希槽

    【分布式】一致性哈希和哈希槽

    當(dāng)我們擁有了多臺(tái)存儲(chǔ)服務(wù)器之后,現(xiàn)在有多個(gè)key,希望可以將這些個(gè)key均勻的緩存到這些服務(wù)器上,可以使用哪些方案呢? 1.1 直接哈希取模 這是一種最容易想到的方法,使用取模算法hash(key)% N,對(duì)key進(jìn)行hash運(yùn)算后取模,N是機(jī)器的數(shù)量。key進(jìn)行hash后的結(jié)果對(duì)3取模,得

    2024年02月03日
    瀏覽(28)
  • 一致性哈希(哈希環(huán))解決數(shù)據(jù)分布問題

    哈希算法是程序開發(fā)過程中最廣泛接觸到的的算法之一,典型的應(yīng)用有安全加密、數(shù)據(jù)校驗(yàn)、唯一標(biāo)識(shí)、散列函數(shù)、負(fù)載均衡、數(shù)據(jù)分片、分布式存儲(chǔ)。前些天遇到用一致性哈希(哈希環(huán))的場(chǎng)景,不過我細(xì)想一下,對(duì)這個(gè)知識(shí)點(diǎn)好像了解過,但是又沒太深印象,說不出具體

    2024年02月04日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包