如今互聯網項目中大量使用了redis,本文著主要分析下redis 單點,master/slave,sentinel模式、cluster的一些特色。node
單節點實例仍是比較簡單的,平時作個測試,寫個小程序若是須要用到緩存的話仍是和方便的,現實生產環境中基本不會使用單節點模式。redis
2.1從模式特色:算法
主從模式的特色以及本身的一些理解。小程序
主從模式的缺點其實從上面的描述中能夠得出:緩存
這個缺點影響是很大的,尤爲是對生產環境來,因此有了下面的sentinel模式。服務器
sentinel的中文含義是哨兵、守衛。也就是說既然主從模式中,當master節點掛了之後,slave節點不能主動選舉一個master節點出來,那麼我就安排一個或多個sentinel來作這件事,當sentinel發現master節點掛了之後,sentinel就會從slave中從新選舉一個master。負載均衡
對sentinel模式的理解:測試
1.ntinel模式是創建在主從模式的基礎上,若是隻有一個Redis節點,sentinel就沒有任何意義;
2.當master節點掛了之後,sentinel會在slave中選擇一個節點作爲master,並修改它們的配置文件,其餘slave的配置文件也會被修改,好比slaveof屬性會指向新的master;
3.當master節點從新啓動後,它將再也不是master而是作爲slave接收新的master節點的同步數據
4.sentinel由於也是一個進程有掛掉的可能,因此sentinel也會啓動多個造成一個sentinel集羣
5.當主從模式配置密碼時,sentinel也會同步將配置信息修改到配置文件中,不準要擔憂。
6.一個sentinel或sentinel集羣能夠管理多個主從Redis。
7.sentinel最好不要和Redis部署在同一臺機器,否則Redis的服務器掛了之後,sentinel也掛了
8.sentinel監控的Redis集羣都會定義一個master名字,這個名字表明Redis集羣的master Redis。優化
當使用sentinel模式的時候,客戶端就不要直接鏈接Redis,而是鏈接sentinel的ip和port,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉之後,sentinel就會感知並將新的master節點提供給客戶端spa
sentinel模式基本能夠知足通常生產的需求,具有高可用性。可是當數據量過大時,主從或者或sentinel模式就不能知足需求了,這個時候須要對存儲的數據進行分片,將數據存儲到多個Redis實例中,就是下面要講的。
redis 3.0以後版本支持redis-cluster集羣,Redis-Cluster採用無中心結構,每一個節點保存數據和整個集羣狀態,每一個節點都和其餘全部節點鏈接。
cluster的出現是爲了解決單機Redis容量有限的問題,將Redis的數據根據必定的規則分配到多臺機器。
其結構特色:
一、全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
二、節點的fail是經過集羣中超過半數的節點檢測失效時才生效。
三、客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可。
四、redis-cluster把全部的物理節點映射到[0-16383]slot上(不必定是平均分配),cluster 負責維護node<->slot<->value。
五、Redis集羣預分好16384個桶,當須要在 Redis 集羣中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪一個桶中。
這種模式適合數據量巨大的緩存要求,當數據量不是很大使用sentinel便可。
如今咱們是三個主節點分別是:A, B, C 三個節點,它們能夠是一臺機器上的三個端口,也能夠是三臺不一樣的服務器。那麼,採用哈希槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:
節點A覆蓋0-5460;
節點B覆蓋5461-10922;
節點C覆蓋10923-16383.
獲取數據:
若是存入一個值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。 那麼就會把這個key 的存儲分配到 B 上了。一樣,當我鏈接(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的算法,而後內部跳轉到B節點上獲取數據
新增一個主節點:
新增一個節點D,redis cluster的這種作法是從各個節點的前面各拿取一部分slot到D上,我會在接下來的實踐中實驗。大體就會變成這樣:
節點A覆蓋1365-5460
節點B覆蓋6827-10922
節點C覆蓋12288-16383
節點D覆蓋0-1364,5461-6826,10923-12287
一樣刪除一個節點也是相似,移動完成後就能夠刪除這個節點了。
二、Redis Cluster主從模式
redis cluster 爲了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集羣不會掛掉。
上面那個例子裏, 集羣有ABC三個主節點, 若是這3個節點都沒有加入從節點,若是B掛掉了,咱們就沒法訪問整個集羣了。A和C的slot也沒法訪問。
因此咱們在集羣創建的時候,必定要爲每一個主節點都添加了從節點, 好比像這樣, 集羣包含主節點A、B、C, 以及從節點A一、B一、C1, 那麼即便B掛掉系統也能夠繼續正確工做。
B1節點替代了B節點,因此Redis集羣將會選擇B1節點做爲新的主節點,集羣將會繼續正確地提供服務。 當B從新開啓後,它就會變成B1的從節點。
不過須要注意,若是節點B和B1同時掛了,Redis集羣就沒法繼續正確地提供服務了。、
redis集羣的搭建
集羣中至少應該有奇數個節點,因此至少有三個節點,每一個節點至少有一個備份節點,因此下面使用6節點(主節點、備份節點由redis-cluster集羣肯定)。