1. 程式人生 > >Redis叢集搭建與維護

Redis叢集搭建與維護

一、概述

    Redis3.0版本之後支援Cluster.

二、redis cluster安裝

    1、下載和解包

cd /usr/local/
wget http://download.redis.io/releases/redis-3.2.1.tar.gz
tar -zxvf ./redis-3.2.1.tar.gz

    2、 編譯安裝

    確認安裝了gcc

yum  install  gcc
cd redis-3.2.1
make MALLOC=libc
make install

建立叢集目錄

我們計劃叢集中 Redis 節點的埠號為 9001-9006 ,埠號即叢集下各例項資料夾。資料存放在 埠號/data 資料夾中。

mkdir /usr/local/redis-cluster
cd redis-cluster/
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data

2.複製執行指令碼

在 /usr/local/redis-cluster 下建立 bin 資料夾,用來存放叢集執行指令碼,並把安裝好的 Redis 的 src 路徑下的執行指令碼拷貝過來。看命令

mkdir redis-cluster/bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof  redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin

3.複製新 Redis 例項

我們現在從已安裝好的 Redis 中複製一個新的例項到 9001 資料夾,並修改 redis.conf 配置。

cp -rf  /usr/local/redis/* /usr/local/redis-cluster/9001

注意,修改 /usr/local/redis-cluster/9001/redis.conf 配置和單點唯一區別是下圖部分,其餘還是常規的這幾項:

port 9001(每個節點的埠號)
daemonize yes
bind 192.168.119.131(綁定當前機器 IP)
dir /usr/local/redis-cluster/9001/data/(資料檔案存放位置)
pidfile /var/run/redis_9001.pid(pid 9001和port要對應)
cluster-enabled yes(啟動叢集模式)
cluster-config-file nodes9001.conf(9001和port要對應)
cluster-node-timeout 15000
appendonly yes

叢集搭建配置重點就是取消下圖中的這三個配置的註釋:

再複製出五個新 Redis 例項

我們已經完成了一個節點了,其實接下來就是機械化的再完成另外五個節點,其實可以這麼做:把 9001 例項 複製到另外五個資料夾中,唯一要修改的就是 redis.conf 中的所有和埠的相關的資訊即可,其實就那麼四個位置。開始操作,看圖:

cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9004
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9005
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9006

修改 9002-9006 的 redis.conf 檔案

其實非常簡單了,你通過搜尋會發現其實只有四個點需要修改,我們全域性替換下吧,進入相應的節點資料夾,做替換就好了。命令非常簡單,看圖:

vim redis.conf
:%s/9001/9002/g

其實我們也就是替換了下面這四行:

port 9002
dir /usr/local/redis-cluster/9002/data/
cluster-config-file nodes-9002.conf
pidfile /var/run/redis_9002.pid

到這裡,我們已經把最基本的環境搞定了,接下來就是啟動了。

 1.啟動 9001-9006 六個節點

/usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9002/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9003/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9004/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9005/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9006/redis.conf

可以檢查一下是否啟動成功:netstate -nltp | grep redis

2.隨便找一個節點測試試

/usr/local/redis-cluster/bin/redis-cli -h 192.168.119.131 -p 9001

set name mafly

連線成功了,但好像報錯了阿???

這是因為雖然我們配置並啟動了 Redis 叢集服務,但是他們暫時還並不在一個叢集中,互相直接發現不了,而且還沒有可儲存的位置,就是所謂的slot(槽)

3.安裝叢集所需軟體

由於 Redis 叢集需要使用 ruby 命令,所以我們需要安裝 ruby 和相關介面

yum install ruby
yum install rubygems
gem install redis 

安裝redis時出錯:

看樣子要升級ruby版本

升級Ruby的版本

安裝rvm,我不知道這是個什麼東西,但是感覺像是Ruby的一個包管理器。

curl -L get.rvm.io | bash -s stable 

WTF,又出問題了

氣急敗壞的照著他說的做

# gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: requesting key D39DC0E3 from hkp server keys.gnupg.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key D39DC0E3: public key "Michal Papis (RVM signing) <[email protected]>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

然後重新下載rvm安裝,成功了

curl -L get.rvm.io | bash -s stable 
source /usr/local/rvm/scripts/rvm

檢視Ruby可用版本

可以看到最新的版本是2.6,保守起見安裝2.4.4

rvm install 2.4.4

至此,我們升級了Ruby的版本。

重新安裝gem redis介面

gem install redis

建立叢集:

/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.119.131:9001 192.168.119.131:9002 192.168.119.131:9003 192.168.119.131:9004 192.168.119.131:9005 192.168.119.131:9006

簡單解釋一下這個命令:呼叫 ruby 命令來進行建立叢集,--replicas 1 表示主從複製比例為 1:1,即一個主節點對應一個從節點;然後,預設給我們分配好了每個主節點和對應從節點服務,以及 solt 的大小,因為在 Redis 叢集中有且僅有 16383 個 solt ,預設情況會給我們平均分配,當然你可以指定,後續的增減節點也可以重新分配。

上圖則代表叢集搭建成功啦!!!

這裡需要注意的是,當防火牆埠號沒有開啟全,會報waiting for the cluster to join....一直等待的情況,這是因為:

叢集不僅需要開通redis客戶端連線的埠,而且需要開通叢集匯流排埠

叢集匯流排埠為redis客戶端連線的埠 + 10000 如redis埠為6379 則叢集匯流排埠為16379

驗證一下:
依然是通過客戶端命令連線上,通過叢集命令看一下狀態和節點資訊等。

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.131 -p 9001
cluster info
cluster nodes

通過命令,可以詳細的看出叢集資訊和各個節點狀態,主從資訊以及連線數、槽資訊等。這麼看到,我們已經真的把 Redis 叢集搭建部署成功啦!

設定一個 mafly:
你會發現,當我們 set name mafly 時,出現了 Redirected to slot 資訊並自動連線到了9002節點。這也是叢集的一個數據分配特性,這裡不詳細說了。

重啟叢集服務

 通過pkill -9 redis殺死 reids 程序之後,重新啟動各個節點,叢集自動建立成功。

注意:如果在建立叢集的時候,建立失敗了,如果將來再想重新建立需要刪除data目錄下的*.aof和*.conf,*,rdb檔案,再重新啟動所以redis服務再建立叢集即可。