1. 程式人生 > >redis單機叢集(轉)

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 redis和ps  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

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叢集,通過連線任一redis埠,新增資料

[[email protected] redis7001]# redis-cli -p 7001 -c   
[[email protected] 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(哨兵)模式