在本文檔中,高可用主要指的是解決盡可能在不丢失資料的前提下不間斷服務問題,由于redis是異步複制,是以不保證資料完全不丢失,在這個場景下并不實作動态橫向擴容,隻能進行縱向擴容,你隻要加記憶體,啟動redis,設定maxmemory即可。而分片(sharding)主要指的是解決線上動态橫向擴容縮容問題,當然為了穩定也進行高可用部署配置,即包含成對的主從關系。
适用于redis非重度使用者,記憶體占用不大,總體記憶體大小的增長趨勢可預估,有一定停機時間的系統——縱向擴容即可滿足,可以對全庫進行主從複制即滿足需求而不需要做分片,一般針對單個小型項目的cache 等場景。一般采用一主多從的sentinel方案進行部署。
分片是為了應對業務增長帶來的資料增長,需要對動态橫向擴容有一定要求時采用。對于一般的分片采用一緻性哈希,它極大的優化機器增删時帶來的哈希目标漂移問題。同時對于hash目标漂移時産生的嚴重的資料傾斜,可以利用虛拟節點來優化。基本上,實體節點有了一定規模後,隻要不是同時挂多個節點,或者同時擴容多個節點,資料分片不會有太大的擾動。穿透過cache的請求後端存儲可以抗住即可。
稍微複雜的方案是可以使用“預分片(pre-sharding)”的方案,也稱為按“桶”進行資料劃分,即配置設定一個相當大的集合,對key哈希的結果落在這個集合中,集合的每個元素又與具體的實體節點存在多對一的路由映射關系,這張路由表由一個配置中心進行維護。其實,一緻性哈希中的虛拟節點,實際上也可以歸類到pre-sharding方案中。換句話說,隻要是key經過兩次哈希,第一次hash到虛拟節點,第二次hash到實體節點,都可以算作pre-sharding。隻不過差別在于,一緻性哈希的第二次hash其路由表是按照算法固定的,而分桶的第二次hash其路由表是第三方可配的。
---
動态擴容能力
系統複雜度
開發複雜度
運維複雜度
主從複制+sentinel
no
簡單
twemproxy
稍微複雜
3.0 cluster
yes
複雜
codis
應用層面presharding
視開發的水準而定
<b>本文為《redis開發運維實踐指南》内容,該書作者為黃鵬程,已授權雲栖社群轉載。</b>