Centos7下redis cluster集群(Redis401-Cluster-4Master-5Slave)虛擬機環境下載

本博主配置好的Centos7下redis cluster集群(Redis401-Cluster-4Master-5Slave)虛擬機環境下載,鏈接:https://pan.baidu.com/s/11Y2K8E_Az0ZlyDSedEo0Tw
提取碼:2ftc 下載後,用Vmware Workstaion打開,即可以正常使用
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關係數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。 [1]
Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。由於完全實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。
redis的官網地址,非常好記,是redis.io。(特意查了一下,域名後綴io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地)
目前,Vmware在資助着redis項目的開發和維護。

一般來說,redis主從和mysql主從目的差不多,但redis主從配置很簡單,主要在從節點配置文件指定主節點ip和端口,比如:slaveof 192.168.10.10 6379,然後啟動主從,主從就搭建好了。redis主從中如果主節點發生故障,不會自動切換,需要藉助redis的Sentinel(哨兵模式)或者keepalive來實現主的故障轉移。

今天介紹下redis cluster集群模式:
redis集群是一個無中心的分佈式redis存儲架構,可以在多個節點之間進行數據共享,解決了redis高可用、可擴展等問題,redis集群提供了以下兩個好處:
1)將數據自動切分(split)到多個節點
2)當集群中的某一個節點故障時,redis還可以繼續處理客戶端的請求。

一個 Redis 集群包含 16384 個哈希槽(hash slot),數據庫中的每個數據都屬於這16384個哈希槽中的一個。集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽。集群中的每一個節點負責處理一部分哈希槽。
集群中的主從複製
集群中的每個節點都有1個至N個複製品,其中一個為主節點,其餘的為從節點,如果主節點下線了,集群就會把這個主節點的一個從節點設置為新的主節點,繼續工作。這樣集群就不會因為一個主節點的下線而無法正常工作。

==========從Redis3.x開始已經支持Load Balance功能了===========

Redis Cluster集群功能推出已經有一段時間了。在單機版的Redis中,每個Master之間是沒有任何通信的,所以一般在Jedis客戶端或者Codis這樣的代理中做Pre-sharding。按照CAP理論來說,單機版的Redis屬於保證CP(Consistency & Partition-Tolerancy)而犧牲A(Availability),也就說Redis能夠保證所有用戶看到相同的數據(一致性,因為Redis不自動冗餘數據)和網絡通信出問題時,暫時隔離開的子系統能繼續運行(分區容忍性,因為Master之間沒有直接關係,不需要通信),但是不保證某些結點故障時,所有請求都能被響應(可用性,某個Master結點掛了的話,那麼它上面分片的數據就無法訪問了)。

有了Cluster功能後,Redis從一個單純的NoSQL內存數據庫變成了分佈式NoSQL數據庫,CAP模型也從CP變成了AP。也就是說,通過自動分片和冗餘數據,Redis具有了真正的分佈式能力,某個結點掛了的話,因為數據在其他結點上有備份,所以其他結點頂上來就可以繼續提供服務,保證了Availability。然而,也正因為這一點,Redis無法保證曾經的強一致性了。這也是CAP理論要求的,三者只能取其二。

本博主配置好的Centos7下redis cluster集群(Redis401-Cluster-4Master-5Slave)虛擬機環境下載,鏈接:https://pan.baidu.com/s/11Y2K8E_Az0ZlyDSedEo0Tw
提取碼:2ftc 下載後,用Vmware Workstaion打開,即可以正常使用

Redis Cluster 是Redis的集群實現,內置數據自動分片機制,集群內部將所有的key映射到16384個Slot中,集群中的每個Redis Instance負責其中的一部分的Slot的讀寫。集群客戶端連接集群中任一Redis Instance即可發送命令,當Redis Instance收到自己不負責的Slot的請求時,會將負責請求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到後自動將原請求重新發往這個地址,對外部透明。一個Key到底屬於哪個Slot由crc16(key) % 16384 決定。在Redis Cluster里對於負載均衡和HA相關都已經支持的相當完善了。

負載均衡(Load Balance):集群的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的讀寫服務不可用。

Redis Cluster的特點如下:

  • 節點自動發現
  • slave->master選舉,集群容錯
  • Hot resharding:在線分片
  • 集群管理:clusterxxx
  • 基於配置(nodes-port.conf)的集群管理
  • ASK 轉向/MOVED轉向機制
  • 布署無需指定master
  • 可以支持超過1,000台節點的集群

======Redis-Cluster採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接======
redis-cluster架構圖如下:

其結構特點:

  • 所有的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放到哪個桶中。

redis cluster集群是為了降低單節點或單純主從redis的壓力,主主節點之間是不存在同步關係的,各主從之間的數據存在同步關係。有多少主節點,就會把16384個哈希槽(hash slot)平均分配到這些主節點上當往redis里寫入數據時,會根據哈希算法算出這個數的哈希槽,決定它放到哪一個主節點上,然後這個主節點的從節點去自動同步。在客戶端隨便連接一個主節點即可,主節點之間會進行內部跳轉!當取對應數據時,各節點之間會自動跳轉到所取數據所在的主節點上!

1)redis cluster節點分配
假設現有有三個主節點分別是:A、 B、C ,它們可以是一台機器上的三個端口,也可以是三台不同的服務器。那麼,採用哈希槽 (hash slot)的方式
來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:
節點A         覆蓋0-5460;
節點B         覆蓋5461-10922;
節點C        覆蓋10923-16383.

獲取數據:
如果存入一個值,按照redis cluster哈希槽的算法: CRC16(‘key’)%16384 = 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

同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了。

2)Redis Cluster主從模式
redis cluster 為了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據
備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集群不會掛掉。

上面那個例子里, 集群有A、B、C三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個集群了。A和C的slot也無法訪問。
所以在集群建立的時候,一定要為每個主節點都添加了從節點, 比如像這樣, 集群包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B掛掉系統也
可以繼續正確工作。B1節點替代了B節點,所以Redis集群將會選擇B1節點作為新的主節點,集群將會繼續正確地提供服務。 當B重新開啟後,它就會變成B1的從節點。

不過需要注意,如果節點B和B1同時掛了,Redis集群就無法繼續正確地提供服務.

本博主配置好的Centos7下redis cluster集群(Redis401-Cluster-4Master-5Slave)虛擬機環境下載,鏈接:https://pan.baidu.com/s/11Y2K8E_Az0ZlyDSedEo0Tw
提取碼:2ftc 下載後,用Vmware Workstaion打開,即可以正常使用

 

 

 

 

以下文章點擊率最高

Loading…

     

如果這文章對你有幫助,請掃左上角微信支付-支付寶,給於打賞,以助博客運營

發表評論

您的電子郵箱地址不會被公開。 必填項已用*標註