http://www.javashuo.com/article/p-zeolisey-kc.htmlphp
版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:http://www.javashuo.com/article/p-zeolisey-kc.html
轉載:http://blog.csdn.net/shmnh/article/details/72868328html
Redis集羣的目的是實現數據的橫向伸縮,把一塊數據分片保存到多個機器,能夠橫向擴展數據庫大小,擴展帶寬,計算能力等。java
實現數據分片(集羣)方式大體有三種:node
1)客戶端實現數據分片redis
即客戶端本身計算數據的key應該在哪一個機器上存儲和查找,此方法的好處是下降了服務器集羣的複雜度,客戶端實現數據分片時,服務器是獨立的,服務器以前沒有任何關聯。多數redis客戶端庫實現了此功能,也叫sharding,這種方式的缺點是客戶端須要實時知道當前集羣節點的聯繫信息,同時,當添加一個新的節點時,客戶端要支持動態sharding.,多數客戶端實現不支持此功能,須要重啓redis。另外一個弊端是redis的HA須要額外考慮。數據庫
2)服務器實現數據分片ruby
其理論是,客戶端隨意與集羣中的任何節點通訊,服務器端負責計算某個key在哪一個機器上,當客戶端訪問某臺機器時,服務器計算對應的key應該存儲在哪一個機器,而後把結果返回給客戶端,客戶端再去對應的節點操做key,是一個重定向的過程,此方式是redis3.0正在實現,目前處於beta版本, Redis 3.0的集羣同時支持HA功能,某個master節點掛了後,其slave會自動接管。服務器
服務器端實現集羣須要客戶端語言實現服務器集羣的協議,目前java,php,ruby語言多數有redis-cluster客戶端實現版本。負載均衡
Redis Cluster原理http://www.cnblogs.com/foxmailed/p/3630875.htmlide
Redis Cluster 是Redis的集羣實現,內置數據自動分片機制,集羣內部將全部的key映射到16384個Slot中,集羣中的每一個Redis Instance負責其中的一部分的Slot的讀寫。集羣客戶端鏈接集羣中任一Redis Instance便可發送命令,當Redis Instance收到本身不負責的Slot的請求時,會將負責請求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到後自動將原請求從新發往這個地址,對外部透明。一個Key到底屬於哪一個Slot由crc16(key) % 16384 決定。
關於負載均衡,集羣的Redis Instance之間能夠遷移數據,以Slot爲單位,但不是自動的,須要外部命令觸發。
關於集羣成員管理,集羣的節點(Redis Instance)和節點之間兩兩按期交換集羣內節點信息而且更新,從發送節點的角度看,這些信息包括:集羣內有哪些節點,IP和PORT是什麼,節點名字是什麼,節點的狀態(好比OK,PFAIL,FAIL,後面詳述)是什麼,包括節點角色(master 或者 slave)等。
關於可用性,集羣由N組主從Redis Instance組成。主能夠沒有從,可是沒有從 意味着主宕機後主負責的Slot讀寫服務不可用。
一個主能夠有多個從,主宕機時,某個從會被提高爲主,具體哪一個從被提高爲主,協議相似於Raft,參見這裏。如何檢測主宕機?Redis Cluster採用quorum+心跳的機制。從節點的角度看,節點會按期給其餘全部的節點發送Ping,cluster-node-timeout(可配置,秒級)時間內沒有收到對方的回覆,則單方面認爲對端節點宕機,將該節點標爲PFAIL狀態。經過節點之間交換信息收集到quorum個節點都認爲這個節點爲PFAIL,則將該節點標記爲FAIL,而且將其發送給其餘全部節點,其餘全部節點收到後當即認爲該節點宕機。從這裏能夠看出,主宕機後,至少cluster-node-timeout時間內該主所負責的Slot的讀寫服務不可用。
3)經過代理服務器實現數據分片
此方式是藉助一個代理服務器實現數據分片,客戶端直接與proxy聯繫,proxy計算集羣節點信息,並把請求發送到對應的集羣節點。下降了客戶端的複雜度,須要proxy收集集羣節點信息。Twemproxy是twitter開源的,實現這一功能的proxy。這個實現方式在客戶端和服務器之間加了一個proxy,但這是在redis 3.0穩定版本出來以前官方推薦的方式。結合redis-sentinel的HA方案,是個不錯的組合。
參考:http://www.zhizhihu.com/html/y2014/4590.html
http://www.cnblogs.com/foxmailed/p/3630875.html
http://itindex.net/detail/51037-redis-%E9%9B%86%E7%BE%A4
原文連接:http://www.javashuo.com/article/p-zeolisey-kc.html