Redis Cluster高可用(HA)集群环境搭建详细步骤
1.為什么要有集群
由于Redis主從復制架構每個數據庫都要保存整個集群中的所有數據,容易形成木桶效應,所以Redis3.0之后的版本添加特性就是集群(Cluster)
2.Redis集群架構說明
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集群中超過半數的master節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->key
3.Redis Cluster環境搭建
3.1 分別修改配置文件,將端口分別設置為:6379、6380、6381,同時要設置pidfile文件為不同的路徑。并且允許集群模式,修改集群配置文件指向地址,并且開啟遠程訪問
3.2 分別啟動redis實例
#?cd?/opt/redis/redis-3.2.8/bin #?./redis-server?/opt/redis/6379/6379.conf? #?./redis-server?/opt/redis/6380/6380.conf????? #?./redis-server?/opt/redis/6381/6381.conf3.3 查看redis狀態
說明redis已經是以集群方式啟動了,但是redis之間關系還沒確定下來
3.4 因為redis-trib.rb是由ruby語言編寫的所以需要安裝ruby環境
安裝ruby環境 #?yum?-y?install?zlib?ruby?rubygems#gem?install?redis 報異常:解決 https://www.cnblogs.com/PatrickLiu/p/8454579.html3.5 建立集群Redis關系
首先,進入redis的安裝包路徑下 #?cd?/opt/redis/redis-3.2.8/src執行命令: #?./redis-trib.rb?create?--replicas?0?192.168.29.128:6379?192.168.29.128:6380?192.168.29.128:6381說明:--replicas?0:指定了從數據的數量為0 注意:這里不能使用127.0.0.1,否則在Jedis客戶端使用時無法連接到!3.6 如果出現如下異常
sr/local/share/gems/gems/redis-3.2.1/lib/redis/client.rb:113:in?`call':?ERR?Slot?0?is?already?busy?(Redis::CommandError)from?/usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2556:in?`block?in?method_missing'from?/usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in?`block?in?synchronize'from?/usr/share/ruby/monitor.rb:211:in?`mon_synchronize'from?/usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in?`synchronize'from?/usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2555:in?`method_missing'from?./redis-trib.rb:212:in?`flush_node_config'from?./redis-trib.rb:776:in?`block?in?flush_nodes_config'from?./redis-trib.rb:775:in?`each'from?./redis-trib.rb:775:in?`flush_nodes_config'from?./redis-trib.rb:1296:in?`create_cluster_cmd'from?./redis-trib.rb:1701:in?`<main>'經檢查,這是由于上一次配置集群失敗時留下的配置信息導致的。 只要把redis.conf中定義的 cluster-config-file 所在的文件刪除,重新啟動redis-server及運行redis-trib即可。
3.7 建立集群Redis關系正常執行響應如下
>>>?Creating?cluster >>>?Performing?hash?slots?allocation?on?3?nodes... Using?3?masters: 192.168.29.128:6379 192.168.29.128:6380 192.168.29.128:6381 M:?d5d0951bb185a67a44d29dd2142170dbce84d977?192.168.29.128:6379slots:0-5460?(5461?slots)?master M:?e41fe58ef571836d891656b482307628b3f7ab35?192.168.29.128:6380slots:5461-10922?(5462?slots)?master M:?ddbc810661f81500059e0b22b1550713a0e3766d?192.168.29.128:6381slots:10923-16383?(5461?slots)?master Can?I?set?the?above?configuration??(type?'yes'?to?accept):?yes >>>?Nodes?configuration?updated >>>?Assign?a?different?config?epoch?to?each?node >>>?Sending?CLUSTER?MEET?messages?to?join?the?cluster Waiting?for?the?cluster?to?join... >>>?Performing?Cluster?Check?(using?node?192.168.29.128:6379) M:?d5d0951bb185a67a44d29dd2142170dbce84d977?192.168.29.128:6379slots:0-5460?(5461?slots)?master0?additional?replica(s) M:?ddbc810661f81500059e0b22b1550713a0e3766d?192.168.29.128:6381slots:10923-16383?(5461?slots)?master0?additional?replica(s) M:?e41fe58ef571836d891656b482307628b3f7ab35?192.168.29.128:6380slots:5461-10922?(5462?slots)?master0?additional?replica(s) [OK]?All?nodes?agree?about?slots?configuration. >>>?Check?for?open?slots... >>>?Check?slots?coverage... [OK]?All?16384?slots?covered. 成功***************************************************************************** 注:redis集群?Waiting?for?the?cluster?to?join?一直等待 ./redis-trib.rb?create?--replicas?1?XXXX:PORT1?XXXX:PORT2?.... 的時候 一直等待?Waiting?for?the?cluster?to?join?很久都沒有反應 原因: redis集群不僅需要開通redis客戶端連接的端口,而且需要開通集群總線端口 集群總線端口為redis客戶端連接的端口?+?10000 如redis端口為6379 則集群總線端口為16379 故,所有服務器的點需要開通redis的客戶端連接端口和集群總線端口 注意:iptables?放開,如果有安全組,也要放開這兩個端口 *******************************************************************************3.8 查看集群節點信息
3.9 測試
3.9.1 測試插入數據
因為abc的hash槽信息是在6380上,現在使用redis-cli連接的6379,無法完成set操作,需要客戶端跟蹤重定向。使用redis-cli -c
3.9.2 重新測試插入數據
4. 插槽的概念及插槽分配
整個Redis提供了16384個插槽,也就是說集群中的每個節點分得的插槽數總和為16384。./redis-trib.rb 腳本實現了是將16384個插槽平均分配給了N個節點。當我們執行set abc 123命令時,redis是如何將數據保存到集群中的呢?執行步驟:
注意:如果插槽數有部分是沒有指定到節點的,那么這部分插槽所對應的key將不能使用。
5.新增集群節點
5.1 再開啟一個實例的端口為6382 配置同上
5.2 執行腳本建立6382節點與集群的關系
5.3 查看集群狀態,發現新增的節點沒有插槽
5.4 給6382節點分配插槽
5.5 查看集群節點狀態
6.刪除集群節點
想要刪除集群節點中的某一個節點,需要嚴格執行2步:
6.1.將這個節點上的所有插槽轉移到其他節點上
6.1.1執行腳本:./redis-trib.rb reshard 192.168.29.128:6382
6.1.2選擇需要轉移的插槽的數量,因為6382有100個,所以轉移100個
6.1.3輸入轉移的節點的id,我們轉移到6379節點
6.1.4輸入插槽來源id,也就是6382的id
6.1.5輸入done,開始轉移
6.1.6查看集群節點信息,可以看到6380節點已經沒有插槽了
6.2.刪除節點
6.2.1 刪除節點
6.2.2 查看集群節點信息
7. Redis Cluster高可用
7.1 假設集群中某一節點宕機 測試數據寫入操作
我們嘗試執行set命令,結果發現無法執,行集群不可用了?? 這集群也太弱了吧??
7.2 集群中的主從復制架構
7.3 本教程不詳細介紹集群中主從復制架構的具體安裝,只提一下過程
7.3.1 為每個集群節點添加Slave,形成主從復制架構,主從復制架構可參考:主從復制架構,搭建結構如下所示
6379(Master)?????6479(Slave?of?6379)?????6579(Slave?of?6379) 6380(Master)?????6480(Slave?of?6380)?????6580(Slave?of?6380) 6381(Master)?????6481(Slave?of?6381)?????6581(Slave?of?6381)7.3.2 為每個主從復制架構添加哨兵集群,哨兵模式集群可參考:哨兵模式集群
7.3.3 創建集群 使用如下命令
參考:
https://blog.csdn.net/robertohuang/article/details/70833231
轉載于:https://blog.51cto.com/4925054/2090841
總結
以上是生活随笔為你收集整理的Redis Cluster高可用(HA)集群环境搭建详细步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java类中serialversionu
- 下一篇: 内核进程切换实现分析