Redis 3.0版以前未支持集羣功能,通常經過結合Twemproxy(Twitter出品)或者Codis(豌豆莢使用)基於代理方式來實現分佈式集羣,性能和穩定性都還不錯,只是配置和管理方面仍顯複雜,性能相比官方自帶的集羣仍是會有些許損失。新發布的3.0版現已默認內置支持集羣功能,並徹底去除中心化。Redis經過分區來保障集羣的可用性,確保即便部分節點失效或者沒法鏈接,集羣仍然可以繼續處理客戶請求。node
Redis使用數據分片而不是一致性哈希的方法來實現集羣。集羣總共包含16384個哈希槽,每一個節點分配一部分哈希槽,每一個鍵存放在其中的一個槽裏。這也意味着若是集羣未開啓主從複製,其中的任何一個節點宕機或斷網,這些槽中存放的鍵將沒法訪問到。因此開啓Redis集羣時,最好開啓複製,確保當主節點失效或者鏈接失敗時,該主節點對應的從節點可以頂替主節點繼續運做。固然,若是是某個主節點發生故障以及該主節點對應的全部從節點也同時出現故障,那麼此時集羣仍然仍是有問題的,也就意味着保存在已發生故障節點的那部分數據沒法訪問了。
git
下面介紹下Redis集羣的搭建步驟,暫不涉及到太多的Redis集羣理論知識,留待下次講解。github
一. 安裝Redisredis
Redis經常使用安裝管理腳本地址:http://dongsong.blog.51cto.com/916653/1649590編程
mkdir -p /App/src cd /App/src wget http://download.redis.io/releases/redis-3.0.1.tar.gz sh redis install
二. 搭建Redis集羣bash
測試環境使用一臺主機運行6個實例來構建集羣,每一個Redis實例經過啓動時指定不一樣的配置文件,配置文件存放在6個目錄下,區別在於端口號不一樣,未寫明的參數將使用Redis默認的配置。端口號從6380至6385。因爲默認配置的緣故,Redis將自動保存快照RDB文件至./目錄下,爲了不各個Redis實例自動備份路徑衝突,因此應該cd進入每一個目錄後再啓動。或者修改每一個配置文件的dir參數也可避免備份衝突。app
(1). 新建集羣測試基目錄:
編程語言
mkdir -p /App/redis/cluster cd /App/redis/cluster
(2). 新建Redis集羣精簡模板配置文件/App/redis/cluster/redis.conf,配置中文件nodes.conf爲啓動時自動建立,用於保存集羣狀態信息:分佈式
# redis.conf port 6380 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes daemonize yes logfile redis.log
(3). 添加一集羣管理腳本/App/redis/cluster/cluster,該程序只需修改好模板/App/redis/cluster/redis.conf,執行init便可初始化每一個實例的配置參數,並啓動或中止Redis集羣全部實例,(注意事項:Redis集羣節點會額外開啓一個新端口用於各節點交互通訊,額外端口爲redis.conf監聽端口參數port指定的數值+10000):ide
#!/bin/sh # Redis集羣實例管理 Redi***v=/App/redis/bin/redis-server RedisCli=/App/redis/bin/redis-cli Dir=$(cd $(dirname $0); pwd) Script=$(basename $0) Conf=redis.conf # 最小端口 SPort=6380 # 最大端口 EPort=6385 # 初始化 fInit() { for Port in $(seq $SPort $EPort) do mkdir -p $Dir/$Port cp -f $Dir/$Conf $Dir/$Port sed -i "s#^port $SPort#port $Port#" $Dir/$Port/redis.conf done } # 啓動 fStart() { for Port in $(seq $SPort $EPort) do cd $Dir/$Port $Redi***v redis.conf done } # 中止 fStop() { for Port in $(seq $SPort $EPort) do cd $Dir/$Port $RedisCli -p $Port shutdown done } Arg=$1 case $Arg in "init" ) fInit ;; "start" ) fStart ;; "stop" ) fStop ;; * ) echo "$Script init|start|stop" ;; esac
(4). 初始化,爲每一個實例都新建一個和端口號一致的目錄並修改監聽端口:
sh cluster init
(5). 啓動集羣全部Redis實例:
sh cluster start
(6). 建立Redis集羣,須要用到源碼包中src下的Ruby程序redis-trib.rb文件:
cp /App/src/redis-3.0.1/src/redis-trib.rb /App/redis/cluster/ cd /App/redis/cluster/ ./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
1. create,表示
建立一個新的集羣。
2. 選項 --replicas 1
表示爲集羣中的每一個主節點建立一個從節點。
3. 其他參數則是新建集羣中實例的地址列表。
(7). 看到上圖相似輸出表示:監聽6380端口Redis分配了0-5460共5461個槽,6383爲6380的從;6381分配了5461-10922共5462個槽,6384爲6381的從;6382分配了10923-16383共5461個槽,6385爲6382的從。輸入yes並回車確認。
(8). 看到上圖表示集羣已新建成功,3主3從節點,每一個節點都有不一樣的ID。總共使用了16384個Hash槽。
三. 測試集羣
1. redis-cli程序必須添加 -c 參數選項,纔可實現基本的集羣支持操做。
2. 停掉一個主庫後
3. 檢查集羣情況
從以上能夠看出,6383從節點成功代替了6380主節點並修改成主節點,集羣服務未受影響。
四. 支持Redis集羣客戶端
Redis從剛發佈的3.0版才正式開始支持集羣功能,目前支持集羣功能的客戶端還比較缺少,穩定性也尚需時間檢驗,下面列舉一些已開始部分支持Redis集羣的編程語言客戶端:
1. Shell:新版自帶redis-cli實用程序,加上 -c 參數已提供基本的集羣支持。
2. PHP:Predis
3. Java:Jedis
4. Ruby:redis-rb-cluster
5. Python:redis-py-cluster
6. C#:StackExchange.Redis
7. Node.js:thunk-redis