1. 程式人生 > >redis叢集搭建

redis叢集搭建

Redis叢集

基本介紹

Redis 叢集是一個可以在多個 Redis 節點之間進行資料共享的設施installation

Redis 叢集不支援那些需要同時處理多個鍵的 Redis 命令, 因為執行這些命令需要在多個 Redis 節點之間移動資料, 並且在高負載的情況下, 這些命令將降低Redis叢集的效能, 並導致不可預測的行為。

Redis 叢集通過分割槽partition來提供一定程度的可用性availability: 即使叢集中有一部分節點失效或者無法進行通訊, 叢集也可以繼續處理命令請求。

Redis叢集提供了以下兩個好處:

  • 將資料自動切分split到多個節點的能力。
  • 當叢集中的一部分節點失效或者無法進行通訊時, 仍然可以繼續處理命令請求的能力。

叢集原理

redis-cluster架構圖

redis-cluster架構圖

  1. 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。

  2. 節點的fail是通過叢集中超過半數的節點檢測失效時才生效。

  3. 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。

  4. redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value

Redis叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點

redis-cluster投票:容錯

redis-cluster投票:容錯

  1. 投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超時(cluster-node-timeout),認為當前master節點掛掉.

  2. 什麼時候整個叢集不可用(cluster_state:fail

    )?

    • 如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完整時進入fail狀態. 
      • redis-3.0.0.rc1加入cluster-require-full-coverage引數,預設關閉,開啟叢集相容部分失敗.
    • 如果叢集超過半數以上master掛掉,無論是否有slave,叢集進入fail狀態

叢集搭建

             Redis 叢集中至少需要有三個節點。要保證叢集的高可用性,需要每個節點有一個備份節點

             所以redis叢集至至少需要6臺伺服器,在這裡就在一臺機器上搭建6個redis 修改埠為7001-7006

在local目錄下面建立 redis-cluster 目錄:mkdir redis-cluster

複製 redis/bin/ 到 redis-cluster/redis01: cp -r redis/bin/ redis-cluster/redis01

                                                               cd redis-cluster/redis01 檢視是否存在dump.rdb(資料庫快照檔案)

dump.rdb存在的話刪除此檔案: rm -rf dump.rdb

編輯 redis.conf: vim redis.conf 修改埠為7001

放開cluster-enabled yes的註釋:開啟叢集模式

複製redis01 到其他5份: cp -r redis01/ redis02

修改各自對應的埠:vim redis02/redis.conf 

重複上面操作5次 修改每個redis.conf的埠

啟動每個服務太複雜了,建立啟動所有服務的指令碼:vim start-all.sh

下面貼出命令,方便複製:

cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

檢視start-all.sh 許可權不足 

新增許可權:chmod +x start-all.sh

啟動服務:./start-all.sh

到這裡服務啟動完成

Ruby安裝:

使用ruby指令碼搭建叢集,需要ruby的執行環境

檢視是否安裝ruby:

安裝ruby:

yum install ruby

yum install rubygems

上傳ruby需要的腳步軟體到伺服器

安裝指令碼:gem install redis-3.0.0.gem

進入redis-3.0.0 src目錄:

複製*.rb到redis-cluster目錄:cp *.rb /usr/local/redis-cluster/

redis-cluster應該多了個檔案:

使用ruby建立叢集:

replicas 後面的數字表示每個redis節點有幾個備份節點  我們這裡就一份 所以為1

./redis-trib.rb create --replicas 1  192.168.1.118:7001 192.168.1.118:7002 192.168.1.118:7003
192.168.1.118:7004 192.168.1.118:7005 192.168.1.118:7006

上圖顯示了6個節點 , 同時 7004 為7001的從節點,7005為7002從節點 ,7006為7003的從節點 以及7001 7002 7003各自的槽位

下面我們輸入yes繼續

到這裡叢集就搭建完畢了