redis集群环境安装(参照redis中文官网,中间遇到了一些问题,so,记录一下)
創建步驟
01. 準備環境
# yum install gcc # yum install ruby # yum install ruby-devel.x86_64 # yum install rubygems # gem sources -r https://rubygems.org # gem sources -a http://rubygems.org # gem install redis02. 下載安裝 redis
# cd~ # wget http://download.redis.io/releases/redis-4.0.1.tar.gz # tar zxfv redis-4.0.1.tar.gz # cd redis-4.0.1 # make MALLOC=libc # cp src/redis-server /usr/local/bin # cp src/redis-cli /usr/local/bin # cp src/redis-trib.rb /usr/local/bin03. 獨立啟動/停止 redis
# redis-server & # redis-cli shutdown- 1
- 2
- 1
- 2
04. 測試獨立 redis
# redis-cli -p 7001 127.0.0.1:7001> set mykey myval01 127.0.0.1:7001> get mykey "myval01"05. 建立集群環境
# cd~ # mkdir redis-cluster # cd redis-cluster # mkdir 7001 7002 7003 7011 7012 7013- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
創建配置文件 ~/redis-cluster/redis.conf,內容如下:
port 7001 daemonize yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes 文件中的 cluster-enabled 選項用于開實例的集群模式, 而 cluster-conf-file 選項則設定了保存節點配置文件的路徑, 默認值為 nodes.conf。該節點配置文件無須人為修改,它由Redis集群在啟動時自動創建, 并在有需要時自動進行更新。?
若要讓集群正常運作至少需要三個主節點,我們的環境中,每個主節點附帶一個從節點,所以一共六個節點。
為每個節點創建配置文件
# cd ~/redis-cluster # cp redis.conf ./7001/ # … # cp redis.conf ./7013/- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
修改各個目錄下的 redis.conf 文件中的 port 為各自對應的端口
06. 啟動各個節點
# cd ~/redis-cluster # cd 7001 # redis-server redis.conf # cd ../7002 # redis-server redis.conf # … # cd ../7013 # redis-server redis.conf- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
查看redis的啟動情況
# ps -ef | grep redis07. 創建集群
現在我們已經有了六個正在運行中的 Redis 實例, 接下來我們需要使用這些實例來創建集群。?
通過使用 Redis 集群命令行工具 redis-trib , 編寫節點配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源碼的 src 文件夾中, 它是一個 Ruby 程序, 這個程序通過向實例發送特殊命令來完成創建新集群, 檢查集群, 或者對集群進行重新分片(reshared)等工作。這里通過create命令來創建集群。
- 1
- 2
- 1
- 2
說明:?
這里的IP地址必須是真實的IP,不能使用回環 127.0.0.1 地址。
–replicas 1 即每一個master有1個slave;順序為 m m m s s s?
redis-trib 會打印出一份預想中的配置給你看, 如果你覺得沒問題的話, 就可以輸入 yes , redis-trib 就會將這份配置應用到集群當中,讓各個節點開始互相通訊。
輸入yes,然后配置完成。
以上信息的其中一部分可以通過向集群中的任意節點(主節點或者從節點都可以)發送 CLUSTER NODES 命令來獲得。該命令還可以獲得節點 ID , IP 地址和端口號, 標志(flag), 最后發送 PING 的時間, 最后接收 PONG 的時間, 連接狀態, 節點負責處理的槽。
# redis-cli -p 7001 cluster nodes08. 集群檢查
./redis-trib.rb check 127.0.0.1:7001- 1
- 1
09. 連接Redis集群
通過上面的輸出,我們可以看出Redis三個主節點的slot范圍。一個 Redis 客戶端可以向集群中的任意節點(包括從節點)發送命令請求。我們首先連接第一個節點:
# redis-cli -p 7001127.0.0.1:7001> set a 1 (error) MOVED 15495 127.0.0.1:7003 127.0.0.1:7001> get a (error) MOVED 15495 127.0.0.1:7003 127.0.0.1:7001> set b 1 OK雖然我們用Node ID來標識集群中的節點, 但是為了讓客戶端的轉向操作盡可能地簡單, 節點在 MOVED 錯誤中直接返回目標節點的 IP 和端口號, 而不是目標節點的 ID 。客戶端應該記錄槽15495由節點127.0.0.1:7003負責處理“這一信息, 這樣當再次有命令需要對槽15495執行時, 客戶端就可以加快尋找正確節點的速度。這樣,當集群處于穩定狀態時,所有客戶端最終都會保存有一個哈希槽至節點的映射記錄,使得集群非常高效: 客戶端可以直接向正確的節點發送命令請求, 無須轉向、代理或者其他任何可能發生單點故障(single point failure)的實體(entiy)。
10. 添加新master節點
a. 啟動節點
# cd ~/redis-cluster # mkdir 8001 # cp ./redis.conf ./8001 # cd 8001 # redis-server redis.conf- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
b. 將節點加入到集群
# redis-trib.rb add-node 127.0.0.1:8001 127.0.0.1:7001- 1
- 1
說明:?
第一個 ip:port 為新節點?
第二個 ip:port 是任意一個已經存在的節點?
新節點沒有包含任何數據,也沒有包含任何slot。?
當集群需要將某個從節點升級為新的主節點時, 這個新節點不會被選中,同時新的主節點因為沒有包含任何slot,不參加選舉和failover。
c. 為新節點分配 slot
# redis-trib.rb reshard 127.0.0.1:8001 #根據提示選擇要遷移的slot數量(ps:這里選擇500) How many slots do you want to move (from 1 to 16384)? 500 #選擇要接受這些slot的node-id What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf #選擇slot來源: #all表示從所有的master重新分配, #或者數據要提取slot的master節點id,最后用done結束 Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1:all #打印被移動的slot后,輸入yes開始移動slot以及對應的數據. #Do you want to proceed with the proposed reshard plan (yes/no)? yes #結束- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
11. 添加新的 Slave 節點
a. 啟動節點
# cd ~/redis-cluster # mkdir 8011 # cp ./redis.conf ./8011 # cd 8011 # redis-server redis.conf- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
b. 將節點加入到集群?
方法一:
- 1
- 1
說明:?
第一個 ip:port 為新節點?
第二個 ip:port 是任意一個已經存在的節點?
新的節點會作為集群中其中一個主節點的從節點,一般來說是從節點最少的主節點。
方法二:
# redis-trib.rb add-node -slave -master-id \ 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:8011 127.0.0.1:7001- 1
- 1
說明:?
-master-id xxxx 主節點的 ID?
第一個 ip:port 為新節點?
第二個 ip:port 是任意一個已經存在的節點
注意:在線添加slave 時,需要bgsave整個master數據,并傳遞到slave,再由 slave加載rdb文件到內存,rdb生成和傳輸的過程中消耗Master大量內存和網絡IO,以此不建議單實例內存過大,線上小心操作。
12. 在線 reshard 數據
對于負載/數據不均勻的情況,可以在線reshard slot來解決,方法與添加新master的reshard一樣,只是需要reshard的master節點是已存在的老節點。
# redis-trib.rb reshard 127.0.0.1:7003- 1
- 1
13. 刪除一個 slave 節點
# redis-trib.rb del-node ip:port '<node-id>' # redis-trib.rb del-node 127.0.0.1:7001 'c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378'- 1
- 2
- 1
- 2
說明:?
ip:port 集群中已有的任意一節點(不是被刪除的節點)?
被刪除節點的 ID
14. 刪除一個 master 節點(7003)
刪除master節點之前首先要使用reshard移除master的全部slot,然后再刪除當前節點。 (目前redis-trib.rb只能把被刪除master的slot對應的數據遷移到一個節點上)。
a. 遷移 slot
#把127.0.0.1:7003當前master遷移到127.0.0.1:7002上 redis-trib.rb reshard 172.0.0.1:7002 #根據提示選擇要遷移的slot數量(ps:這里選擇500) How many slots do you want to move (from 1 to 16384)? 500(被刪除master的所有slot數量) #選擇要接受這些slot的node-id(172.0.0.1:7002) What is the receiving node ID? c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:172.0.0.1:7002的node-id) Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被刪除master的node-id) Source node #2:done #打印被移動的slot后,輸入yes開始移動slot以及對應的數據. #Do you want to proceed with the proposed reshard plan (yes/no)? yes- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
b. 刪除空的 master 節點
# redis-trib.rb del-node 172.0.0.1:7001 'f51e26b5d5ff74f85341f06f28f125b7254e61bf'- 1
- 1
說明:?
ip:port 集群中已有的任意一節點(不是被刪除的節點)?
被刪除節點的 ID
15. 改變從節點的隸屬關系(從節點 7013)
# redis-cli -p 7013 127.0.0.1:7013> cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835 說明:2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835 為新的主節點的 ID- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
16. 集群的關閉和重啟
redis cluster官方文檔,沒發現有關集群重啟和關閉的方法。主要是因為在正式的環境中集群一般都由3臺物理機構成,3臺物理機同時掛掉的可能性極小。只要不同時掛掉,掛掉的機器修復后在加入集群,集群都能良好的運作,萬一同時掛掉,數據又沒有備份的話,就有大麻煩了。
redis cluster集群中的節點基本上都對等的,沒有管理節點。如果要讓所有節點都關閉,只能關閉所有 redis-server 進程。
# pkill -9 redis- 1
- 1
然后重新啟動,如果直接重啟會報告錯誤。
# redis-trib.rb create --replicas 1 xxx xxx xxx xxx- 1
- 1
會報以下錯誤,
[ERR] Node 127.0.0.1:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.- 1
- 1
第一次啟動集群時,~/redis-cluster/7001/ 下只有 redis.conf,而現在重啟時,此目錄下有了別的文件,所有報錯。簡單的方法是將除了 redis.conf 外的其他文件全部刪除,在啟動肯定是可以的,但是集群是有數據的,所以需要保留了配置文件 redis.conf 和數據文件 *.rdb。?
這樣是可以啟動的,但是原來的數據還是丟失了,不知道是自己的想法不對。
需要注意的問題
執行06步驟時,節點目錄下(7001/7002/…/7013/ 應當只有 redis.conf 文件)
一定要嚴格執行 01 步驟準備好環境。?
此步驟中 gem sources 默認地址好像無法訪問,建議用下面方法替換
在安裝redis集群中可能會出現的問題以及解決方案如下:
執行命令:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805時,出現問題:
問題1:
RubyGems 2.6.12 installedERROR: ?While executing gem ... (Gem::DocumentError) RDoc is not installed: no such file to load -- rdoc/rdoc ???
解決:
????1.安裝ruby軟件包
? ? ? ?[root@redis ~]#yum -y install ruby
? ? 2.安裝rubygems軟件包
? ? ? ?[root@redis ~]#tar -zxvf rubygems-2.6.12.tgz?
[root@redis?~]#?cd?rubygems-2.6.12
[root@redis?rubygems-2.2.2]#?ls
bin??????????????????History.txt???MIT.txt??????test
CVE-2013-4287.txt????lib???????????Rakefile?????UPGRADING.rdoc
CVE-2013-4363.txt????LICENSE.txt???README.rdoc??util
hide_lib_for_update??Manifest.txt??setup.rb
[root@redis?rubygems-2.2.2]#?ruby?setup.rb
此處,出現了第二個問題:
問題2:
While executing gem ... (Gem::DocumentError) ? ? RDoc is not installed: no such file to load -- rdoc
解決:?[root@redis ~]#yum install ruby-rdoc
接著執行命令:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805
報錯:/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:55:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
解決:yum install -y rubygems
接著執行:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805
報錯:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
解決:gem install?redis
接著執行:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805
出現:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6800
127.0.0.1:6801
127.0.0.1:6802
Adding replica 127.0.0.1:6803 to 127.0.0.1:6800
Adding replica 127.0.0.1:6804 to 127.0.0.1:6801
Adding replica 127.0.0.1:6805 to 127.0.0.1:6802
M: f6980c8f40d777175090007abc7edbaca8c360a7 127.0.0.1:6800
? ?slots:0-5460 (5461 slots) master
M: 40d10b0c47431f2e02a3c1cef36a8e14f6861cc8 127.0.0.1:6801
? ?slots:5461-10922 (5462 slots) master
M: e97c8defa07e679b9bd95d0015247a9833342f49 127.0.0.1:6802
? ?slots:10923-16383 (5461 slots) master
S: b3232105d439e545e43235bc1b8f0ff263a29534 127.0.0.1:6803
? ?replicates f6980c8f40d777175090007abc7edbaca8c360a7
S: bac5f3e53982e521d5e143ed2dfbce7fbbe92623 127.0.0.1:6804
? ?replicates 40d10b0c47431f2e02a3c1cef36a8e14f6861cc8
S: 80b48929a861db1de6baa4330baceadefc617651 127.0.0.1:6805
? ?replicates e97c8defa07e679b9bd95d0015247a9833342f49
Can I set the above configuration? (type 'yes' to accept):?
然后輸入:y
至此,結束
最后,添加一篇博客,可能會對解決這個問題有幫助:http://blog.csdn.net/asas1314/article/details/50203923
總結
以上是生活随笔為你收集整理的redis集群环境安装(参照redis中文官网,中间遇到了一些问题,so,记录一下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse打开,莫名报一堆错(Syn
- 下一篇: es配置中防止脑裂的配置