Redis3.0.6集群搭建
創建一個RedisCluster之前,我們需要有一些以cluster模式運行的Redis實例,這是因為cluster模式下Redis實例將會開啟cluster的特征和命令。
現在我有2臺Vbox搭建的CentOS6虛擬機【CentOS1(192.168.56.101)和CentOS2(192.168.56.102)】,準備在此上搭建Redis集群。
由于最小的Redis集群需要3個Master節點,本次測試使用另外3個節點作為備份的節點(Replicas),于是此次搭建需要6個Redis實例。由于可在同一臺機器上運行多個Redis實例,因此我將在CentOS1上運行以下實例:
192.168.56.101:7000 192.168.56.101:7001 192.168.56.101:7002
并在CentOS2上運行以下實例:
192.168.56.102:7003 192.168.56.102:7004 192.168.56.102:7005
1. 下載Redis,目前的stable版本為3.0.6:
2. 安裝Redis
tar zxvf redis-3.0.6.tar.gz cd redis-3.0.6 make make install
安裝完成后,redis-3.0.6/src文件夾下會出現redis-server、redis-cli等可執行文件,稍后將使用。
3. 修改配置文件
由于需要在CentOS1上運行多個實例,為了便于管理,在CentOS1上建立/home/user/Software/redis-cluster文件夾,并分別創建7000、7001和7002這三個子文件夾:
然后分別拷貝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實例地址,表示使用那些實例來創建節點
在本次測試中,有7000~7005共6個節點,很顯然會有3個master和3個replica。從上圖中可以看到,端口號為7000、7003和7004的三個節點被選為master,另外三個節點則成為replica。而下圖則展示了redis的16384個槽在三個master節點上的分布情況:
6. 測試集群
redis目前的客戶端實現并不多,接下來我們用自帶的redis-cli工具來測試搭建好的集群。
最簡單的測試集群是使用redis-cli連接上redis后使用cluster命令:
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