一致性hash算法php開源陸陸續(xù)續(xù)服務(wù)器模式存在一個(gè)問題:節(jié)點(diǎn)故障后服務(wù)才恢復(fù)hashcode hash算法
2022-08-19
在服務(wù)開發(fā)中,單機(jī)會(huì)有單點(diǎn)故障,如果服務(wù)部署在服務(wù)器上,一旦服務(wù)器宕機(jī),服務(wù)將不可用。因此,為了使服務(wù)高可用,出現(xiàn)了分布式服務(wù)。同一個(gè)服務(wù)部署在多臺(tái)機(jī)器上,即使多臺(tái)服務(wù)器宕機(jī)一致性hash算法php開源,只要一臺(tái)服務(wù)器可用,服務(wù)就可用。
同樣如此。為了解決單機(jī)故障,引入了主從模式,但是主從模式存在一個(gè)問題:節(jié)點(diǎn)出現(xiàn)故障后,需要手動(dòng)切換服務(wù)到節(jié)點(diǎn)才能服務(wù)恢復(fù)。為了解決這個(gè)問題,引入了哨兵模式。哨兵模式可以在節(jié)點(diǎn)故障后自動(dòng)將節(jié)點(diǎn)升級(jí)為節(jié)點(diǎn),無(wú)需人工干預(yù)即可恢復(fù)服務(wù)。
但是,主從模式和哨兵模式還沒有達(dá)到真正的數(shù)據(jù)存儲(chǔ),每個(gè)實(shí)例都存儲(chǔ)了全量的數(shù)據(jù),因此誕生并實(shí)現(xiàn)了真正的數(shù)據(jù)分片存儲(chǔ)。不過由于發(fā)布比較晚(2015年正式版發(fā)布),各大廠迫不及待,紛紛開發(fā)了自己的數(shù)據(jù)分片集群模型,如:等。
1.主從模式
雖然單個(gè)節(jié)點(diǎn)可以通過RDB和AOF的持久化機(jī)制將數(shù)據(jù)持久化到硬盤,但是數(shù)據(jù)是存儲(chǔ)在服務(wù)器上的。如果服務(wù)器出現(xiàn)硬盤故障或其他問題,將導(dǎo)致數(shù)據(jù)不可用,讀寫無(wú)法分離,讀寫都在同一臺(tái)服務(wù)器上。當(dāng)請(qǐng)求量很大時(shí),就會(huì)出現(xiàn) I/O 瓶頸。
為了避免單點(diǎn)故障和讀寫不分離,提供()函數(shù),實(shí)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)更新后,更新后的數(shù)據(jù)會(huì)自動(dòng)同步到其他數(shù)據(jù)庫(kù)。
以上主從結(jié)構(gòu)特點(diǎn):一個(gè)可以有多個(gè)節(jié)點(diǎn);節(jié)點(diǎn)可以有節(jié)點(diǎn),從節(jié)點(diǎn)是級(jí)聯(lián)結(jié)構(gòu)。
主從模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):主從結(jié)構(gòu)具有讀寫分離、提高效率、數(shù)據(jù)備份、提供多副本等優(yōu)點(diǎn)。
不足:最大的缺點(diǎn)是主從模式?jīng)]有自動(dòng)容錯(cuò)和恢復(fù)功能。如果主節(jié)點(diǎn)出現(xiàn)故障,集群就無(wú)法工作,可用性比較低。從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)需要人工干預(yù)。
普通主從模式,當(dāng)主庫(kù)崩潰時(shí),需要手動(dòng)切換從庫(kù)成為主庫(kù):
在從庫(kù)中使用NO ONE命令將數(shù)據(jù)庫(kù)提升到主庫(kù)繼續(xù)服務(wù)。
啟動(dòng)之前崩潰的主庫(kù),然后使用命令將其設(shè)置為新主庫(kù)的從庫(kù)進(jìn)行數(shù)據(jù)同步。
2.哨兵模式
第一種主從同步/復(fù)制模式,當(dāng)主服務(wù)器宕機(jī)時(shí),需要手動(dòng)將一臺(tái)從服務(wù)器切換為主服務(wù)器,需要人工干預(yù),費(fèi)力費(fèi)力,而且會(huì)導(dǎo)致服務(wù)在一段時(shí)間內(nèi)無(wú)法使用。 ,這時(shí)候就需要哨兵模式了。
哨兵模式是從2.6版本開始提供的,但是當(dāng)時(shí)這個(gè)版本的模式不穩(wěn)定,直到2.8版本才穩(wěn)定。
哨兵模式的核心還是主從復(fù)制,但是在主節(jié)點(diǎn)宕機(jī)無(wú)法寫入的情況下,相比主從模式,多了一個(gè)選舉機(jī)制:一個(gè)新的主節(jié)點(diǎn)從所有從節(jié)點(diǎn)中選出。選舉機(jī)制的實(shí)現(xiàn)依賴于在系統(tǒng)中啟動(dòng)一個(gè)進(jìn)程。
如上圖所示,本身也存在單點(diǎn)故障的問題,所以在一個(gè)主多從的系統(tǒng)中,可以使用多個(gè)進(jìn)行監(jiān)控。監(jiān)視器。每個(gè)哨兵都是一個(gè)獨(dú)立的進(jìn)程,作為一個(gè)進(jìn)程,它會(huì)獨(dú)立運(yùn)行。
(1)哨兵模式的作用:
監(jiān)控所有服務(wù)器是否正常運(yùn)行:發(fā)送命令返回監(jiān)控服務(wù)器運(yùn)行狀態(tài),主從服務(wù)器進(jìn)程監(jiān)控,哨兵之間相互監(jiān)控。
:當(dāng)哨兵檢測(cè)到宕機(jī)時(shí),會(huì)自動(dòng)切換到它,然后通過發(fā)布-訂閱的方式通知其他從服務(wù)器,修改配置文件,讓他們切換。同時(shí),有問題的老主人也會(huì)成為新主人的奴隸,也就是說,當(dāng)老主人恢復(fù)時(shí),它不會(huì)恢復(fù)原來(lái)的主人身份,而是會(huì)充當(dāng)新主人的奴隸。 .
(2)哨兵實(shí)現(xiàn)原理
哨兵啟動(dòng)進(jìn)程時(shí),會(huì)讀取配置文件的內(nèi)容,通過如下配置找到要監(jiān)控的主庫(kù):
-name ip 端口
#-name 是主數(shù)據(jù)庫(kù)的名稱
#ip和port是當(dāng)前主庫(kù)地址和端口號(hào)
# 表示在執(zhí)行故障轉(zhuǎn)移操作之前需要多少個(gè)哨兵節(jié)點(diǎn)同意。
這里之所以只需要連接主節(jié)點(diǎn),是通過主節(jié)點(diǎn)的info命令獲取從節(jié)點(diǎn)信息,從而與從節(jié)點(diǎn)建立連接,同時(shí),通過主節(jié)點(diǎn)的info信息可以知道新的從節(jié)點(diǎn)的信息。 .
一個(gè)哨兵節(jié)點(diǎn)可以監(jiān)控多個(gè)主節(jié)點(diǎn),但不建議這樣做,因?yàn)楫?dāng)一個(gè)哨兵節(jié)點(diǎn)崩潰時(shí),多個(gè)集群切換會(huì)同時(shí)失效。 啟動(dòng)后,與主數(shù)據(jù)庫(kù)建立兩個(gè)連接。
訂閱主數(shù)據(jù)庫(kù):獲取有關(guān)監(jiān)視數(shù)據(jù)庫(kù)的哨兵節(jié)點(diǎn)信息的通道
定期向數(shù)據(jù)庫(kù)發(fā)送info命令,獲取數(shù)據(jù)庫(kù)本身的信息。
與主庫(kù)建立連接后,會(huì)定期執(zhí)行以下三個(gè)操作:
(1)每隔10s發(fā)送一次info命令,作用是獲取當(dāng)前數(shù)據(jù)庫(kù)信息,比如發(fā)現(xiàn)新的節(jié)點(diǎn)時(shí),會(huì)建立連接并加入監(jiān)控列表.當(dāng)主從數(shù)據(jù)庫(kù)的角色發(fā)生變化時(shí)更新信息。
(2)每隔2s發(fā)送自己的信息到主從數(shù)據(jù)庫(kù)的。作用是把自己的監(jiān)控?cái)?shù)據(jù)分享給。每個(gè)都會(huì)訂閱: ,當(dāng)其他哨兵收到消息后,會(huì)判斷該哨兵是否為新哨兵,如果是,則將其加入哨兵列表并建立連接。
(3)每隔1s向所有主從節(jié)點(diǎn)和所有哨兵節(jié)點(diǎn)發(fā)送ping命令,監(jiān)控節(jié)點(diǎn)是否存活。
(3)主觀客觀離線
當(dāng)哨兵節(jié)點(diǎn)發(fā)送ping命令時(shí),經(jīng)過一定時(shí)間(down--),如果節(jié)點(diǎn)沒有回復(fù),哨兵認(rèn)為主觀下線。主觀下線是指當(dāng)前哨兵認(rèn)為節(jié)點(diǎn)已經(jīng)宕機(jī)。如果節(jié)點(diǎn)是主庫(kù), 會(huì)進(jìn)一步判斷故障轉(zhuǎn)移就夠了。此時(shí)會(huì)發(fā)送命令(is--down-by-addr)詢問其他哨兵節(jié)點(diǎn)是否主觀認(rèn)為主節(jié)點(diǎn)下線,當(dāng)達(dá)到指定數(shù)()時(shí)哨兵會(huì)認(rèn)為成為一個(gè)離線的目標(biāo)。
主節(jié)點(diǎn)客觀下線時(shí),需要進(jìn)行主從切換。主從切換步驟為:
哨兵選擇一個(gè)從庫(kù)后,發(fā)送no one命令升級(jí)主庫(kù),并發(fā)送命令將其他從節(jié)點(diǎn)的主庫(kù)設(shè)置為新的主庫(kù)。
(4)哨兵模式的優(yōu)缺點(diǎn)
1.優(yōu)勢(shì)
2.不足問題
主從模式或哨兵模式存儲(chǔ)在每個(gè)節(jié)點(diǎn)中的數(shù)據(jù)是全量數(shù)據(jù)。當(dāng)數(shù)據(jù)量過大時(shí),存儲(chǔ)的數(shù)據(jù)需要分片存儲(chǔ)在多個(gè)實(shí)例上。這就是技術(shù)發(fā)揮作用的地方。
3.各大廠群解決方案
3.0 版本之前只支持單實(shí)例模式。雖然正式版的開發(fā)者要到2015年才會(huì)發(fā)布,各大企業(yè)已經(jīng)等不及了。在3.0版本發(fā)布之前,為了解決存儲(chǔ)瓶頸,他們推出了自己的集群解決方案。這些方案的核心思想是將數(shù)據(jù) () 存儲(chǔ)在多個(gè)實(shí)例中,每個(gè) 就是一個(gè)實(shí)例。
(1)客戶端片段
客戶端分片是在客戶端實(shí)現(xiàn)分片邏輯,(例如:支持的功能,也就是),通過客戶端預(yù)定義的路由規(guī)則(使用一致性哈希),將key的訪問轉(zhuǎn)發(fā)到不同的實(shí)例,并在查詢數(shù)據(jù)時(shí)匯總返回的結(jié)果。該方案的架構(gòu)如圖所示。
客戶端分片的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):客戶端技術(shù)使用哈希共識(shí)算法分片的優(yōu)點(diǎn)是所有邏輯可控,不依賴第三方分布式中間件。服務(wù)器的實(shí)例相互獨(dú)立,互不相關(guān)。每個(gè)實(shí)例都像單臺(tái)服務(wù)器一樣運(yùn)行,非常容易線性擴(kuò)展,系統(tǒng)非常靈活。開發(fā)者知道如何實(shí)現(xiàn)分片和路由規(guī)則,不用擔(dān)心踩坑。
1.一致性哈希算法:
是分布式系統(tǒng)中常用的算法。例如,在分布式存儲(chǔ)系統(tǒng)中,要將數(shù)據(jù)存儲(chǔ)在特定的節(jié)點(diǎn)上,如果使用常用的哈希方法將數(shù)據(jù)映射到特定的節(jié)點(diǎn),比如mod(key,d),key就是數(shù)據(jù)的key,d 是機(jī)器節(jié)點(diǎn)的數(shù)量。如果一臺(tái)機(jī)器加入或離開集群網(wǎng)站開發(fā),所有的數(shù)據(jù)映射都是無(wú)效的。
一致性哈希算法解決了普通余數(shù)哈希算法擴(kuò)展性差的問題,可以保證在服務(wù)器在線或離線時(shí)盡可能多的請(qǐng)求命中原路由服務(wù)器。
2.實(shí)現(xiàn)方式:一致性哈希算法,如哈希算法、算法
例如在實(shí)現(xiàn)中,使用了一致性哈希算法( ),同時(shí)對(duì)key和節(jié)點(diǎn)名進(jìn)行映射匹配。使用的算法是。
使用一致性哈希而不是簡(jiǎn)單的類似哈希的模映射的主要原因是,當(dāng)添加或減去節(jié)點(diǎn)時(shí),不會(huì)有重新匹配。一致性哈希只影響相鄰節(jié)點(diǎn)的密鑰分布,影響量很小。
不足:
客戶端分片最大的問題之一是當(dāng)服務(wù)器實(shí)例組的拓?fù)浒l(fā)生變化時(shí),每個(gè)客戶端都需要更新和調(diào)整。如果可以將客戶端分片模塊單獨(dú)取出,形成一個(gè)單獨(dú)的模塊(中間件),作為連接客戶端和服務(wù)端的橋梁解決這個(gè)問題,那么代理分片就出現(xiàn)了。
(2)代理片段
最常用的代理分片是開源代理?;驹硎牵嚎蛻舳艘灾虚g件的形式,根據(jù)路由規(guī)則將請(qǐng)求發(fā)送到正確的實(shí)例,最后將結(jié)果返回給客戶端。
通過引入代理層,統(tǒng)一管理多個(gè)實(shí)例,客戶端只需要對(duì)其進(jìn)行操作,無(wú)需關(guān)心后面有多少實(shí)例,從而實(shí)現(xiàn)集群。
優(yōu)點(diǎn):缺點(diǎn):
作為使用最廣泛、試用最穩(wěn)定的代理,在業(yè)界被廣泛使用。
(3)
實(shí)例無(wú)法平滑添加的問題帶來(lái)了極大的不便,于是玩豆家自主研發(fā)了支持實(shí)例平滑添加的代理軟件。它基于 Go 和 C 語(yǔ)言開發(fā),于 2014 年 11 月開源。
在架構(gòu)圖中,介紹了,通過指定一個(gè)和一個(gè)或多個(gè)來(lái)實(shí)現(xiàn)集群的高可用。當(dāng)一個(gè)掛掉時(shí),不會(huì)自動(dòng)將一個(gè)提升為,這涉及到數(shù)據(jù)一致性(數(shù)據(jù)同步本身采用主從異步復(fù)制,當(dāng)數(shù)據(jù)成功寫入時(shí)一致性hash算法php開源,是否已經(jīng)讀入此數(shù)據(jù)不保證),管理員需要在管理界面手動(dòng)將提升為。
如果你覺得手動(dòng)處理比較麻煩,玩豆家還提供了一個(gè)工具-ha,這個(gè)工具會(huì)在檢測(cè)到宕機(jī)時(shí)將它下線并提升一個(gè) 。
是預(yù)分片的形式。啟動(dòng)時(shí),會(huì)創(chuàng)建 1024 個(gè)插槽。一個(gè)插槽相當(dāng)于一個(gè)盒子。每個(gè)盒子都有一個(gè)固定的編號(hào),范圍從 1 到 1024。插槽盒子用于存儲(chǔ)密鑰。至于密鑰存放在哪個(gè)盒子里,可以通過算法“(key)24”得到一個(gè)數(shù)字。這個(gè)數(shù)字的范圍必須在1到1024之間,鑰匙放在這個(gè)數(shù)字對(duì)應(yīng)的槽中。
例如,如果一個(gè)key通過算法“(key)24”得到數(shù)字5,則將其放入代碼為5的槽(box)中。一個(gè)槽只能放在一個(gè),一個(gè)槽不能放放置在多個(gè)s中。 1 最少可以存儲(chǔ)1個(gè)slot,最多可以存儲(chǔ)1024個(gè)slot。因此,最多可以指定 1024 個(gè)。
最大的優(yōu)點(diǎn)是支持平滑增(減)(實(shí)例),可以安全透明地遷移數(shù)據(jù),這也是不同于其他靜態(tài)分布式方案的。添加后,涉及到的遷移。
比如系統(tǒng)有兩個(gè),slot對(duì)應(yīng)關(guān)系如下。
添加一個(gè)后,將重新分配插槽。有兩種分配槽的方法:
第一種:通過管理工具手動(dòng)重新分配,為每一個(gè)指定對(duì)應(yīng)的slot的范圍。例如,您可以指定新的與slot之間的對(duì)應(yīng)關(guān)系,如下所示。
第二:通過管理工具的功能,slot會(huì)根據(jù)各自的內(nèi)存自動(dòng)遷移,實(shí)現(xiàn)數(shù)據(jù)均衡。
4.
哨兵模式雖然可以實(shí)現(xiàn)高可用和讀寫分離,但有幾個(gè)缺點(diǎn):
3.0增加了集群模式,實(shí)現(xiàn)了分布式存儲(chǔ),即每個(gè)節(jié)點(diǎn)存儲(chǔ)不同的數(shù)據(jù)。為了解決單臺(tái)機(jī)器容量有限的問題小程序開發(fā),該模式按照一定的規(guī)則將數(shù)據(jù)分配給多臺(tái)機(jī)器。內(nèi)存/QPS不限于單機(jī),可以受益于分布式集群的高擴(kuò)展性。
是一種服務(wù)器技術(shù)(分片和路由都是在服務(wù)器端實(shí)現(xiàn)的),采用多主多從,每個(gè)分區(qū)由一個(gè)主多從組成,區(qū)域相互平行。的。集群采用P2P模式,完全去中心化。
如上圖,官方建議集群部署至少需要3個(gè)節(jié)點(diǎn),最好使用6個(gè)節(jié)點(diǎn)的3主3從模式。該集群具有以下特點(diǎn):
主要針對(duì)海量數(shù)據(jù)++高可用場(chǎng)景,海量數(shù)據(jù),如果你的數(shù)據(jù)量很大,建議使用,當(dāng)數(shù)據(jù)量不是很大的時(shí)候,就足夠了。性能和高可用性優(yōu)于哨兵模式。
采用虛擬哈希槽分區(qū)代替一致性哈希算法,預(yù)先分配一些卡槽,所有的key根據(jù)哈希函數(shù)映射到這些槽中,每個(gè)分區(qū)中的節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽和映射槽鍵值數(shù)據(jù)。
版權(quán)聲明:本文為CSDN博主“有言先生”原創(chuàng)文章,遵循CC4.0 BY-SA版權(quán)協(xié)議。轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
公眾號(hào)“Java ”發(fā)布的內(nèi)容如注明出處,版權(quán)歸原作者所有(無(wú)法核實(shí)或未注明出處的版權(quán)均來(lái)自互聯(lián)網(wǎng),轉(zhuǎn)載為傳達(dá)更多信息的目的,版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系本人,作者會(huì)第一時(shí)間刪除!
最近很多人問有沒有讀者交流群!加入方式很簡(jiǎn)單,公眾號(hào)Java選擇,回復(fù)“加群”,即可入群!
(微信小程序):3000+面試題,包括Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、、系列、、、K8s、、、架構(gòu)設(shè)計(jì)等,隨時(shí)在線!
------特別推薦-----