玩轉(zhuǎn)Redis集群(下)

接上一篇《玩轉(zhuǎn)Redis集群(上)》,我們來(lái)繼續(xù)玩~

Redis集群操作實(shí)踐

數(shù)據(jù)的分布性


數(shù)據(jù)分布性

從上面的操作,你可以看到,當(dāng)存儲(chǔ)某一個(gè)數(shù)據(jù)的時(shí)候,會(huì)分配一個(gè)slot,而這個(gè)slot從屬于某一個(gè)Master,也就是說(shuō)你需要明白,數(shù)據(jù)是分布的存儲(chǔ)在Redis集群當(dāng)中的。

在線水平擴(kuò)容

Redis Cluster有一個(gè)非常重要的特點(diǎn)就是可以在線的添加節(jié)點(diǎn),實(shí)現(xiàn)不影響業(yè)務(wù)的水平擴(kuò)容。在這里,我將會(huì)在原來(lái)6個(gè)redis節(jié)點(diǎn)上,再添加2個(gè)redis節(jié)點(diǎn)。做法和以前一致,注意修改redis.conf,然后在啟動(dòng)8007、8008這2個(gè)redis實(shí)例。

修改redis.conf配置


啟動(dòng)新添加的2個(gè)redis實(shí)例


集群狀態(tài)

其實(shí),目前雖然啟動(dòng)了新加的2個(gè)redis實(shí)例,但是它們是不屬于集群的。下面,我們來(lái)讓它們加入集群中。

add-node命令

./redis-trib.rb add-node 192.168.99.121:8007 192.168.99.121:8006

./redis-trib.rb add-node 新節(jié)點(diǎn) 集群中已經(jīng)存在的節(jié)點(diǎn)

在往集群中添加節(jié)點(diǎn)A的時(shí)候,需要提供一個(gè)在集群中已經(jīng)存在的節(jié)點(diǎn)B的信息。因?yàn)橹懒薆的信息,就知道了整個(gè)集群的信息。為什么這么說(shuō)呢,來(lái),我們看一個(gè)文件,你就知道了。

nodes-xxx.conf

要知道集群中的每一個(gè)節(jié)點(diǎn)都有這么一個(gè)文件,存儲(chǔ)著集群中每一個(gè)節(jié)點(diǎn)的信息:節(jié)點(diǎn)的角色、節(jié)點(diǎn)的ID、連接狀態(tài)、slot范圍、IP/PORT信息等。仔細(xì)觀察圖中,你可以發(fā)現(xiàn),新加入的8007節(jié)點(diǎn),實(shí)際上被默認(rèn)為master節(jié)點(diǎn),并且沒(méi)有slot分配!這說(shuō)明,新加入的節(jié)點(diǎn)現(xiàn)在還不可以存儲(chǔ)數(shù)據(jù),因此我們要為新節(jié)點(diǎn)分配slot槽。

[root@mydream121 bin]# ./redis-trib.rb reshard 192.168.99.121:8001

要知道slot都分配在master上,因此其實(shí)我們要做的就是從集群的masters上進(jìn)行重新分配。上面的命令需要指定一個(gè)master節(jié)點(diǎn)進(jìn)行reshard分片。

slot重新分配

圖中要為新加入的節(jié)點(diǎn)8007分配500個(gè)slot,而且分配的方式是"all",all是什么意思呢?all代表從已經(jīng)存在的所有的master上均勻的分配一部分slot給8007。當(dāng)然你可以通過(guò)"done"來(lái)指定某一個(gè)master進(jìn)行分配。注意分配給8007是通過(guò)節(jié)點(diǎn)ID來(lái)指定的。

分配后的集群信息

按照上面的操作,我將8008節(jié)點(diǎn)也加入集群中,我的想法是讓8008成為8007的從節(jié)點(diǎn)。既然是從節(jié)點(diǎn),就不需要分配slot槽。注意到add-node方式加入的節(jié)點(diǎn),默認(rèn)就是master節(jié)點(diǎn),因此這里我們得利用replicate指定主節(jié)點(diǎn)。

[root@mydream121 bin]# ./redis-trib.rb add-node 192.168.99.121:8008 192.168.99.121:8001


為從節(jié)點(diǎn)指定主節(jié)點(diǎn)

那么到現(xiàn)在,我們就在線完成了對(duì)Redis集群的水平擴(kuò)容。那么如何刪除節(jié)點(diǎn)呢?刪除節(jié)點(diǎn)時(shí),數(shù)據(jù)怎么辦呢?對(duì)于從節(jié)點(diǎn),刪除就刪除了,并不要緊,關(guān)鍵是主節(jié)點(diǎn),因?yàn)橹鞴?jié)點(diǎn)上有slot。因此,在刪除主節(jié)點(diǎn)前,我們要對(duì)主節(jié)點(diǎn)的slot進(jìn)行重新分配,完成數(shù)據(jù)的遷移。這里我就不再演示了,直接給出命令。

刪除主節(jié)點(diǎn):先reshard + 后del-node

刪除從節(jié)點(diǎn):直接del-node


Redis實(shí)現(xiàn)Session共享

Redis可以被用于Session共享,不過(guò)現(xiàn)在CAS實(shí)現(xiàn)單點(diǎn)登錄更容易些。(CAS以后為大家介紹)

redis集群存儲(chǔ)session信息

不論是Nginx掛了,還是其中的Tomcat掛掉,都不會(huì)丟失Session信息。在實(shí)現(xiàn)上,有現(xiàn)成的插件,比如:https://github.com/jcoleman/tomcat-redis-session-manager?


Java操作Redis

在單機(jī)Redis環(huán)境:Jedis

這個(gè)沒(méi)什么好說(shuō)的,就是給定IP/PORT實(shí)例化Jedis操作即可。

Jedis jedis = new Jedis("192.168.99.121", 8001);

在多臺(tái)Redis環(huán)境:ShardedJedis+ShardedJedisPool

ShardedJedis方式

這是一種切片的方式來(lái)操作redis,通過(guò)hash而均勻的分配到pool里的redis機(jī)器中。

在Redis集群環(huán)境:JedisCluster

JedisCluster

與Spring整合

我們直接來(lái)看配置文件吧!

redis集群與Spring整合

同上文Java操作Redis集群的代碼對(duì)比下,其實(shí)XML就是代碼的映射。只不過(guò)通過(guò)spring的方式,幫助我們配置生成了一個(gè)bean:redisCluster。我們可以通過(guò)注入的方式得到redisCluster,然后我們想干啥就可以干啥,就這么簡(jiǎn)單~


到這里,redis集群部分整個(gè)就結(jié)束了,下一篇文章是關(guān)于什么的呢,我不告訴你,哈哈~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容