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-cluster/ 7000 在redis-cluster下以次建立7000-7005
mkdir /usr/local/redis-cluster/ 7001
mkdir /usr/local/redis-cluster/ 7002
mkdir /usr/local/redis-cluster/ 7003
mkdir /usr/local/redis-cluster/ 7004
mkdir /usr/local/redis-cluster/ 7005
mkdir /usr/local/redis-cluster/ conf 建立conf資料夾用來儲存配置檔案
mkdir /usr/local/redis-cluster
建立成功後如下
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中文就是叢集的意思。
檢視哪些節點是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叢集就介紹完畢。