redis集羣搭建
簡介
redis-cluster架構設計html
架構細節:
全部的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就好了
截圖中看出,推薦了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分配結果
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服務,而後從新構件集羣環境。