redis 3.0以上支援叢集,由於叢集需要ruby支援,需要先安裝ruby環境並下載通訊管理組件
ruby環境安裝
redis命令參考:http://doc.redisfans.com/
ruby處理好後,開始實現叢集的搭建
1、建立cluster檔案夾,並在裡面再建立10010、10020、10030、10040、10050、10060檔案夾
(主10010,從10020;主10030,從10040;主10050,從10060)
2、把redis安裝目錄下的redis.conf檔案,cp到10010檔案夾
修改redis.conf配置文
A、修改bind 127.0.0.1的ip為你伺服器ip
B、修改port的連接埠為10010
C、修改daemonize的no為yes;啟動守護進程,產生pid檔案
D、修改pidfile值,pid檔案存放路徑
E、修改loglevel值,log等級,可改為debug
F、修改logfile值,log檔案存放路徑
G、修改appendonly值,啟動aof持久化。不過搭建主從的話,考慮禁用主redis持久化,從redis進行持久化就行了
H、啟動cluster-enabled yes;啟動叢集
I、啟動cluster-conf-file nodes-10010.conf;存放雜湊槽
J、啟動cluster-node-timeout 15000;節點逾時時間
修改並儲存檔案後,再分別把該redis.conf檔案,cp到10020、10030、10040、10050、10060檔案夾,並做相應修改
3、分別啟動各節點
啟動後,串連redis用戶端
命令:redis-cli -c -h [IP] -p [port];串連叢集用戶端,命令加-c。
串連上,查看叢集狀態資訊
命令:cluster info
可以看到狀態是fail,雜湊槽數量也是0;
4、通過redis提供的redis-trib.rb叢集管理工具進行管理(redis-trib.rb使用ruby寫的,所以需要安裝ruby環境,並下載相關redis包)。
在redis安裝目錄下,進入src目錄,可以看到redis-trib.rb
執行命令:./redis-trib.rb create --replicas 1 [IP]:[port] [IP]:[port] [IP]:[port] [IP]:[port] [IP]:[port] [IP]:[port]
--replicas 1,標識設定從節點數1個
[IP]:[port],前面三個是主節點,後面三個是從節點
在這一步如果你安裝了ruby還是會提示以下錯誤
rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
請安裝redis叢集通訊相關包
命令:gem install redis
5、以上操作,通過叢集管理器實現了叢集的管理和主從的實現。再次串連叢集用戶端查看叢集資訊
可以看到狀態ok,並且有16384個雜湊槽。這16384個雜湊槽被平均分配到三個主節點上
(看上圖中10010節點是0-5460(5461 slots),10030節點是5461-10922(5462 slots),10040節點是10923-16383(5461 slots))
6、redis通過對key使用crc16 演算法算出一個結果,然後把結果對16384求餘數,對應在哪個節點就資料就會存入哪個節點
-----------------------------------------------------------------------------------------------------------
叢集關閉,我的方法
1、kill -9 所遇redis叢集相關進程
2、清理redis叢集相關檔案夾下的nodexxx.conf檔案
3、重啟redis並建立redis叢集管理節點
-----------------------------------------------------------------------------------------------------------
叢集節點的動態增加
1、增加節點,建立10070檔案夾,並且cp設定檔redis.conf到該目錄下,修改設定檔再啟動
命令:./redis-trib.rb add-node [ip]:[port] [ip]:[port];redis安裝目錄下src目錄下執行
前面一個[ip]:[port]是剛才建立需要加入的服務節點,後面一個是目標服務
2、查看叢集節點資訊,串連叢集用戶端後執行命令
命令:cluster nodes;可以看到10070已經加入叢集,但是還沒有分配雜湊槽
3、分配雜湊槽
命令:./redis-trib.rb reshard [ip]:[port];redis安裝目錄下src目錄下執行
執行命令後,需要確認分雜湊槽數量,確認後需再次確認目標節點的ID,確認後需再次確認是否節點均分(#1:all);所有確認完成開始節點調整
4、再次查看叢集節點資訊,串連叢集用戶端後執行命令
命令:cluster nodes;可以看到10070已經加入叢集,並且分配雜湊槽
-----------------------------------------------------------------------------------------------------------
叢集節點的動態刪除
1、回收雜湊槽
命令:./redis-trib.rb reshard [ip]:[port];redis安裝目錄下src目錄下執行
執行命令後,需要確認接收雜湊槽的節點ID,確認後需再次確認會被回收雜湊槽的節點ID,確認後(#1:done);所有確認完成開始節點調整
2、查看叢集節點資訊,串連叢集用戶端後執行命令
命令:cluster nodes;可以看到10070節點的雜湊槽已經被分配到10010節點
3、刪除節點
命令:./redis-trib.rb del-node [ip]:[port] [nodeid];需要刪除節點的ip和連接埠,nodeid是該節點的id
4、再次查看叢集節點資訊,串連叢集用戶端後執行命令
命令:cluster nodes;可以看到10070節點已經被刪除了
命令:cluster nodes;可以看到10070節點的雜湊槽已經被分配到10010節點
-----------------------------------------------------------------------------------------------------------
sentinel高可用,實現主從自動切換
sentinel.conf在redis安裝目錄下
修改檔案配置
1、除sentinel預設連接埠26379可以不用修改,其它沒有注釋的選項都注釋掉
2、修改設定檔
sentinel monitor [自訂需要監控主節點名稱] [主節點IP] [主節點連接埠] [定義多少 sentinel認為master節點掛了才切換主從]
sentinel down-after-milliseconds [和自訂名稱保持一致] [逾時時間,單位毫秒]
sentinel failover-timeout [和自訂名稱保持一致] [逾時時間,單位毫秒]
sentinel parallel-syncs [和自訂名稱保持一致] [進行sync的slave個數]
3、啟動sentinel,在redis安裝目錄下的src目錄下執行命令 命令:./redis-sentinel ../sentinel.conf
* 可以測試當10010節點shutdown後,10020會變成主節點,並繼承10010的雜湊槽。再次啟動10010,會發現10010變成了10020的從節點。並且sentinel.conf會自動修改