Redis 在3.0版本前只支持單實例模式,雖然支持主從模式、哨兵模式部署來解決單點故障。可是數據冗餘太大,內存浪費。因此,Redis 在 3.0 版本之後就推出了集羣模式。node
因爲集羣至少須要6個節點(3主3從模式),咱們能夠採用端口號來區分,模擬6臺服務。es6
上傳redis安裝包到/usr/local/src目錄 redis
解壓安裝包 算法
cd /usr/local/src tar -zxvf redis-3.2.12.tar.gz
編譯redisruby
make
建立集羣目錄bash
#mkdir /usr/local/redis-cluster
建立6個節點存放目錄服務器
#cd /usr/local/redis-cluster #mkdir -p 6001/data 6002/data 6003/data 6004/data 6005/data 6006/data
建立腳本存放目錄binapp
#mkdir bin
複製剛纔在解壓編譯的redis安裝包的src目錄下的編輯器
mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump工具
redis-cli redis-server redis-trib.rb 這6個腳本文件到bin目錄
#cd /usr/local/src/redis-3.2.12/src #\cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin
複製配置文件redis.conf到第一個節點6001目錄
#cp redis.conf /usr/local/redis-cluster/6001
編輯redis.conf配置文件
#cd /usr/local/redis-cluster/6001 #vi redis.conf
修改項目以下
port 6001(每一個節點的端口號)
daemonize yes
bind 192.168.100.131(綁定當前機器 IP)
dir /usr/local/redis-cluster/6001/data/(數據文件存放位置)
pidfile /var/run/redis_6001.pid(pid 6001和port要對應)
cluster-enabled yes(啓動集羣模式)
cluster-config-file nodes6001.conf(6001和port要對應)
cluster-node-timeout 15000
appendonly yes
集羣搭建配置重點就是取消下圖中的這三個配置的註釋
再複製出五個新 Redis 實例分別到6002,6003,6004,6005,6006
#\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6002 #\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6003 #\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6004 #\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6005 #\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6006
依次修改6002,6003,6004,6005,6006五個節點的redis.conf配置文件中的關於端口號的相關配置
6002節點redis.conf配置文件修改,使用vi編輯器命令修改替換端口 命令模式下輸入 %s/6001/6002
port 6002 dir /usr/local/redis-cluster/6002/data/ pidfile /var/run/redis_6002.pid cluster-config-file nodes6002.conf
6003節點redis.conf配置文件修改,使用vi編輯器命令修改替換端口 命令模式下輸入 %s/6001/6003
port 6003 dir /usr/local/redis-cluster/6003/data/ pidfile /var/run/redis_6003.pid cluster-config-file nodes6003.conf
6004節點redis.conf配置文件修改,使用vi編輯器命令修改替換端口 命令模式下輸入 %s/6001/6004
port 6004 dir /usr/local/redis-cluster/6004/data/ pidfile /var/run/redis_6004.pid cluster-config-file nodes6004.conf
6005節點redis.conf配置文件修改,使用vi編輯器命令修改替換端口 命令模式下輸入 %s/6001/6005
port 6005 dir /usr/local/redis-cluster/6005/data/ pidfile /var/run/redis_6005.pid cluster-config-file nodes6005.conf
6006節點redis.conf配置文件修改,使用vi編輯器命令修改替換端口 命令模式下輸入 %s/6001/6006
port 6006 dir /usr/local/redis-cluster/6006/data/ pidfile /var/run/redis_6006.pid cluster-config-file nodes6006.conf
其實咱們也就是替換了上面的那四行配置而已。工具能幹的人就懶惰一點沒有什麼很差,呵呵。
到這裏,咱們已經把最基本的環境搞定了,接下來就是啓動了。
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6001/redis.conf /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6002/redis.conf /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6003/redis.conf /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6004/redis.conf /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6005/redis.conf /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6006/redis.conf
查看啓動進程
安裝集羣所需軟件
yum -y install ruby yum -y install rubygems
下載這個文件
連接:https://pan.baidu.com/s/1SBYTJ22FUTVOtsbiSmZNIg 密碼:u3ji
進行安裝,使用 gem install redis安裝基本是無望了,卡死,更改了不少源無效,因此只好下載手動安裝了
把下載好的文件上傳到/usr/local/src目錄
進入上傳好的插件目錄進行安裝
#cd /usr/local/src #gem install -l redis-3.2.1.gem
調用 ruby 命令來進行建立集羣,--replicas 1
表示主從複製比例爲 1:1,即一個主節點對應一個從節點;而後,默認給咱們分配好了每一個主節點和對應從節點服務,以及 solt 的大小,由於在 Redis 集羣中有且僅有 16384 個 solt(0--16383) ,默認狀況會給咱們平均分配,固然你能夠指定,後續的增減節點也能夠從新分配
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.100.131:6001 192.168.100.131:6002 192.168.100.131:6003 192.168.100.131:6004 192.168.100.131:6005 192.168.100.131:6006
輸入yes
M: e6a21c9f8bd16c9a082c9d93824faf00541f37ec 爲主節點Id
S: 8fd465aa4d066d3771209d1a34ce4acfaba82da7 192.168.100.131:6004 replicates e6a21c9f8bd16c9a082c9d93824faf00541f37ec
從節點id 也就是說6004節點是6001的從節點
上圖則表明集羣搭建成功啦!!!
接下來咱們連接6001節點
/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.100.131 -p 6001
咱們在6001節點set name 123456 發現自動重定向到6002節點了
這是因爲redis集羣內部會按照crc16算法把集羣按16384個卡槽均分存儲,而name經過crc16算法計算給分配到6002節點上了,那麼就會自動重定向到6002節點存儲。因此咱們看到咱們明明在6001節點set的數據爲啥客戶端會定向到6002節點的緣由。
如今咱們再回到6001節點客戶端查詢剛纔存儲的name的值
會定向到6002節點,redis分片集羣就是經過crc16算法計算卡槽來重定向從哪裏讀取數據和存儲數據,內部自動實現了重定向。
以上就是redis-cluster集羣的搭建和測試步驟。
總結:
Redis 集羣採用了P2P的模式,徹底去中心化。Redis 把全部的 Key 分紅了 16384 個 slot,每一個 Redis 實例負責其中一部分 slot 。集羣中的
全部信息(節點、端口、slot等),都經過節點之間按期的數據交換而更新。
Redis 客戶端能夠在任意一個 Redis 實例發出請求,若是所需數據不在該實例中,經過重定向命令引導客戶端訪問所需的實例。redis的服務器節點。它們任何兩個節點之間都是相互連通的。客戶端能夠與任何一個節點相鏈接,而後就能夠訪問集羣中的任何一個節點。對其進行存取和其餘操做。
那麼redis是怎麼作到的呢?首先,在redis的每個節點上,都有這麼兩個東西,一個是插槽(slot)能夠理解爲是一個能夠存儲兩個數值的一個變量這個變量的取值範圍是:0-16383。還有一個就是cluster我我的把這個cluster理解爲是一個集羣管理的插件。當咱們的存取的key到達的時候,redis會根據crc16的算法得出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,經過這個值,去找到對應的插槽所對應的節點,而後直接自動跳轉到這個對應的節點上進行存取操做。