Redis叢集的離線安裝以及原理理解
本文主要是記錄一下Redis叢集在linux系統下離線的安裝步驟,畢竟在生產環境下一般都是無法聯網的,Redis的叢集的Ruby環境安裝過程還是很麻煩的,涉及到很多的依賴的安裝,所以寫了一個文章來進行記錄。本文分為兩部分,第一部分先通過原生命令的安裝來實現redis叢集的部署,通過原生命令的安裝對於瞭解redis叢集的實現原理有很大的幫助,第二部分通過官方工具Ruby來進行Redis叢集的安裝,通過Ruby安裝Redis叢集的時候主要是搭建好Ruby環境,真正Redis叢集的安裝配置通過Ruby還是很簡單的。
一、通過原生命令安裝Redis叢集(僅做理解Redis叢集原理使用)
1.配置開啟所需要的Redis節點
因為這裡只是做一個簡單的Redis叢集原理演示,所以假設此時Redis服務已經安裝完畢,在config資料夾下建立六個redis.conf配置檔案,分別為redis-7000.conf、redis-7001.conf、redis-7002.conf、redis-7003.conf、redis-7004.conf、redis-7005.conf。其內容如下:
port ${port} daemonize yes dir "/opt/redis/redis/data/" dbfilename "dump-${port}.rdb" logfile "${port}.log" cluster-enabled yes //開啟節點的叢集功能 cluster-config-file nodes-${port}.conf cluster-require-full-coverage no cluster-node-timeout 15000
依次啟動六個redis後臺服務
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
ps -ef | grep redis檢視啟動情況:
2.通過叢集命令meet完成節點之間的相互通訊
meet:cluster meet ip port
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7001
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7002
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7003
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7004
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7005
通過埠為7000的節點,其他的節點也可以相互感知到對方的存在,然後每兩個節點之間都會通訊。
驗證:登入埠號為7000節點以後,分別輸入cluster nodes和cluster info 命令。
3.指派槽
完成了節點之間的通訊以後,就需要給每個主節點分配虛擬槽,一共存在16384個slot,redis節點之間互相知道哪個槽在哪個節點上,如果資料訪問到了不屬於自己的槽的redis,redis會告訴資料應該去訪問哪個redis
指派槽的命令:cluster addslots slot[slot...]
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0...5641}
redis-cli -h 127.0.0.1 -p 7001 cluster addslots {5642...10922}
redis-cli -h 127.0.0.1 -p 7002 cluster addslots {10923...16383}
在這裡發現使用addslots 只能一個一個輸入,感覺非常扯,使用陣列的方式redis會報錯,用網上的解決辦法是將大括號裡的 三個點改為兩個點,我試了試不行的,如果有什麼好的解決辦法可以提供一下。
4.配置節點的主從關係
cluster replicate node-id
redis-cli -h 127.0.0.1 -p 7003 cluster replicate ${node-id-7000}
redis-cli -h 127.0.0.1 -p 7004 cluster replicate ${node-id-7001}
redis-cli -h 127.0.0.1 -p 7005 cluster replicate ${node-id-7002}
到此通過原生命令安裝Redis叢集就已經完成了,中間的步驟存在問題,無法分配slots,但是可以幫助簡單的理解一下由Redis的單節點到Redis的叢集都需要做什麼工作。
二、通過Ruby離線安裝Redis叢集
1.安裝環境以及安裝包說明
系統:Centos7(安裝的時候選擇安裝了gcc) 安裝包:redis-4.0.6.tar.gz //redis 的安裝包 ruby-2.5.6.tar.gz //叢集搭建需要Ruby環境 rubygems-3.0.6.zip //redis叢集需要的ruby外掛,rubygems是ruby的一個包管理工具,通過rubygems安裝redis-3.2.2.gem zlib-1.2.11.tar.gz //可能缺少的基礎環境zlib openssl-1.0.2t.tar.gz //可能缺少的基礎環境openssl
2.安裝步驟
(1)解壓編譯redis
mkdir /usr/local/redis //建立redis工作目錄 cp redis-4.0.6.tar.gz /usr/local/redis //將redis的安裝包拷貝到redis目錄下 cd /usr/local/redis //進去redis檔案下 tar -vxf redis-4.0.6.tar.gz //解壓縮 ln -s redis-4.0.6 redis //建立軟連線 cd redis //進入redis目錄下 make && make install //編譯安裝redis
(2)建立叢集目錄
cd /usr/local/redis mkdir redis_cluster //在redis安裝目錄下建立redis_cluster目錄 mkdir redis700{0,1,2,3,4,5}//批量建立六個redis節點工作目錄,三主三從。
(3)配置redis.conf
cd /usr/local/redis/redis_cluster //進去叢集工作目錄
vim redis.conf //建立redis.conf檔案並新增一下內容
port 7000 //配置叢集的埠 bind 本機的IP //這裡的預設配置是127.0.0.1改為內網ip。 daemonize yes //允許redis在後臺執行 pidfile /var/run/redis-7000.pid //改成和埠一致 cluster-enabled yes // 開啟叢集 把註釋去掉 cluster-config-file node-7000.conf //叢集的配置,和埠一致 cluster-node-timeout 15000 // 請求超時,預設為15秒 appendonly yes // aof日誌開啟,有需要就開啟,每一次寫操作都會記錄一條日誌。
將redis.conf 分別copy到六個節點的檔案下
cp redis.conf redis7000/ //將配置檔案拷貝到redis7000節點的工作目錄下
cp redis.conf redis7001/
cp redis.conf redis7002/
cp redis.conf redis7003/
cp redis.conf redis7004/
cp redis.conf redis7005/
因為配置檔案是根據7000埠模本的配置寫的,所以除了redis7000目錄下的redis.conf,其他工作目錄下的配置檔案都需要將檔案內容中的埠號修改為對應的工作目錄的埠號。
(4)啟動服務
cd /usr/local/redis/redis_cluster
依次啟動所有節點
redis-server redis7000/redis.conf
redis-server redis7001/redis.conf
redis-server redis7002/redis.conf
redis-server redis7003/redis.conf
redis-server redis7004/redis.conf
redis-server redis7005/redis.conf
檢視啟動情況:ps -ef | grep redis
(5)安裝ruby
mkdir /usr/local/ruby //建立ruby工作目錄 cp ruby-2.5.6.tar.gz /usr/local/ruby //將安裝包拷貝到該目錄下 cd /usr/local/ruby //進入ruby工作目錄 tar -vxf ruby-2.5.6.tar.gz // 解壓縮 cd ruby-2.5.6/ ./configure make && make install
檢視安裝情況:ruby -v
(6)安裝rubygems
mkdir /usr/local/rubygems //建立rubygems工作目錄 cp rubygems-3.0.6.zip /usr/local/rubygems //將安裝包拷貝到該目錄下 cd /usr/local/rubygems //進入ruby工作目錄 unzip rubygems-3.0.6.zip // 解壓縮 cd rubygems-3.0.6/ ruby setup.rb
執行 ruby setup.rb 的時候出現以下錯誤:
解決辦法:缺少了zlib包,需要安裝zlib 。
(7)安裝zlib
mkdir /usr/local/zlib //建立zlib工作目錄 cp zlib-1.2.11.tar.gz /usr/local/zlib //將安裝包拷貝到該目錄下 cd /usr/local/zlib //進入zlib工作目錄 tar -vxf zlib-1.2.11.tar.gz // 解壓縮 cd zlib-1.2.11/ ./configure --prefix=/usr/local/zlib
make make install
(8)編譯ruby中的zlib
cd /usr/local/ruby/ruby-2.5.6/ext/zlib/ ruby extconf.rb
出現以下錯誤資訊:
發現原來是要將檔案安裝到本地執行庫的裡面才行,所有安裝的時候需要額外配置資訊。重新執行一下命令:
ruby extconf.rb --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib //會生成一個Makefile檔案
繼續下一步:make && make install
又出現報錯資訊:
這個時候開啟ext/zlib/Makefile檔案,找到下面一行把路徑進行修改一下。
zlib.o: $(top_srcdir)/include/ruby.h 改成:zlib.o: ../../include/ruby.h
如下圖:
修改完成,然後儲存,然後重新:make && make install
zlib的錯誤都解決以後再繼續重新安裝rubygems。
cd /usr/local/rubygems/rubygems-3.0.6 ruby setup.rb
這次就安裝成功了,如下圖:
(9)安裝redis-3.0.0.gem
cp redis-3.0.0.gem /usr/local/redis/redis cd /usr/local/redis/redis gem install redis-3.3.0.gem
出現以下錯誤資訊:
因為Redis叢集互動是需要OpenSSL,所繫我們還需要安裝OpenSSL。
(10)安裝openssl
mkdir /usr/local/openssl //建立openssl工作目錄 cp openssl-1.0.2t.tar.gz /usr/local/openssl //將安裝包拷貝到該目錄下 cd /usr/local/openssl //進入openssl工作目錄 tar -vxf openssl-1.0.2t.tar.gz // 解壓縮 cd openssl-1.0.2t/ ./config -fPIC --prefix=/usr/local/openssl enable-shared ./config -t make && make install
安裝成功:
(11)編譯ruby中的openssl
cd /usr/local/ruby/ruby-2.5.6/ext/openssl/ ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib 此時會生成Makefile檔案,下面出現的錯誤需要修改本檔案 make && make install
出現以下錯誤資訊:
解決辦法:vim Makefile 把Makefile檔案中所有的 $(top_srcdir) 換成 ../.. 注意替換所有
替換完成後,重新進行
make && make install
安裝成功:
安裝成功以後繼續進行第九步的安裝redis-3.0.0.gem
cd /usr/local/redis/redis/ gem install redis-3.0.0.gem
安裝成功:
到這裡ruby環境總算是安裝成功了,真是不容易啊,其實redis cluster的安裝的主要內容還是上面的Ruby環境的安裝配置過程。
(12)啟動redis叢集
cd /usr/local/redis/redis/src/
在該目錄下執行命令:
./redis-trib.rb create --replicas 1 192.168.182.132:7000 192.168.182.132:7001 192.168.182.132:7002 192.168.182.132:7003 192.168.182.132:7004 192.168.182.132:7005
輸入yes
安裝成功:
(13)驗證叢集狀態
以普通方式連線到7002埠的節點 redis-cli -p 7002 -h 192.168.182.132
引數說明: -p port 埠 -h host 主機 -c cluster 叢集
連線進叢集之後 輸入ping , 如果響應了pong 表示連線叢集成功;
CLUSTER INFO 列出當前節點的資訊,CLUSTER NODES 列出當前叢集中的節點資訊;
執行命令:set hello word
7002節點報錯,客戶端該資料應該使用7000埠的客戶端才能新增(是因為登入的時候沒有加-c)
登入7000埠的客戶端重新set hello world,新增資料成功(上次在7002中新增hello world沒有成功,所以在7000中獲取hello是沒有內容的)
使用叢集方式連線叢集redis-cli -p 7003 -h 192.168.182.132 -c(7003是7000的備機)
查詢hello:
get hello
重新設定hello的值:
set hello java
設定成功:
通過對比發現如果登入的時候不加-c(非叢集模式登入,登入的是單節點),新增資料時,如果資料的key的虛擬槽位沒有在該redis上則不能新增成功,即單節點登入,對redis的操作不會進行重定向。
(14)驗證叢集的主從配置
關閉7002埠的節點
kill -9 7002redis節點的pid
登入到7000埠的節點:
redis-cli -p 7000 -h 192.168.182.132 -c
cluster nodes
CLUSTER NODES 前面的字串是節點的id。從這個命令還可以知道哪些節點還活著,哪些節點已經掛了。帶著fail的都是已經掛掉的節點。
叢集資訊顯示7002節點已經down掉,7005取代7002成為主節點
總結:雖然整個過程是讓人很糟心的,但是總歸是成功了,實踐出真