Redis分布式快速入门
生活随笔
收集整理的這篇文章主要介紹了
Redis分布式快速入门
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
現(xiàn)在學(xué)習(xí)Redis的分布式,我們先看一下目錄,首先講的是分布式算法的原理,這里用的是一致性算法,這種算法也會(huì)被經(jīng)常問(wèn)到,分布式環(huán)境的配置,還有分布式服務(wù)端和客戶端的啟動(dòng),封裝分布式Shard Redis API,Shard就是分片,然后是在分布式環(huán)境下進(jìn)行驗(yàn)證,在實(shí)戰(zhàn)的最后呢,還會(huì)講解一下集群和分布式的概念,因?yàn)檫@兩個(gè)概念呢,特別容易弄混,所以這里特意講解一下,開(kāi)始我們分布式算法的原理,我們先從傳統(tǒng)的分布式算法來(lái)講,然后再講Consistent hashing算法的原理,后面還會(huì)講一下hash的傾斜性,還有虛擬節(jié)點(diǎn),Consistent hash命中率的一個(gè)計(jì)算,首先舉個(gè)例子,假設(shè)我們有一個(gè)圖片叫test.jpg,然后我現(xiàn)在有三個(gè)服務(wù)器,我們稱之為0服務(wù)器,1服務(wù)器,2服務(wù)器,為什么稱之為0,一會(huì)你就會(huì)理解,首先我們對(duì)test.jpg這個(gè)文件,進(jìn)行一個(gè)hash,我們可以拿到一個(gè)散列的值,然后用這個(gè)散列的值呢,對(duì)3取模,取模大家都知道,就是用這個(gè)數(shù)取3之后的余數(shù),如果被整除呢,那么他的模,就是0,不能被整除就是1或者2,最多余1或余2,如果感覺(jué)這個(gè)抽象的話,你就認(rèn)為hash(test.jpg)這么一個(gè)公式,返回一個(gè)數(shù)字,假設(shè)你認(rèn)為它是100就可以了,那么100對(duì)3的取模肯定是1,余數(shù)是1,取模之后只有0,1,2,那如果0的話,就把它存在0這個(gè)節(jié)點(diǎn)上,如果是1的話,那就把它存在1這個(gè)服務(wù)節(jié)點(diǎn)上,如果是2的話,就把它存在2這個(gè)服務(wù)節(jié)點(diǎn)上
假設(shè)我們現(xiàn)在有4個(gè)REDIS節(jié)點(diǎn),redis0,reids1,redis2,redis3,那為什么要用0呢,剛剛也說(shuō)了,是為了取模,我們現(xiàn)在有4個(gè)redis節(jié)點(diǎn),然后有20個(gè)數(shù)據(jù),那這個(gè)都是打個(gè)比方,實(shí)際的生產(chǎn)環(huán)境中,我們的數(shù)據(jù)可能是成千上萬(wàn),那現(xiàn)在有20個(gè)數(shù)據(jù),那么1到20大家就認(rèn)為,這是對(duì)hash之后的一個(gè)結(jié)果,然后我們繼續(xù)看
對(duì)應(yīng)4個(gè)節(jié)點(diǎn),然后我們開(kāi)始放20個(gè)數(shù)據(jù),因?yàn)槲覀兪?個(gè)節(jié)點(diǎn),所以要對(duì)4取模,1除4除不開(kāi),余1,所以他會(huì)放到1節(jié)點(diǎn)上,2除4余2,放在redis2節(jié)點(diǎn)上,這20個(gè)數(shù)據(jù)全部找到對(duì)應(yīng)的redis server節(jié)點(diǎn)上了,那我們現(xiàn)在生產(chǎn)環(huán)境突然發(fā)現(xiàn),redis的節(jié)點(diǎn)不夠用了,需要新增節(jié)點(diǎn),或者是說(shuō),我們發(fā)現(xiàn)redis這個(gè)集群,負(fù)載非常低,我們可以刪除一個(gè)節(jié)點(diǎn),來(lái)節(jié)省我們的資源,畢竟呢我們?cè)黾右粋€(gè)節(jié)點(diǎn)呢,無(wú)論是從硬件還是日常消耗上呢,電費(fèi),寬帶費(fèi)等等之類的,都是有日常消耗的,從節(jié)約能源的考慮呢,也有可能會(huì)刪除的,那現(xiàn)在我們的場(chǎng)景是增加了一個(gè)節(jié)點(diǎn)
5個(gè)redis節(jié)點(diǎn),我們把5個(gè)節(jié)點(diǎn)放到這里,redis0到redis4,一共5個(gè),現(xiàn)在呢我們把這個(gè)20個(gè)數(shù),重新放到這5個(gè)redis當(dāng)中,這20個(gè)數(shù)據(jù)都放好了,那現(xiàn)在回想一下,剛剛是4個(gè)節(jié)點(diǎn)的時(shí)候,我們看一下,redis0中的20,redis1中的1,redis2中的2,redis3中的3,還有redis3中的18,在四個(gè)節(jié)點(diǎn)和五個(gè)節(jié)點(diǎn)中,他們存儲(chǔ)的服務(wù)器是一樣的,假設(shè)我們之前是4個(gè)節(jié)點(diǎn),這20個(gè)數(shù)也存起來(lái)了,現(xiàn)在呢我們擴(kuò)容,增加了一臺(tái)redis4,發(fā)現(xiàn)這5個(gè)數(shù)據(jù)呢,還能get到,他們存儲(chǔ)的位置沒(méi)有任何變化,這個(gè)例子呢,也不能太多,實(shí)際生產(chǎn)環(huán)境的量級(jí)呢,比這個(gè)大的多的多,千萬(wàn),百萬(wàn),上億,都是有可能的,那然后我們先看一下結(jié)論
redis0只有20命中,redis1只有1命中,redis3有3和18命中,那命中率就是5/20=25%,那一會(huì)我們還會(huì)講一下,一致率算法的一個(gè)公式,當(dāng)然因?yàn)槲覀兊牧考?jí)比較少,所以不是太明顯,一會(huì)我們看到公式,講解一下就OK了,然后我們先說(shuō)Consistent hashing,一致性hash算法,那Consistent hashing呢,算法早在1997年論文一致性算法,和隨機(jī)森林算法當(dāng)中提出了,那我們現(xiàn)在來(lái)講解他,首先我們理解一個(gè)環(huán)形hash空間
通常哈希算法都是將value,映射在一個(gè)32位的,key值當(dāng)中,那我們把這個(gè)數(shù)軸,卷起來(lái),變成了一個(gè)首尾相接的圓環(huán),他的取值范圍呢,就是從0開(kāi)始,一直到2的32次冪減1,現(xiàn)在呢我們這個(gè)環(huán)形哈希空間呢,已經(jīng)構(gòu)成了,下一步就是把對(duì)象,映射到這個(gè)環(huán)形哈希空間上,接下來(lái)我們考慮四個(gè)對(duì)象,object1到object4,然后通過(guò)hash函數(shù)呢,計(jì)算出這四個(gè)對(duì)象的hash值,那這個(gè)值,肯定會(huì)落在我們這個(gè)環(huán)形哈希空間上的,我們看一下圖
首先這個(gè)圓環(huán)在這里,object1出現(xiàn),然后對(duì)他進(jìn)行一個(gè)hash,hash之后啊,他肯定落在2的32次方減1范圍里,然后呢,落在了這個(gè)位置,我們把object1哈希之后的值叫key1,然后2,3,4呢,也是同理,那么現(xiàn)在四個(gè)object全部落在環(huán)形空間當(dāng)中,那么這個(gè)就是把對(duì)象映射到環(huán)形空間
接下來(lái)我們就要把cache映射到hash空間當(dāng)中,那基本思想就是將對(duì)象和cache都映射到同一個(gè)hash數(shù)值空間中,并且使用相同的hash算法,對(duì)cacheA等等進(jìn)行一個(gè)hash,前面的object呢,用的數(shù)字,這里面的cache就用字母,那這里面就要講一下,對(duì)于cache的hash對(duì)象,一般的方法可以使用機(jī)器的ip地址,或者機(jī)器名,作為hash的一個(gè)輸入,那也可以引入更過(guò)的因子,例如說(shuō)他的端口號(hào),也可以引入進(jìn)來(lái),然后呢,繼續(xù)看
那還是這個(gè)圖,現(xiàn)在這個(gè)圖呢,就是object,都已經(jīng)存在在環(huán)形空間當(dāng)中,那這個(gè)2的32次方減1,代表這個(gè)環(huán)形的一個(gè)容量,從0開(kāi)始,到他的一圈結(jié)束之后呢,它能夠存放2的32次方減1的數(shù)字,然后呢我們繼續(xù),這個(gè)時(shí)候cacheA出現(xiàn),那我們稱它一映射的key叫keyA,他也存到了這個(gè)環(huán)形空間當(dāng)中,同理,CacheB也出現(xiàn)了,CacheC也出現(xiàn)了,假設(shè)我們就3個(gè)Cache,我們繼續(xù)看,現(xiàn)在Cache和數(shù)據(jù)對(duì)象啊,都已經(jīng)通過(guò)同一個(gè)hash算法,映射到這個(gè)hash環(huán)形空間當(dāng)中了,接下來(lái)我們要考慮的是,如何把這個(gè)對(duì)象呢,映射到Cache上面了,首先在這個(gè)環(huán)形空間當(dāng)中,如果沿著這個(gè)key所在的位置,順時(shí)針出發(fā),他碰到第一個(gè)Cache節(jié)點(diǎn),是keyA,也就是cacheA,那keyA就要存到這個(gè)藍(lán)色cacheA節(jié)點(diǎn)當(dāng)中,那因?yàn)閷?duì)象是hash,和cache的hash是固定的,因此呢這個(gè)key,存到這個(gè)cache當(dāng)中,必然是唯一并且是確定的,這樣就找到了我們數(shù)據(jù),映射cache的一個(gè)方案,那么我們接下來(lái)看一下動(dòng)畫(huà),首先key1映射到cacheA上,然后是key2,key2順時(shí)針往上走,那找到第一個(gè)cache節(jié)點(diǎn)呢,就是cacheC,所以key2,object2,這個(gè)數(shù)據(jù)會(huì)存到CacheC上,同理繼續(xù),那object3呢,會(huì)存到cacheC上,object4呢,那現(xiàn)在我們圓環(huán)里四個(gè)紅點(diǎn),數(shù)據(jù)都已經(jīng)找到了cache空間,都已經(jīng)找到了要存到哪個(gè)cache服務(wù)器上,剛剛也說(shuō)了,我們生產(chǎn)環(huán)境可能會(huì)調(diào)整,刪除一個(gè)cache節(jié)點(diǎn),或者增加一個(gè)cache節(jié)點(diǎn),那傳統(tǒng)的hash算法,取模的方式對(duì)后臺(tái)的服務(wù)器,造成了巨大的沖擊,很多緩存都沒(méi)有命中,如果你的業(yè)務(wù)代碼呢,穿透型的,那就會(huì)穿過(guò)cache,直擊DB,很容易把數(shù)據(jù)庫(kù)搞垮,那現(xiàn)在我們就來(lái)看一下,Consistent hashing,一致性算法的精髓所在,我們就要變動(dòng)這個(gè)cache節(jié)點(diǎn)了,那我們現(xiàn)在開(kāi)始移除cache節(jié)點(diǎn),還是這個(gè)圖,我們首先把cacheB消失掉
?
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Redis分布式快速入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用户Session相关模块重构
- 下一篇: Redisson框架快速入门