1. 程式人生 > >redis學習之redis3.0.x叢集搭建

redis學習之redis3.0.x叢集搭建

寫在前面

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.下載和解包

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一定會逐漸完善成熟的!