在解釋Redis Presharding之前,先來說下sharding。Sharding,譯為分片,有時也用partitioning(分區),這倆是同一個意思,說的是數據分散到Redis多個實例。
那presharding就是預分片的意思,這是Redis 3.0之前的概念。在Redis 3.0官方支持了Redis集群,在那之前,要想實現集群,用的是各種民間方法,如客戶端側的分片、代理等,典型的代表是Twitter的Twemproxy。同時,Redis作者也提出了一種集群方案,即為presharding。他戲稱之為乞丐版的集群,正統的當然是之后的3.0集群方案啦。
如何分片,大家可能首先會想到如下的分片方案:Node = Hash(key) MOD N。hash是簡單的,但rehash是很困難的,同時涉及到redis運行時key在不同實例間的遷移。
Redis Presharding不需要resharding,主要步驟如下:
0)在項目的開始階段,在同一服務器上部署多個redis實例;
1)在擴容階段,新增服務器,部署新的redis實例;
2)將新實例設為要遷移的舊實例的slave;
3)斷開客戶端;
4)更新配置:新實例的ip;
5)新實例執行slaveof no one,成為master;
6)重啟客戶端,使客戶端使用新實例;
7)關閉舊實例。
作者提出這種方案,也是基于redis輕量的特點。因為redis代碼量少,三方依賴少,因此內存占用相當少(1M+),故而可以在單機上部署相當多的實例。
使用presharding時,可以部署腳本來管理集群、增加監控、通過主從復制增強容錯能力。
重點說明:
1)presharding前后,集群中的redis實例總數是不變的。正因為如此,避免了resharding,不存在key值從一個區轉移到另一個分片區。
2)新增服務器上應部署多少個redis實例?
答:如果之前有1臺服務器,加1臺服務器,那么應遷移1/2的實例,以此類推。原則是每臺服務器上實例數均衡。
3)presharding前后redis實例不變,那有什么意義?
答:集群的思想是用多臺(可能性能相對差的)機器,得到高效的處理能力。隨著業務的發展,單機上可能存儲、CPU、內存不夠用了,此時就需要增加機器,并進行實例的遷移,此時單機的實例數變少,單機的壓力減小。因此,假設有N臺機器,每臺M個實例,隨著業務的發展,N會逐漸增大,M逐漸減小,但N*M是保持不變的。
4)限制。該方案受限于初始設定的實例數,如果N*M個redis實例還滿足不了需求,再增加機器就會出現resharding。作者建議初始單機部署32,64,128個redis實例,當然最終還是應該根據自己的業務實際情況和對未來的預估,或者直接升級redis版本嘮。
參考資料:
1、(redis作者對presharding的詳細說明)http://oldblog.antirez.com/post/redis-presharding.html
2、(官網關于分片的話題)https://redis.io/topics/partitioning
4、redis集群(Sharding)和在線擴容(Pre-Sharding)
5、(知乎小鋼镚兒的回答)Redis集群方案應該怎么做?