Redis3.0.6集羣搭建

建立一個RedisCluster以前,咱們須要有一些以cluster模式運行的Redis實例,這是由於cluster模式下Redis實例將會開啓cluster的特徵和命令。java

如今我有2臺Vbox搭建的CentOS6虛擬機【CentOS1(192.168.56.101)和CentOS2(192.168.56.102)】,準備在此上搭建Redis集羣。node

因爲最小的Redis集羣須要3個Master節點,本次測試使用另外3個節點做爲備份的節點(Replicas),因而這次搭建須要6個Redis實例。因爲可在同一臺機器上運行多個Redis實例,所以我將在CentOS1上運行如下實例:redis

192.168.56.101:7000
192.168.56.101:7001
192.168.56.101:7002

並在CentOS2上運行如下實例:shell

192.168.56.102:7003
192.168.56.102:7004
192.168.56.102:7005

1. 下載Redis,目前的stable版本爲3.0.6:ruby

http://redis.io/download 服務器

2. 安裝Redisapp

tar zxvf redis-3.0.6.tar.gz
cd redis-3.0.6
make

安裝完成後,redis-3.0.6/src文件夾下會出現redis-server、redis-cli等可執行文件,稍後將使用。工具

3. 修改配置文件測試

因爲須要在CentOS1上運行多個實例,爲了便於管理,在CentOS1上創建/home/user/Software/redis-cluster文件夾,並分別建立7000、7001和7002這三個子文件夾:ui

而後分別拷貝redis-3.0.6/redis.conf到這三個子文件夾中。redis.conf是redis服務器啓動的必要配置文件,分別在這幾個文件夾中打開該文件,修改如下選項(這幾個選項是搭建Redis集羣的必須選項),其它的保持默認便可:

#注意每一個子文件夾下的配置中,端口號不一樣
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

在redis.conf中,有對這些選項的詳細說明,這裏不贅述。

最後拷貝redis-3.0.6/src/redis-server文件到這幾個子文件夾中。

4. 啓動Redis

在這3個文件夾中分別啓動Redis:

./redis-server redis.conf

能夠經過進程命令來查看啓動結果

從每一個實例的啓動日誌(redis.conf文件中的logfile選項能夠配置日誌文件)中,能夠看到每個節點都給本身分配了一個新的ID:

這個ID將被該Redis實例做爲集羣中的惟一名字永久使用,節點之間會互相記住這個名字。

5. 建立集羣

在建立Redis集羣前,在CentOS2機器中也須要按照步驟1~4完成相應的配置並運行Redis實例。

如今CentOS1上的3個Redis實例和CentOS2上的3個Redis實例都已經啓動。目前這些實例雖然都開啓了cluster模式,可是彼此還不認識對方,接下來能夠經過Redis集羣的命令行工具redis-trib.rb來完成集羣建立。redis-trib.rb是一個Ruby寫的可執行程序,它能夠完成建立集羣、爲已存在的集羣從新分片等功能。

而要想運行ruby程序,則須要系統先安裝ruby運行環境:

sudo yum install ruby

接下來運行如下命令(在CentOS1和CentOS2上運行都可):

./redis-trib.rb create --replicas 1 \
    192.168.56.101:7000 192.168.56.101:7001 192.168.56.101:7002 \
    192.168.56.102:7003 192.168.56.102:7004 192.168.56.102:7005

此時會遇到如下問題:

提示缺乏rubygems組件,可使用yum來安裝該組件:

sudo yum -y install rubygems

再次運行建立Redis集羣的命令,還會報如下錯誤:

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25

搜索了一下,是由於缺乏redis的ruby接口,能夠經過如下命令安裝:

sudo gem install redis

若是安裝時出現錯誤,也能夠下載文件後進行離線安裝,下載地址:http://rubygems.org/gems/redis/versions,選擇合適的版本,而後安裝:

sudo gem install -l /mnt/Share/redis-3.0.6.gem

接下來再次運行建立Redis集羣的命令:

上圖中:

create爲redis-trib.rb腳本的子命令,表示建立redis集羣

--replicas 1表示建立的集羣有1套數據備份

後面的參數爲多個redis實例地址,表示使用那些實例來建立節點

左邊的「M:」表示該節點是master節點,相應的「S:」表示該節點爲slave節點


在本次測試中,有7000~7005共6個節點,有一組節點是備份,那麼很顯然會有3個master和3個replica,這正好符合一開始的要求。從上圖中能夠看到,端口號爲7000、7003和7004的三個節點被選爲master,另外三個節點則成爲replica。而下圖則展現了redis的16384個數據槽(data slot)在三個master節點上的分佈狀況:

6. 測試集羣

redis目前的客戶端實現並很少,接下來咱們用自帶的redis-cli工具來測試搭建好的集羣。

最簡單的測試集羣是使用redis-cli鏈接上redis後使用cluster命令(更多命令請參見:http://redis.io/commands):

cluster info,查看集羣信息:

cluster nodes:查看集羣中的節點信息:

下面使用redis-cli工具進行數據的讀寫操做:

開始鏈接redis的時候沒有加入-c選項,則只能在該節點上存取,舉個例子:上圖中一開始我登陸的是7002端口的redis實例,而後

set i 0

這一句給i設置值爲0,經集羣計算後,這個i應該落在15759這個slot中,這個slot又在7004這個redis實例上,因而準備跳轉到7004的redis實例上,因爲沒有開啓集羣模式,此次跳轉失敗了,值也就沒有寫進redis。

第二次鏈接的仍是7002,但這一次使用-c選項打開了集羣模式,後續的存取無論落在哪個節點上,都能跳轉過去並正確的讀寫。藍色方框的變化展現了鏈接跳轉的過程,redis集羣中的讀寫都會發生在指定的slot上,所以都會發生相應的跳轉。


另外,因爲每一個節點都會記住集羣中其餘節點的名字以及數據槽的分佈狀況,咱們能夠打開每一個redis實例的文件夾查看其nodes.conf(redis.conf文件中的cluster-config-file選項來配置)文件,文件內容大體相同,僅僅是節點列表的順序不一樣而已。


參考頁面:

http://redis.io/topics/cluster-tutorial

http://hot66hot.iteye.com/blog/2050676/

http://blog.csdn.net/xu470438000/article/details/42971091

相關文章
相關標籤/搜索