Redis搭建(四):Sharding集群模式
一、 方案
1. 介紹
redis集群分為服務(wù)端集群(Cluster)和客戶(hù)端分片(Sharding)
服務(wù)端集群:redis3.0以上版本實(shí)現(xiàn),使用哈希槽,計(jì)算key的CRC16結(jié)果再模16834。此處暫不介紹
客戶(hù)端分片:3.0以下使用,采用Key的一致性hash算法來(lái)區(qū)分key存儲(chǔ)在哪個(gè)Redis實(shí)例上。每個(gè)Redis實(shí)例彼此獨(dú)立,使用ShardedJedisPool
2. Sharding存在兩個(gè)問(wèn)題
單點(diǎn)故障問(wèn)題:當(dāng)集群中的某一臺(tái)服務(wù)掛掉之后,客戶(hù)端在根據(jù)一致性hash無(wú)法從這臺(tái)服務(wù)器獲取數(shù)據(jù)。對(duì)于單點(diǎn)故障問(wèn)題,我們可以使用Redis的HA高可用來(lái)實(shí)現(xiàn)。利用Redis-Sentinal來(lái)通知主從服務(wù)的切換。
擴(kuò)容問(wèn)題:因?yàn)槭褂昧艘恢滦怨∵M(jìn)行分片,那么不同的key分布到不同的Redis-Server上,當(dāng)我們需要擴(kuò)容時(shí),需要增加機(jī)器到分片列表中,這時(shí)候會(huì)使得同樣的key算出來(lái)落到跟原來(lái)不同的機(jī)器上,這樣如果要取某一個(gè)值,會(huì)出現(xiàn)取不到的情況,之前的緩存相當(dāng)于全部失效。對(duì)于擴(kuò)容問(wèn)題,Redis的作者提出了一種名為Pre-Sharding的方式。即事先部署足夠多的Redis服務(wù)。
3. 一致性hash算法(Consistent hashing)
環(huán)形hash空間,早在1997年就在論文《Consistent hashing and random trees》提出
虛擬節(jié)點(diǎn)(解決hash傾斜性,多些虛擬節(jié)點(diǎn))
命中率計(jì)算公式:(1-n/(n+m)*100% (n:服務(wù)器數(shù),m:新增的服務(wù)器數(shù))
二、 Sharding解決辦法
1. 單點(diǎn)故障問(wèn)題解決:
使用Redis主從復(fù)制的功能,兩臺(tái)物理主機(jī)上分別都運(yùn)行有Redis-Server,其中一個(gè)Redis-Server是另一個(gè)的從庫(kù),采用雙機(jī)熱備技術(shù),客戶(hù)端通過(guò)虛擬IP訪問(wèn)主庫(kù)的物理IP,當(dāng)主庫(kù)宕機(jī)時(shí),切換到從庫(kù)的物理IP。只是事后修復(fù)主庫(kù)時(shí),應(yīng)該將之前的從庫(kù)改為主庫(kù)(使用命令slaveof no one),主庫(kù)變?yōu)槠鋸膸?kù)(使用命令slaveof IP PORT),這樣才能保證修復(fù)期間新增數(shù)據(jù)的一致性。
2. 通過(guò)pre-sharding進(jìn)行Redis在線擴(kuò)容。
解決動(dòng)態(tài)擴(kuò)容和數(shù)據(jù)分區(qū)的問(wèn)題,實(shí)際就是在同一臺(tái)機(jī)器上部署多個(gè)Redis實(shí)例的方式,當(dāng)容量不夠時(shí)將多個(gè)實(shí)例拆分到不同的機(jī)器上,這樣實(shí)際就達(dá)到了擴(kuò)容的效果。Pre-Sharding方法是將每一個(gè)臺(tái)物理機(jī)上,運(yùn)行多個(gè)不同端口的Redis實(shí)例,假如有三個(gè)物理機(jī),每個(gè)物理機(jī)運(yùn)行三個(gè)Redis實(shí)例,那么我們的分片列表中實(shí)際有9個(gè)Redis實(shí)例,當(dāng)我們需要擴(kuò)容時(shí),增加一臺(tái)物理機(jī)來(lái)代替9個(gè)中的一個(gè)redis,有人說(shuō),這樣不還是9個(gè)么,是的,但是以前服務(wù)器上面有三個(gè)redis,壓力很大的,這樣做,相當(dāng)于單獨(dú)分離出來(lái)并且將數(shù)據(jù)一起copy給新的服務(wù)器。值得注意的是,還需要修改客戶(hù)端被代替的redis的IP和端口為現(xiàn)在新的服務(wù)器,只要順序不變,不會(huì)影響一致性哈希分片。
拆分過(guò)程如下:
在新機(jī)器上啟動(dòng)好對(duì)應(yīng)端口的Redis實(shí)例。
配置新端口為待遷移端口的從庫(kù)。
待復(fù)制完成,與主庫(kù)完成同步后,切換所有客戶(hù)端配置到新的從庫(kù)的端口。
配置從庫(kù)為新的主庫(kù)。
移除老的端口實(shí)例。
重復(fù)上述過(guò)程遷移好所有的端口到指定服務(wù)器上。
以上拆分流程是Redis作者提出的一個(gè)平滑遷移的過(guò)程,不過(guò)該拆分方法還是很依賴(lài)Redis本身的復(fù)制功能的,如果主庫(kù)快照數(shù)據(jù)文件過(guò)大,這個(gè)復(fù)制的過(guò)程也會(huì)很久,同時(shí)會(huì)給主庫(kù)帶來(lái)壓力。所以做這個(gè)拆分的過(guò)程最好選擇為業(yè)務(wù)訪問(wèn)低峰時(shí)段進(jìn)行。
三、實(shí)現(xiàn)
打開(kāi)redis.conf,修改端口號(hào),避免端口沖突
啟動(dòng)多個(gè)Redis實(shí)例,每個(gè)Redis彼此獨(dú)立
使用RedisShardedPool增加多個(gè)Redis
總結(jié)
以上是生活随笔為你收集整理的Redis搭建(四):Sharding集群模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 特性(摘要)
- 下一篇: 《哈迪斯 2》明年二季度 PC 上线抢先