Linux 下Redis集群安裝部署及使用詳解(在線和離線兩種安裝+相關錯誤解決方案)


一、應用場景介紹

  本文主要是介紹Redis集群在Linux環境下的安裝講解,其中主要包括在聯網的Linux環境和脫機的Linux環境下是如何安裝的。因為大多數時候,公司的生產環境是在內網環境下,無外網,服務器處於脫機狀態(最近公司要上線項目,就是無外網環境的Linux,被離線安裝坑慘了,走了很多彎路,說多了都是血淚史啊%>_<%)。這也是筆者寫本文的初衷,希望其他人少走彎路,下面就介紹如何在Linux安裝部署Redis集群。

二、安裝環境及工具

  系統:Red Hat Enterprise Linux Server release 6.6

  工具:XShell5及Xftp5

  安裝包:GCC-7.1.0

      Ruby-2.4.1

      Rubygems-2.6.12

      Redis-3.2.9(3.x版本才開始支持集群功能)

三、安裝步驟

  要搭建一個最簡單的Redis集群,我們至少需要6個節點:3個Master和3個Slave。那為什么需要3個Master呢?其實就是一個“鐵三角”的關系,當1個Master下線的時候,其他2個Master和對應的Salve立馬就能頂替上去,確保集群能夠正常使用,如果你之前了解Mongodb/Hadoop/Strom這些的話,你就很容易目標一般分布式的最低要求基數個數節點,這樣便於選舉(少數服從多數的原則)。本文當中,我們就偷下懶,在一台Linux虛擬機上搭建6個節點的Redis集群(實際真正生產環境,需要3台Linux服務器分布存放3個Master)

1、安裝GCC環境

安裝Redis需要依托GCC環境,先檢查Linux是否已經安裝了GCC,如果沒有安裝,則需要進行安裝

檢查GCC是否安裝,可以看看版本號

$ gcc -v

如果已經安裝了GCC,則會顯示以下信息

如果沒有任何信息,則我們可以通過命令yum install gcc-c++進行在線安裝

$ yum install gcc-c++

如果沒有網絡的時候,我們就需要下載GCC的安裝包進行手動安裝了,具體方法還是比較復雜的,具體離線安裝GCC的方法,請參考我的另外一篇文章《Linux無網離線安裝GCC

2、安裝Ruby和Rubygems

如果有網的話,則通過yum命令進行安裝,自動將關聯的依賴包全部安裝

$ yum install ruby
$ yum install rubygems

如果是離線的狀態,我們則可以選擇下載Ruby和Rubygems,解壓手動進行安裝,具體的方法請參考我的另外兩篇文件《Linux 離線安裝Ruby詳解》和《Linux 離線安裝Rubygems詳解》,這里我們不做多講解。

四、安裝Redis

1、到官網(https://redis.io/download)下載Redis,現在最新的版本為:3.2.9 ,將下載好的壓縮包上傳到服務器當中。如圖所示,我是新建了一個Redis臨時目錄存放,偷懶我就用xftp5手動創建一個目錄存放(也可以寫命令創建文件夾 $ makdir redis)

2、安裝Redis

轉到Redis的存放目錄,然后通過命令解壓Redis壓縮包

$ cd /home/cmfchina/redis
$ tar -zxvf redis-3.2.9.tar.gz

通過make命令進行安裝Redis(需要root權限)

$ cd /home/cmfchina/redis/redis-3.2.9
$ make && make install //make 這里如果不指定PREFIX,默認將安裝在/usr/local/bin下,保持默認就好

如果沒有root權限是無法安裝的,如圖所示

我們獲取root權限之后再進行安裝,看到如下信息,說明Redis安裝成功了,也可以到/usr/local/bin目錄下看看

如果只是想要單機,不存在集群功能,我們現在就可以將Redis運行起來,我們直接在剛剛解壓的Redis目錄下運行命令就可以將單機的Redis 運行起來

$ cd /home/cmfchina/redis/redis-3.2.9
$ redis-server redis.conf //所有相關配置信息都在conf里面,如果不設置,默認端口號為:6379

五、配置Redis集群

  剛剛上面講到如果只是想運行單機版的Redis(個人研究Redis可以安裝單機版),上面的講解已經夠了,不過現實當中,我們往往是需要使用到集群功能的,進行容錯。

  之前講到是我們需要6個節點的Redis作為集群,所以我們需要創建6個文件夾,分別存放6個節點的配置信息,6個節點需要對應6個端口號,比如7001~7006,這個端口號我們自行定義,我們通過xftp5可視化創建一下。

第一步、我們也可以通過命令mkdir批量創建,,命令可能會更快點。

下面重點來了,需要6個節點,所有我們需要配置各自的redis.conf配置文件。到我們Redis的安裝目錄usr/local/bin,將redis-cli、redis-server、redis.conf(沒有conf文件,可以從壓縮包里拷個出來,或者自己直接新建一個空的conf文件,后面再配置相關信息),分別復制到剛剛創建的6個文件夾當中。

第二步、接下來,我們需要配置redis.conf文件,如果你是從壓縮包拷貝出來,你會發現特別多的備注,這些是都是官網的備注講解,你可以全部刪除,只配置你想配置的信息就行。我們主要配置相對應的端口信息和集群配置信息

還有很多redis.conf配置信息,實際場景我們再自行配置,關於配置redis.conf的相關信息,可以參考筆者另一篇文件《Redis.conf及其Sentinel.conf配置項詳細說明》。我們分別配置相對應的6個redis.conf信息。

分別將這6個redis服務啟動起來(命令redis-server redis.conf),一個一個去啟動有點復雜,在redis目錄創建一個sh腳本來啟動6個實例

1 $cd /home/cmfchina/redis 2 $vim startall.sh 就會打開vim編輯器,創建一個空的文本

:wq!保存腳本,創建成功:

執行./startall.sh 提示permission denied說明權限不足,執行命令chmod 777 startall.sh修改權限獲取root用戶執行腳本

$ chmod 777 startall.sh 分配權限
$ sh -x startall.sh 執行腳本

=======補充說明 :2017-12-14 =========

有網友跟博主反應,上面這個批量腳本不能執行,是博主漏加了命令:kill -2

因為:每次執行一個redis啟動,都會停留在redis的啟動界面(上文說到的單機啟動redis的那個界面),所以我們需要模擬退出當前界面,執行下一條命令

Kill -2 :功能類似於Ctrl + C 是程序在結束之前,能夠保存相關數據,然后再退出。

將上文的腳本改造下就行;如圖所示

Ps:如果出現路徑找不到的問題,將上文的路徑全部換成絕對路徑

=================================

再執行./startall.sh,  然后通過命令netstat -tnulp | grep redisps  aux | grep redis查看redis運行情況,可以看到端口7001、7002、7003、7004、7005、7006的redis都起來了。噢耶~~~~

第三步、實際上,Redis集群的操作在后文你可以看到是通過Ruby腳本來完成的,因此我們需要安裝Ruby相關的RPM包,以及Redis和Ruby的接口包。我們要用到之前安裝的Ruby。我們到之前解壓的文件redis-3.2.9/src目錄下找到文件為:redis-trib.rb,如圖所示

將該文件拷貝到與6個文件夾的同級目錄下

在redis目錄下執行命令:

$ ./redis-trib.rb  create --replicas  1  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  127.0.0.1:7006

===============相關錯誤匯總解決方案(你以為上面是重點%>_<%,其實下面這才是本文重點(太多坑)!!!)===============

如果執行上述命令出現Ruby和Rubygems錯誤的話,那是沒有安裝Ruby和Rubygems,所有這就是為什么我們文章之前就要提前安裝好Ruby和Rubygems。但是有些人說這兩個我們已經安裝了,為什么還會報如下錯誤的話

/home/cmfchina/ruby/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
from /home/cmfchina/ruby/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require' from ./redis-trib.rb:25:in `<main>'

這錯誤是提示不能加載redis,那是因為缺少redis和ruby的接口,使用gem 安裝,我們這個時候其實還需要安裝對應的Redis的Rbuy接口包。我們需要下載對應Redis的gem包安裝才行。Rubygems的官網其實提供了Redis的gem包,我們可以直接取下載https://rubygems.org/gems/redis/   下載后上傳到服務器當中

執行gem install redis-3.3.0.gem命令安裝。

$ gem install redis-3.3.0.gem

但是執行這個又報了錯誤,如果沒有報錯的話那就說明人品好啊......真是心塞~~~如圖所示,這是因為需要依賴zlib工具。

ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClass

 

 

第四步我們需要再安裝zlib才行,下載zlib,上傳解壓,安裝zlib官方網站:http://www.zlib.net ,最新版1.2.11,安裝我們就一筆帶過

1 $tar -xvzf zlib-1.2.11.tar.gz
2 $cd zlib-1.2.8.tar.gz
3 $./configure --prefix=/usr/local/zlib  設置安裝路徑
4 $make
5 $make instal

安裝完zlib之后,我們再需要執行以下命令

1 $ cd /home/cmfchina/ruby/ruby-2.4.1/ext/zlib 備注:/home/cmfchina/ruby/ruby-2.4.1這個目錄是ruby安裝包后解壓的目錄,就是前面提到的ruby離線安裝 2 $ ruby extconf.rb 3 $ make && make install 

可是又報錯了,真是無力吐槽了~~~錯誤信息如下

checking for deflateReset() in -lz... no checking for deflateReset() in -llibz... no checking for deflateReset() in -lzlib1... no checking for deflateReset() in -lzlib... no checking for deflateReset() in -lzdll... no checking for deflateReset() in -lzlibwapi... no *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers.  Check the mkmf.log file for more details. You may need configuration options.

本着不放棄的原則,只能去外國網站查查資料看怎么解決了,發現原來是要將文件安裝到本地運行庫的里面才行,所有安裝的時候需要額外配置信息,但是前提是我們需要安裝zlib,才能繼續下一步。

安裝好zlib,然后我們重新輸入命令

1 $ cd /home/cmfchina/ruby/ruby-2.4.1/ext/zlib  
備注:/home/cmfchina/ruby/ruby-2.4.1這個目錄是ruby安裝包后解壓的目錄,就是前面提到的ruby離線安裝
2 $ ruby extconf.rb  --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib //會生成一個Makefile文件

備注:/usr/local/zlib是我的zlib安裝目錄
3 $ make && make install  

這個時候會自動生成一個Makefile文件,如圖所示

 

接下來我們make && make install 安裝一下,但是當我們make的時候,又出現了錯誤如下

make: *** No rule to make target `/include/ruby.h', needed by `zlib.o'.  Stop

這個時候打開ext/zlib/Makefile文件,找到下面一行把路徑進行修改一下。

zlib.o: $(top_srcdir)/include/ruby.h 改成:zlib.o: ../../include/ruby.h

如圖所示

修改完成,然后保存:接着我們再make && make install,這個時候安裝成功了~~所以就放心地接着干吧!(沒有看到我也無能為力了)安裝完成后如下顯示

 

 

我們回到redis的gem目錄下,繼續執行命令:gem install redis-3.3.0.gem

但是......又出現了錯誤,原來我們還需要安裝OpenSSL,因為Redis集群交互是需要OpenSSL

第五步我們又得安裝OpenSSL才行,官網地址:https://www.openssl.org/source/ 上次壓縮包到服務器,解壓,具體不做太細講解

1 $ tar -xzvf openssl-1.0.2l.tar.gz 2 $ cd openssl-1.0.2l 3 $ ./config -fPIC --prefix=/usr/local/openssl enable-shared 4 $ ./config -t 5 $ make && make install

安裝openssl成功界面如下:

我們又要到到Ruby解壓的源碼[/home/cmfchina/ruby-2.4.1]目錄下的ext/openssl 目錄,如圖所示

安裝和zlib一樣的方式安裝openssl

1 $ cd /home/cmfchina/ruby-2.4.1/ext/openssl 2 備注:/home/cmfchina/ruby/ruby-2.4.1這個目錄是ruby安裝包后解壓的目錄,就是前面提到的ruby離線安裝
3 $ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib //會生成一個Makefile文件 4 備注:/usr/local/openssl是我的openssl安裝目錄
5 $ make && make install

但是我們make的時候,又出現了和zlib類似的錯誤

make: *** No rule to make target `/include/ruby.h', needed by `ossl.o'.  Stop

還是按照剛剛zlib操作一樣,打開Makefile文件,將$(top_srcdir)全部改成../..

修改后保存,再執行make && make install,這一次安裝成功了~~

 

然后我們再回到之前redis目錄下執行命令:gem install redis-3.3.0.gem

第六步啟動Redis集群

完成以上步驟之后,我們再回到第三步執行命令

在redis目錄下執行命令:

$ ./redis-trib.rb  create --replicas  1  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  127.0.0.1:7006

我們選擇yes,意思是服從這種主從分配方式,我們也可以通過配置文件自己指定slave

第五、Redis集群設置密碼

  在實際場景當中,我們都需要考慮到安全問題,設置密碼這個環節也是必不可少,Redis單片機設置密碼都挺簡單的,一般分為兩種方式:

1、先設置各個Redis單機的密碼

方法一:修改所有Redis集群中的redis.conf配置文件

masterauth password123  //設置master密碼,是為了Salve能夠連接上Master
requirepass password123  //設置Redis訪問請求密碼

方法二:進入各個Redis集群中的實時配置

./redis-cli -c -p 7001 //分別進入各個Redis片機進行各自設置
config set masterauth passwd123 
config set requirepass passwd123 
config rewrite 

注意:各個節點密碼都必須一致,否則Redirected就會失敗, 個人推薦第二種方式,這種方式會把密碼寫入到redis.conf里面去,且不用重啟。

建議設置好masterauth的密碼,否則后期的Master和Salve無法進行數據同步,如圖所示:

2、再設置redis-trib.rb的密碼進行集群分配啟動(最關鍵一步!!!)

  如果你設置了各個Redis密碼,但是使用下面的命令還是報錯了,對的~錯了那就是對了,因為你還需要進行關鍵的一步需要設置,O(∩_∩)O哈哈~。

$ ./redis-trib.rb  create --replicas  1  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  127.0.0.1:7006

  一般會出現以下錯誤:./redis-trib.rb check 127.0.0.1:7001,則會報錯ERR] Sorry, can’t connect to node 127.0.0.1:7001,我們需要再次設置client.rb的配置文件

解決方法,找到系統的client.rb(溫馨提示:不知道這個再哪里,可以使用find命令進行查找:ind / -name 'client.rb'),然后修改passord,具體設置如圖所示:

  設置好密碼保存退出之后,再執行上面集群redis-trib.rb的命令,這樣就大功告成了~~~O(∩_∩)O

第六、Redis集群測試

我們來測試一下Redis集群,通過連接任一redis端口,添加數據

[root@localhost redis7001]# redis-cli -p 7001 -c   
[root@localhost redis7001]# redis-cli -c -h 127.0.0.1 -p 7001 shutdown //關閉集群,如果沒有-h參數,默認連接127.0.0.1,如果沒有-p參數,默認連接6370端口(所有如果用默認的,就沒有-h -p)

說明:-h+host –p+端口號 –c 是要連接集群,注意坑,不加會報錯的

 

可以看到連接的是7001的節點,set name的時候計算了存在哪個hash槽上,會跳轉到那個槽對應的節點

結束語:至此,Redis的集群配置的前世今生已到此結束,在沒有網絡的環境下中途碰到了很多坑,現在我們可以盡情享受Redis,縱使虐我千百遍,我待它如初戀

后話:推薦一個Redis的可視化工具:RedisDesktopManager 官網(https://redisdesktop.com/download),具體可以到官網看看,這里我只拋磚引玉一下,下篇文章主要介紹Redis的Sentinel(哨兵)模式

 

PS:未經作者允許,請勿進行轉載,有問題,請留言,如若轉載記得注明出處:http://www.cnblogs.com/xuliangxing/p/7146868.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM