Linux下Redis集羣搭建

redis集羣搭建
簡介
redis-cluster架構設計html

 

image

架構細節:
全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
節點的fail是經過集羣中超過半數的節點檢測失效時才生效.
客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可
redis-cluster把全部的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->key
Redis集羣預分好16384個桶,當須要在 Redis 集羣中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪一個桶中。node

環境準備
Redis集羣中要求奇數節點,因此至少要有三個節點,而且每一個節點至少有一備份節點,因此至少須要6個redis服務實例。linux

這裏演示的是我搭的生產環境redis集羣,3臺服務器,每臺起3個服務,共9個節點redis

 

按照單臺Redis服務方式 分別在三臺服務器上安裝Redisruby

安裝ruby環境(由於集羣運行須要一個ruby腳本)bash

yum install ruby服務器

開始集羣搭建
1.準備目錄結構
三臺機器同樣,創建以下目錄結構:架構

$ mkdir -p /usr/local/redis/redis-cluster/{7000,7001,7002}

分別進入每一個端口目錄建立配置文件:app

redis完整配置在上一篇搭建單個redis中有curl

cd  /usr/local/redis/redis-cluster/7000 && touch redis.conf
port 7000   # 端口7000,7001,7002,與目錄對應
bind 172.28.37.29 #默認ip爲127.0.0.1,須要改成其餘節點機器可訪問的ip,不然建立集羣時沒法訪問對應的端口,沒法建立集羣
daemonize yes   #redis後臺運行
cluster-enabled yes  #開啓集羣
cluster-config-file nodes_7000.conf  #集羣的配置,配置文件首次啓動自動生成 7000,7001,7002  
cluster-node-timeout 8000   #請求超時,默認15秒,可自行設置
appendonly yes  #開啓aof持久化模式,每次寫操做請求都追加到appendonly.aof文件中
appendfsync always  #每次有寫操做的時候都同步
logfile "/data/redis/logs/redis.log" #redis服務日誌
pidfile /var/run/redis_7000.pid  #pidfile文件對應7000,7001,7002

注意,上述有些配置項要對應服務和目錄,三個目錄按照上述配置好後,啓動服務

3.啓動/關閉集羣服務
能夠在每一個服務器上寫一個啓動腳本start-redis.sh:

for((i=0;i<3;i++)); 
do /usr/local/bin/redis-server /usr/local/redis/redis-cluster/700$i/redis.conf; 
done

關閉服務相似: 

for((i=0;i<=2;i++));
do /usr/local/bin/redis-cli -c -h IP−p700i shutdown; 
done


$IP分別爲三臺服務器IP。

啓動服務時有坑。。凡是改配置文件十有八九都會報錯  因此先備份一下原配置文件以後再作更改。

這時只是啓動了9個單獨的redis服務,它們還不是一個集羣,下面就說明建立集羣

4.建立集羣
注意:在任意一臺上運行 不要在每臺機器上都運行,一臺就夠了

Redis 官方提供了 redis-trib.rb 這個工具,就在解壓目錄的 src 目錄中

在其中一臺執行:

$ cd /root/redis-4.0.10/src
$ ./redis-trib.rb create --replicas 1 172.28.37.29:7000 172.28.37.29:7001 172.28.37.29:7002 172.28.37.30:7000 172.28.37.30:7001 172.28.37.30:7002 172.18.38.219:7000 172.18.38.219:7001 172.18.38.219:7002

 在執行上面命令時有可能會報一下錯誤:

執行如下命令安裝redis庫:

gem install redis

在安裝redis庫時也有可能報錯:

ERROR:  Error installing redis:
     redis requires Ruby version >= 2.2.2.

這是由於yum庫中ruby的版本支持到 2.0.0,可gem 安裝redis須要最低是2.2.2,採用rvm來更新ruby:

//具體RVM安裝命令地址:http://rvm.io/
  [root@linux ~]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
  [root@linux ~]# curl -sSL https://get.rvm.io | bash -s stable
  [root@linux ~]# find / -name rvm -print

會出現如下目錄

               /usr/local/rvm
     /usr/local/rvm/src/rvm
     /usr/local/rvm/src/rvm/bin/rvm
     /usr/local/rvm/src/rvm/lib/rvm
     /usr/local/rvm/src/rvm/scripts/rvm
     /usr/local/rvm/bin/rvm
     /usr/local/rvm/lib/rvm
     /usr/local/rvm/scripts/rvm

[root@linux ~]# source /usr/local/rvm/scripts/rvm

查看rvm庫中已知的ruby版本:

[root@linux ~]# rvm list known

    MRI Rubies
    [ruby-]1.8.6[-p420]
    [ruby-]1.8.7[-head] # security released on head
    [ruby-]1.9.1[-p431]
    [ruby-]1.9.2[-p330]
    [ruby-]1.9.3[-p551]
    [ruby-]2.0.0[-p648]
    [ruby-]2.1[.10]
    [ruby-]2.2[.7]
    [ruby-]2.3[.4]
    [ruby-]2.4[.1]
    ruby-head
    ….

安裝一個ruby版本:

[root@linux ~]# rvm install 2.4.1

使用一個ruby版本:

  [root@linux ~]# rvm use 2.4.1

設置默認版本:(設置ruby2.4.1爲默認的ruby,由於可能安裝有其餘版本)

  [root@linux ~]# rvm use 2.4.1 --default

卸載一個已知版本(若有其餘版本):

  [root@linux ~]# rvm remove 2.3.4

查看ruby版本:

  [root@linux ~]# ruby --version

      ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

安裝redis:

  [root@linux ~]# gem install redis

    Fetching: redis-4.0.1.gem (100%)
    Successfully installed redis-4.0.1
    Parsing documentation for redis-4.0.1
    Installing ri documentation for redis-4.0.1
    Done installing documentation for redis after 3 seconds
    1 gem installed

在執行完一大堆得排雷操做以後終於能夠建立集羣了

仍是剛纔命令

$ cd /root/redis-4.0.10/src
$ ./redis-trib.rb create --replicas 1 172.28.37.29:7000 172.28.37.29:7001 172.28.37.29:7002 172.28.37.30:7000 172.28.37.30:7001 172.28.37.30:7002 172.18.38.219:7000 172.18.38.219:7001 172.18.38.219:7002

敲完這個命令後會提示是否按照默認的推薦方式配置集羣主從,通常選yes就好了

image

截圖中看出,推薦了4個masters,5個從節點

>>> Creating cluster
>>> Performing hash slots allocation on 9 nodes...
Using 4 masters:
172.28.37.29:7000
172.28.37.30:7000
172.18.38.219:7000
172.28.37.29:7001
Adding replica 172.18.38.219:7001 to 172.28.37.29:7000
Adding replica 172.28.37.29:7002 to 172.28.37.30:7000
Adding replica 172.28.37.30:7002 to 172.18.38.219:7000
Adding replica 172.18.38.219:7002 to 172.28.37.29:7001
Adding replica 172.28.37.30:7001 to 172.28.37.29:7000

下面這個顯示了集羣和slot分配結果

image

5.集羣驗證
參數 -C 可鏈接到集羣,由於 redis.conf 將 bind 改成了ip地址,因此 -h 參數不能夠省略,-p 參數爲端口號

[root@172-28-37-29 src]# redis-cli -c -p 7000 -h 172.28.37.29
172.28.37.29:7000> set name zhoujie
-> Redirected to slot [5798] located at 172.28.37.30:7000
OK
172.28.37.30:7000> get name
"zhoujie"
172.28.37.30:7000>

能夠看到在29的7000上設置了name,重定向到了30的7000節點。到此爲止集羣搭建成功!

友情提示:
當出現集羣沒法啓動時,刪除集羣配置文件,再次從新啓動每個redis服務,而後從新構件集羣環境。

內容引用地址:https://yq.aliyun.com/articles/613281