1. 程式人生 > >redis 集群搭建: redis-cluster

redis 集群搭建: redis-cluster

don 前言 serve image ica 怎麽辦 -s 報錯 replicas

前言

  redis數據存儲在內存中, 就會受到內存的限制, 大家都知道, 一臺電腦, 硬盤可以有1T, 但是內存, 沒有聽說有1T的內存吧.

  那如果數據非常多, 超過一臺電腦的內存空間, 怎麽辦呢?

  正常思維, 都是, 一臺電腦不夠, 那我再加一臺電腦嘛, 不就夠了.

redis集群架構圖

  技術分享圖片

每一臺redis server之間都是保持通訊的. 也就是說, 如果 server1 上面沒有要查找的值, 會跳轉到別的服務器上查找.

註:

  如果其中有一個服務器掛了, 如 server4 掛了. redis是怎麽處理的呢?

  redis集群中, 有一個投票機制, 當server4掛了之後, 會由server1, server2, server3 共同投票, 因為他們都與server4有通訊關系, 當大家都認定server4 確實掛了之後, 大家的投票

結果就是, 大家可以休息了, 下班了.

  那很明顯, 這裏有不合理性. 那怎麽解決呢?

  在集群中, 為了保證一臺機子掛了之後, 系統任然正常運行, 一個常用的方法是加備份機.(備胎)

  redis中也是這樣, 如果給每一臺機子上加一臺備份機, 那麽大家投票認為server4掛了之後, 備胎就有福了. 可以取而代之. 這樣就可以保證, 系統還可以正常運行.

搭建集群

根據上面的架構圖, 以及投票機制和備胎機制, 一個合格的redis集群, 應該是要6臺電腦. 作為我個人來講, 我去哪裏弄6臺電腦啊, 裝6臺虛擬機還差不多. 但是同時跑6臺虛擬機, 你累不累啊?

既然沒有那麽多電腦, 也不想裝那麽多虛擬機, 那麽久來個偽集群吧. 到生產環境中, 需要多臺電腦來搭建集群的時候, 步驟是一樣的. 結果其實也是一樣的, 沒差, 甚至更簡單點.

一. 搭建多個redis

  接著前面的篇幅中的redis文件.

1. 拷貝創建redis-cluster文件夾

  技術分享圖片

2. 進入redis-cluster, 將bin文件重命名

  技術分享圖片

3. 對redis1下的redis.conf文件進行端口和集群配置

vim ./redis1/redis.conf

  3.1 端口修改

  技術分享圖片

  3.2 允許集成開關

  技術分享圖片

  這裏默認是被註釋掉的. 只要打開註釋就可以了

4. 將redis1復制5份出來, 分別命名為redis2,redis3, redis4, redis5, redis6

  技術分享圖片

5. 修改redis2~redis6的端口號, 分別為7002~7006. 修改方式與3.1一樣的.

6. 創建一把啟動腳本. vim start-all.sh 

cd /usr/local/redis-cluster/redis1
./redis-server redis.conf
cd ../redis2
./redis-server redis.conf
cd ../redis3
./redis-server redis.conf
cd ../redis4
./redis-server redis.conf
cd ../redis5
./redis-server redis.conf
cd ../redis6
./redis-server redis.conf

7. 修改start-all.sh的權限

  如果不改權限, 直接運行, 是跑不起來的

[root@localhost redis-cluster]# chmod u+x start-all.sh

  修改完之後, 就可以牽出來溜一下, 看看是否都能跑起來

  技術分享圖片

  通過ps看一下

  技術分享圖片

8. 創建一把結束腳本 vim shutdown-all.sh

  有始有終, 一把開始, 當然也需要一把結束, 總不能一個一個去結束吧, 太麻煩了

cd /usr/local/redis-cluster/redis1
./redis-cli -p 7001 shutdown
cd ../redis2
./redis-cli -p 7002 shutdown
cd ../redis3
./redis-cli -p 7003 shutdown
cd ../redis4
./redis-cli -p 7004 shutdown
cd ../redis5
./redis-cli -p 7005 shutdown
cd ../redis6
./redis-cli -p 7006 shutdown

  同樣的, 這個腳本也需要修改訪問權限, 與上面是一樣的.

chmod u+x shutdown-all.sh

  跑一下這個腳本看看

[root@localhost redis-cluster]# ./shutdown-all.sh 

  這時候, 再通過ps看看

  技術分享圖片

  都關掉了.

 

二. 集群

註:

  在開始搭建之前, 有一些概念, 要搞清楚.

  在redis-cluster中, 吧所有的物理節點都映射到[0-16383]個slot(槽)上, 由cluster負責維護.

  那具體是怎麽分配這些槽的呢?

  當有一個數據進來需要進行緩存時, redis會先對key使用crc16算法, 計算出一個結果, 然後對16384進行取余, 這樣, 每個key都會得到一個在0-16383之間的數, 這個數, 就是他的槽值. 根據這個數, 將數據存入槽所在的電腦裏面.

  也就是說, 如果有3臺電腦A,B,C, A->[0, 5000], B->[5001, 10000], C->[10001, 16383]. 進來一個值, key計算最後結果是5005, 則會將這個值存入B電腦裏面. 再進來一個值, key計算是10010, 則會存入C電腦中.

  這個槽點, 並不是key的個數, 這裏需要註意以下. 理論來說, 可以進行16284臺電腦的集群, 每臺電腦分一個槽. 但是每個電腦, 肯定會存一堆值.

1. 拷貝redis-trib.rb文件到redis-cluster中

[root@localhost redis-cluster]# cd /usr/java/redis-4.0.6/src/
[root@localhost src]# cp redis-trib.rb /usr/local/redis-cluster/

  技術分享圖片

2. 安裝ruby

  上面拷貝的文件, 是rb後綴的, 從這個後綴, 應該能看出為啥要安裝ruby吧

yum install ruby
yum install rubygems

  安裝完成之後, 還需要安裝一個 gem

gem install redis --version 3.0.0

3. 使用ruby腳本搭建集群

./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

  在搭建集群的時候, 有可能會報一個錯誤

  技術分享圖片

  這個是為啥呢?

  在集群的時候, 需要保證各redis都是空的, 裏面不存數據的. 所以, 這裏就需要我們手動來清一下數據.

  在將 各 redis 啟動之後, 執行flushdb命令

[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7001
127.0.0.1:7001> flushdb
OK
127.0.0.1:7001> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7002
127.0.0.1:7002> flushdb
OK
127.0.0.1:7002> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7003
127.0.0.1:7003> flushdb
OK
127.0.0.1:7003> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7004
127.0.0.1:7004> flushdb
OK
127.0.0.1:7004> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7005
127.0.0.1:7005> flushdb
OK
127.0.0.1:7005> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7006
127.0.0.1:7006> flushdb
OK
127.0.0.1:7006> 

  如果清除之後還不行, 則刪除

  目錄中的dum.rdb, nodes.conf, appendonly.aof 文件, 每一個redis都要刪.

  做完了這些, 一件很重要的事情別忘了: 重啟以下redis , 否則, 在集群的時候, 還是會報錯的

  技術分享圖片

4. 使用

  通過以上的步驟, 就將redis集群搭建好了, 接下來, 就是來驗證一番.

  連接集群的時候和連接單機的時候, 稍有不同, 需要在連接指令後面加上 -c

[root@localhost redis-cluster]# ./redis1/redis-cli -p 7001 -c

  技術分享圖片

  在存儲的時候, 會根據key計算, 找到存放的電腦, 跳轉過去存放

  那現在我存放了三個值, 分別在7002, 7003裏面, 7001裏面沒有存值, 還是看的出來的. 現在我通過7001來取一下, 看看可能取出來

  技術分享圖片

  在我取的時候, 也是會跳轉到相應的存儲服務器取數據.

redis 集群搭建: redis-cluster