Redis學習之 Redis3.0.x 叢集搭建

wudalang_gd的部落格發表於2016-08-09

寫在前面

2015年2月,Redis3.0.0 釋出,redis3.0版本之後支援Cluster,關於redis叢集的介紹,瞭解請看 redis中文簡介 。

我準備在一臺linux中來部署redis叢集,因為叢集的執行需要6臺服務才能正常執行,所以我在一臺linux服務上建立6個節點,用來模擬3主3從這種偽分散式叢集。redis3.0及之後的releases版本,大家可以直接訪問redis.io官網,下載redis.tar.gz。

叢集搭建

1.下載和解包

cd /usr/local/
wget http://download.redis.io/releases/redis-3.0.3.tar.gz
(大家可以選擇自己想安裝的releases版本)

tar -zxvf redis-3.0.3.tar.gz
mv redis-3.0.3 redis

2.編譯安裝

cd redis
make && make install

有些人在這裡可能會碰到一個錯誤導致編譯不過(如下)

make[1]: Entering directory /redis/src' 
CC adlist.o 
In file included from adlist.c:34: 
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory 
zmalloc.h:55:2: error: #error "Newer version of jemalloc required" 
make[1]: *** [adlist.o] Error 1 
make[1]: Leaving directory/redis/src’ 
make: * [all] Error 2Error 2

原因是沒有安裝jemalloc記憶體分配器,可以安裝jemalloc 或 直接 輸入make MALLOC=libc && make install

3. 建立redis節點

在一臺linux服務上建立6個節點,3主3從。

cd /usr/local/
mkdir redis_cluster //建立叢集目錄
mkdir 7000 7001 7002 7003 7004 7005  //分別代表六個節點 其對應埠 7000 7001 7002 7003 7004 7005

下面建立7000節點為例,其他節點大家按此例操作即可,

cd ./7000
cp /usr/local/redis/redis.conf ./ //拷貝到當前7000目錄
vi redis.conf //編輯配置 主要修改一下幾個引數
daemonize yes //redis後臺執行 
pidfile /var/run/redis_7000.pid //pidfile檔案對應7000 
port 7000 //埠7000 
cluster-enabled yes //開啟叢集 把註釋#去掉 
cluster-config-file nodes.conf //叢集的配置 配置檔案首次啟動自動生成 
cluster-node-timeout 5000 //請求超時 設定5秒夠了 
appendonly yes //aof日誌開啟 有需要就開啟,它會每次寫操作都記錄一條日誌

配置好了,就相應地把這個修改後的配置檔案拷貝到7003 7004 70054 7005 7002 目錄,注意要修改監聽埠port 7001 7002 7003 7004 7005。

接下來,啟動服務,進入節點目錄

依次執行 redis-server redis.conf

可以看到生成了appendonly.aof nodes.conf

這裡寫圖片描述

ps -ef | grep redis 檢視是否啟動成功

這裡寫圖片描述

netstat -tnlp | grep redis 可以看到redis監聽埠

這裡寫圖片描述

4. 建立叢集

前面已經準備好了搭建叢集的redis節點,接下來我們要把這些節點都串連起來搭建叢集。建立叢集需要ruby的環境,官方提供了一個工具:redis-trib.rb (/usr/local/redis/src/redis-trib.rb),所以我們還得安裝ruby.

安裝rubygems元件

yum -y install ruby ruby-devel rubygems rpm-build

接著,載入redis,需要redis和ruby的介面,使用gem 安裝

gem install redis

可是,我卻出了一點問題,但按提示操作後再執行gem install redis 就好啦(如下圖)

這裡寫圖片描述

上面的步驟完事了,接下來執行一下redis-trib.rb

/usr/local/redis/src/redis-trib.rb

這裡寫圖片描述

確認所有的節點都啟動,接下來使用引數create 建立叢集

/usr/local/redis/src/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 表示 自動為每一個master節點分配一個slave節點 上面有6個節點,程式會按照一定規則生成 3個master(主)3個slave(從)

ps:防火牆一定要開放監聽的埠 ,否則會建立失敗。

執行中,提示Can I setthe above configuration? (type’yes’to accept): yes //輸入yes

這裡寫圖片描述

ok,檢視一下 /usr/local/redis/src/redis-trib.rb check 127.0.0.1:7000

這裡寫圖片描述

可以從圖中看到7000,7002被選為master了

至此,叢集已經初步搭建好了。

5. 測試

1)get 和 set資料

redis-cli -c -p 7000

進入命令視窗,直接 set wb wudalang_gd

直接根據hash匹配切換到相應的slot的節點上。

還是要說明一下,redis叢集有16383個slot組成,通過分片分佈到多個節點上,讀寫都發生在master節點。

2)當機測試

假如我們把上面的master為7000或7002的其中一個節點down掉,大家可以再去看一下各個節點的狀態,測試一下,依然沒有問題,會有新的從節點變為master,叢集依然能繼續工作。

原因: redis叢集通過選舉方式進行容錯,保證一臺Server掛了還能跑,這個選舉是全部叢集超過半數以上的Master發現其他Master掛了後,會將其他對應的Slave節點升級成Master.

PS: 超過半數掛了那救不了了,整個叢集就無法工作了。

3)關於一致性 hash

目前還沒什麼公司用redis來做資料庫持久化的吧,我們只是拿來做cache,官網說的很清楚,Redis Cluster is not able to guarantee strong consistency .

寫在最後

網上關於redis叢集的資料真的是很亂,我很多次走入別人挖得坑半天爬不出來,有的人居然在redis3.0.0還沒releases就忽悠人(氣哭~),不過,我相信隨著官方的不斷迭代更新和大家的共同努力,Redis Cluster一定會逐漸完善成熟的!

相關文章