1. 程式人生 > >Redis叢集環境搭建-cluster模式

Redis叢集環境搭建-cluster模式

一、Redis的叢集方式使用slaveof命令和哨兵模式,會產生中心化的問題,即客戶端所有的寫請求都由master節點處理,並且master節點只有一個,這個節點處理了寫請求和複製資料到slave節點的功能,致使master節點很容易崩潰掉,最好的方式就是使用多個master節點來搭建叢集。

二、

1、安裝Redis

將redis-3.2.1.tar.gz安裝包放到 /usr/local目錄下

tar -zxvf redis-3.2.1.tar.gz         解壓安裝包

ll                                                    檢視解壓出的Redis資料夾

cd redis-3.2.1/                             進入解壓出的Redis資料夾

make                                            編譯

cd src/                                           進入src目錄

make install                                 安裝Redis

彈出如下命令即安裝成功

2、建立節點目錄

mkdir /usr/local/redis-cluster                       在/usr/local目錄下建立redis-cluster用來儲存節點資訊

mkdir /usr/local/redis-cluster7000            在redis-cluster下以次建立7000-7005

mkdir /usr/local/redis-cluster7001

mkdir /usr/local/redis-cluster7002

mkdir /usr/local/redis-cluster7003

mkdir /usr/local/redis-cluster7004

mkdir /usr/local/redis-cluster7005

mkdir /usr/local/redis-clusterconf              建立conf資料夾用來儲存配置檔案

mkdir /usr/local/redis-cluster

/ log                 建立log資料夾用來儲存log檔案

建立成功後如下

3、編輯配置檔案

在conf目錄下新建redis-base.conf配置檔案,這個是6個redis都用到的且相同的配置,故抽離出來了,這個檔案是redis安裝目錄下的redis.conf的備份,將每個節點的配置檔案中的配置項都刪除掉或註釋掉了,這樣讓這些配置項只在節點的配置檔案中進行配置。最後,修改# cluster-enabled yes,去掉註釋#,開啟叢集;修改daemonize no為yes,開啟守護程序,使redis在後臺執行;註釋bind配置,要不然在宿主機使用jedis客戶端連線虛擬機器上的redis叢集失敗,修改protected-mode配置為no,否則需要配置連線密碼,並每次連線的時候都需要在程式碼裡設定上密碼,這樣配置則不需要了,可直接用宿主機訪問redis叢集。

在conf目錄下新建redis-7000.conf配置檔案,內容如下

include /usr/local/redis-cluster/conf/redis-base.conf
pidfile /usr/local/redis-cluster/7000/redis-7000.pid
port 7000
dbfilename dump-7000.rdb
dir /usr/local/redis-cluster/7000
cluster-config-file nodes-7000.conf
appendfilename "appendonly-7000.aof"

同樣新建7001.conf-7005.conf檔案,只不過將7000都換成對應內容。

4、依次開啟6個redis例項

進入到redis的安裝目錄

cd /usr/local/redis-3.2.1/src/

啟動7000 Redis例項

./redis-server /usr/local/redis-cluster/conf/redis-7000.conf 

依次啟動其他5個例項

[[email protected] src]# cd /usr/local/redis-3.2.1/src/
[[email protected] src]# ./redis-server /usr/local/redis-cluster/conf/redis-7000.conf 
[[email protected] src]# ./redis-server /usr/local/redis-cluster/conf/redis-7001.conf 
[[email protected] src]# ./redis-server /usr/local/redis-cluster/conf/redis-7002.conf 
[[email protected] src]# ./redis-server /usr/local/redis-cluster/conf/redis-7003.conf 
[[email protected] src]# ./redis-server /usr/local/redis-cluster/conf/redis-7004.conf 
[[email protected] src]# ./redis-server /usr/local/redis-cluster/conf/redis-7005.conf

使用ps -ef | grep redis命令檢視6個redis例項的啟動情況,正常啟動如下圖

5、執行叢集建立命令,建立叢集

進入到redis的安裝目錄

cd /usr/local/redis-3.2.1/src/

建立Redis叢集

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

很多帖子中使用下面的命令

./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

雖然這個命令確實可以在本地建立成功叢集,但是!!!這樣做會致使宿主機使用Jedis連線虛擬機器的叢集時,報錯:Too many cluster redirections redis。把這個命令中的ip換成虛擬機器的IP就可以成功避免這個錯誤!!

報錯:/usr/bin/env: ruby: No such file or directory 意思是沒有安裝ruby模組,那就安裝上ruby模組(這樣的安裝方式需要網路能翻牆,要不然長時間沒反應,網路暢通的話,1分鐘就安裝上了)

yum install ruby

再執行建立命令,報錯:
./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24 意思是缺少提示缺少rubygems元件,使用yum安裝

yum install rubygems

再執行建立命令,報錯:
/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介面,使用gem安裝

 gem install redis

再執行建立命令,成功,如下:


輸入yes,完成配置。如下圖


至此,6個Redis的叢集環境搭建成功。從上面的輸出看,7000是master對應的slave是7003,7001是master對應的slave是7004,7002是master對應的slave是7005。解釋一下建立叢集的命令 replicas 1 的意思是,為每個節點建立一個副本(即:slave),這就導致了形成了3個master和3個slave。另外,利用redis-trib建立cluster的操作,只需要一次即可,假設系統關機,把所有6個節點全都關閉後,下次重啟後,即自動進入cluster模式,不用再使用redis-trib.rb create。

使用ps -ef | grep redis 檢視叢集執行情況,會發現最後面會多了cluster的標註,cluster中文就是叢集的意思。


進入到redis的安裝目錄的src目錄/usr/local/redis-3.2.1/src執行 ./redis-trib.rb check 127.0.0.1:7000

檢視哪些節點是master,哪些節點是slave,主從關係,以及每個節點有多少個slot(槽)

除了check引數外,還有一個常用的引數info,命令如下

./redis-trib.rb info 127.0.0.1:7000

它會把所有的master資訊輸出,包括這個master上有幾個快取key,有幾個slave,所有master上的keys合計,以及平均每個slot上有多少個key,想要了解更多redis-trib指令碼的其他引數,可以用

./redis-trib.rb help

上面已經多次出現了slot,解釋一下這個的概念

如上圖,redis-cluster把整個叢集的儲存空間劃分為16384個slot(譯為:插槽?),當6個節點分為3主3從時,相當於整個cluster中有3組HA的節點,3個master會平均分攤所有slot,每次向cluster中的key做操作時(比如:讀取/寫入快取),redis會對key值做CRC32演算法處理,得到一個數值,然後再對16384取模,通過餘數判斷該快取項應該落在哪個slot上,確定了slot,也就確定了儲存在哪個master節點上,當cluster擴容或刪除節點時,只需要將slot重新分配即可(即:把部分slot從一些節點移動到其它節點)。

6、redis-cli客戶端操作

進入到redis的安裝目錄的src目錄/usr/local/redis-3.2.1/src執行

./redis-cli -c -h localhost -p 7000 引數-c,表示進入cluster模式,新增一個快取:
localhost:7000> set user1 jimmy
-> Redirected to slot [8106] located at 127.0.0.1:7001
OK
127.0.0.1:7001> 
從第二行的輸出,可以看出user1這個快取通過計算後,落在了8106這個slot上,並且這個slot屬於7001這個master節點。 至此,咱們的redis叢集就介紹完畢。