天天看點

【redis學習(二)】手把手教你windows下的redis安裝以及叢集搭建

上一篇已經介紹了 windows下的redis安裝

首先介紹一下叢集的概念

Redis叢集介紹

Redis 叢集是一個提供在多個Redis間節點間共享資料的程式集。

Redis叢集并不支援處理多個keys的指令,因為這需要在不同的節點間移動資料,進而達不到像Redis那樣的性能,在高負載的情況下可能會導緻不可預料的錯誤.

Redis 叢集通過分區來提供一定程度的可用性,在實際環境中當某個節點當機或者不可達的情況下繼續處理指令. Redis 叢集的優勢:

  • 自動分割資料到不同的節點上。
  • 整個叢集的部分節點失敗或者不可達的情況下能夠繼續處理指令。

Redis 叢集的資料分片

Redis 叢集沒有使用一緻性hash, 而是引入了 哈希槽的概念.

Redis 叢集有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽.叢集的每個節點負責一部分hash槽,舉個例子,比如目前叢集有3個節點,那麼:

  • 節點 A 包含 0 到 5500号哈希槽.
  • 節點 B 包含5501 到 11000 号哈希槽.
  • 節點 C 包含11001 到 16384号哈希槽.

這種結構很容易添加或者删除節點. 比如如果我想新添加個節點D, 我需要從節點 A, B, C中得部分槽到D上. 如果我像移除節點A,需要将A中得槽移到B和C節點上,然後将沒有任何槽的A節點從叢集中移除即可. 由于從一個節點将哈希槽移動到另一個節點并不會停止服務,是以無論添加删除或者改變某個節點的哈希槽的數量都不會造成叢集不可用的狀态.

Redis 叢集的主從複制模型

為了使在部分節點失敗或者大部分節點無法通信的情況下叢集仍然可用,是以叢集使用了主從複制模型,每個節點都會有N-1個複制品.

在我們例子中具有A,B,C三個節點的叢集,在沒有複制模型的情況下,如果節點B失敗了,那麼整個叢集就會以為缺少5501-11000這個範圍的槽而不可用.

然而如果在叢集建立的時候(或者過一段時間)我們為每個節點添加一個從節點A1,B1,C1,那麼整個叢集便有三個master節點和三個slave節點組成,這樣在節點B失敗後,叢集便會選舉B1為新的主節點繼續服務,整個叢集便不會因為槽找不到而不可用了

不過當B和B1 都失敗後,叢集是不可用的.

Redis 一緻性保證

Redis 并不能保證資料的強一緻性. 這意味這在實際中叢集在特定的條件下可能會丢失寫操作.

第一個原因是因為叢集是用了異步複制. 寫操作過程:

  • 用戶端向主節點B寫入一條指令.
  • 主節點B向用戶端回複指令狀态.
  • 主節點将寫操作複制給他得從節點 B1, B2 和 B3.

主節點對指令的複制工作發生在傳回指令回複之後, 因為如果每次處理指令請求都需要等待複制操作完成的話, 那麼主節點處理指令請求的速度将極大地降低 —— 我們必須在性能和一緻性之間做出權衡。 注意:Redis 叢集可能會在将來提供同步寫的方法。 Redis 叢集另外一種可能會丢失指令的情況是叢集出現了網絡分區, 并且一個用戶端與至少包括一個主節點在内的少數執行個體被孤立。

舉個例子 假設叢集包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個節點, 其中 A 、B 、C 為主節點, A1 、B1 、C1 為A,B,C的從節點, 還有一個用戶端 Z1 假設叢集中發生網絡分區,那麼叢集可能會分為兩方,大部分的一方包含節點 A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節點 B 和用戶端 Z1 .

Z1仍然能夠向主節點B中寫入, 如果網絡分區發生時間較短,那麼叢集将會繼續正常運作,如果分區的時間足夠讓大部分的一方将B1選舉為新的master,那麼Z1寫入B中得資料便丢失了.

注意, 在網絡分裂出現期間, 用戶端 Z1 可以向主節點 B 發送寫指令的最大時間是有限制的, 這一時間限制稱為節點逾時時間(node timeout), 是 Redis 叢集的一個重要的配置選項:

下面我們來搭建叢集

1. 安裝Ruby并配置環境

首先我們來配置環境變量 SSL_CERT_FILE 

首先在這裡下載下傳證書 http://curl.haxx.se/ca/cacert.pem, 然後再環境變量裡設定 SSL_CERT_FILE 這個環境變量,并指向 cacert.pem 檔案。(我這裡在D盤建了一個檔案夾rubyinstaller,把檔案放在了裡面)

【redis學習(二)】手把手教你windows下的redis安裝以及叢集搭建

環境配置好之後安裝Ruby,Windows可以安裝RubyInstaller,下載下傳位址: 

https://rubyinstaller.org/

下載下傳之後解壓 解壓完之後會有一個Ruby22檔案夾,然後進入檔案夾中打開指令行依次輸入指令進行配置

ruby -v

gem -v

gem sources

gem install redis

【redis學習(二)】手把手教你windows下的redis安裝以及叢集搭建

2.搭建叢集

要讓叢集正常運作至少需要三個主節點,不過在剛開始試用叢集功能時, 強烈建議使用六個節點: 其中三個為主節點, 而其餘三個則是各個主節點的從節點。 這裡我們搭建一個僞分布式,使用6個redis執行個體來模拟

1.)首先我們再D盤redis檔案夾下面建立6個檔案夾 7000~7005 依次代表使用端口号7000~7005

【redis學習(二)】手把手教你windows下的redis安裝以及叢集搭建

2.)我們在7000~7005這6個檔案夾下面建立 redis.conf 檔案

然後在裡面寫入以下内容, 建議寫完一個後直接複制粘貼,不過記得把端口号改成相應檔案夾的端口号

port 7000(對應檔案夾端口号)
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
      
然後redis檔案夾裡面的redis-server.exe依次複制粘貼到7000~7005檔案夾      
如圖      
3.)依次啟動6個redis服務      
在各個檔案夾下面打開指令行        
輸入指令 (啟動之後不要關了)      
redis-server.exe redis.conf
           
【redis學習(二)】手把手教你windows下的redis安裝以及叢集搭建

4.)建立啟動叢集

由于建立啟動叢集需要redis-trib.rb檔案,它是一個 Ruby 程式, 這個程式通過向執行個體發送特殊指令來完成建立新叢集,檢查叢集或者對叢集進行重新分片(reshared)等工作。

Windows的redis安裝檔案中是沒有這個檔案的,我們需要去官網下載下傳Redis,官網的Redis是Linux版本,在其源碼src檔案夾下,将redis-trib.rb拷貝到本機中Redis的安裝目錄中

大家也可以去這裡下載下傳http://download.csdn.net/download/a447332241/9930662

最後進入redis-trib.rb檔案所在目錄執行: 

ruby redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
           

這個指令在這裡用于建立一個新的叢集, 選項–replicas 1 表示我們希望為叢集中的每個主節點建立一個從節點。之後跟着的其他參數則是這個叢集執行個體的位址清單,3個master3個slave

redis-trib 會列印出一份預想中的配置給你看, 如果你覺得沒問題的話, 就可以輸入 yes ,redis-trib 就會将這份配置應用到叢集當中,讓各個節點開始互相通訊。

【redis學習(二)】手把手教你windows下的redis安裝以及叢集搭建

這樣我們的叢集就搭建好了 .

5.)測試 

 在redis檔案夾下面 輸入 redis-cli.exe -h 127.0.0.1 -p 7001 -c

 代表我們連接配接7001端口的redis服務

【redis學習(二)】手把手教你windows下的redis安裝以及叢集搭建

Redis叢集資料配置設定政策:

采用一種叫做哈希槽 (hash slot)的方式來配置設定資料,redis cluster 預設配置設定了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然後将這個key分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384

注意的是:必須要3個以後的主節點,否則在建立叢集時會失敗,三個節點分别承擔的slot 區間是:

 節點A覆寫0-5460;

    節點B覆寫5461-10922;

    節點C覆寫10923-16383

是以上圖中按照redis cluster的哈希槽算法:CRC16(‘name’)%16384 

被配置設定到了7002端口的redis服務上。

至此,Redis Cluster在Windows上的配置就完成了

redis中文文檔 http://www.redis.cn/topics/cluster-tutorial.html

下篇我們将跟利用jedis跟Spring進行整合

繼續閱讀