redis-cluster是redis官方提供的分佈式數據庫解決方案,集羣經過分片進行數據共享,並提供複製和故障轉移功能。css
redis集羣主要分爲主節點和從節點。主節點用於處理槽,而從節點用於複製某個主節點,並在被複制的主節點下線時,代替主節點繼續處理命令請求。node
Redis分區規則nginx
redis cluster 採用虛擬槽分區,全部的鍵根據哈希函數映射到0-16383整數槽內,每個節點負責維護一部分槽以及槽所映射的鍵值數據。槽是集羣內數據管理和遷移的基本單位。redis
redis虛擬槽分區的特色:sql
解耦數據與節點之間的關係,簡化了節點擴容和收縮難度。數據庫
節點自身維護槽的映射關係,無需客戶端維護槽分區元數據。ruby
支持節點、槽、鍵之間的映射查詢,用於數據路由、在線伸縮等場景。服務器
當數據庫中的16384個槽都有節點在處理時,集羣處於上線狀態,不然集羣處於下線狀態。微信
集羣搭建運維
redis集羣節點數量至少爲6個才能保證組成完整的高可用集羣,咱們在一臺服務器上啓動6個redis進程來模擬3主3從的redis集羣。
集羣模式須要開啓cluster-enabled yes參數,使其在集羣模式下運行。集羣相關配置以下:
#端口port 6379#開啓集羣模式cluster-enabled yes#集羣內部配置文件cluster-config-file "/data/6379-cluster/nodes-6379.conf"#節點超時時間,單位毫秒cluster-node-timeout 15000#本地數據庫存放目錄dir "/data/6379-cluster/6379-cluster"#日誌輸出的路徑及文件名稱logfile "/data/6379-cluster/log/redis_6379-cluster.log"
配置完以後複製配置文件,複製多份,而且修改配置文件中的端口、數據庫存放路徑、log路徑等參數。
cp redis_6379.conf redis_6380.conf cp redis_6379.conf redis_6381.conf cp redis_6379.conf redis_6382.conf cp redis_6379.conf redis_6383.conf cp redis_6379.conf redis_6384.conf
redis-server redis_6379.conf redis-server redis_6380.conf redis-server redis_6381.conf redis-server redis_6382.conf redis-server redis_6383.conf redis-server redis_6384.conf
節點握手是指一批運行在集羣模式下的節點經過Gossip協議彼此通信,到達互相感知的過程。握手命令:cluster meet {IP} {PORT}
127.0.0.1:6379> cluster meet 127.0.0.1 6380127.0.0.1:6379> cluster meet 127.0.0.1 6381127.0.0.1:6379> cluster meet 127.0.0.1 6382127.0.0.1:6379> cluster meet 127.0.0.1 6383127.0.0.1:6379> cluster meet 127.0.0.1 6384
127.0.0.1:6379> cluster nodesa0b3d847f634588eeaad7e1dea844a1371bb3bd2 127.0.0.1:6380@16380 master - 0 1596595676362 1 connected2b06b51b6453cd75e8ca24687668f6caf9f51bb2 127.0.0.1:6381@16381 master - 0 1596595674320 2 connectedc2f93c56c33cd4532effb92f8cb4d578fbfdb6f5 127.0.0.1:6384@16384 master - 0 1596595675000 4 connectedc0c09a5689f7b5eb3c1e4621cc048c7863605c61 127.0.0.1:6382@16382 master - 0 1596595674000 3 connected67a80941bef448769a3777018c00360f05bc030c 127.0.0.1:6383@16383 master - 0 1596595675344 5 connectedde08278d07ef9c2e5f863614c45352f1deb04797 127.0.0.1:6379@16379 myself,master - 0 1596595674000 0 connected
如今的集羣狀態仍是fail,是由於集羣尚未完成槽到節點的映射。
127.0.0.1:6379> cluster infocluster_state:failcluster_slots_assigned:0cluster_slots_ok:0cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:0cluster_current_epoch:5cluster_my_epoch:0cluster_stats_messages_ping_sent:626cluster_stats_messages_pong_sent:386cluster_stats_messages_meet_sent:9cluster_stats_messages_sent:1021cluster_stats_messages_ping_received:386cluster_stats_messages_pong_received:341cluster_stats_messages_received:727
redis集羣須要把全部數據映射到16384個槽內,每一個key會映射爲一個固定的槽,只有節點分配了槽才能響應和槽關聯的鍵命令。
[redis@node1 ~]$ redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0..5461}OK[redis@node1 ~]$ redis-cli -h 127.0.0.1 -p 6381 cluster addslots {5462..10922}OK[redis@node1 ~]$ redis-cli -h 127.0.0.1 -p 6383 cluster addslots {10923..16383}OK
第六步咱們已經爲三個主節點分配了槽,接下來爲三個主節點分配從節點。使用cluster replicate {nodeID}命令,命令必須在從節點執行,nodeID是主節點ID。
127.0.0.1:6380> cluster replicate de08278d07ef9c2e5f863614c45352f1deb04797OK127.0.0.1:6382> cluster replicate 2b06b51b6453cd75e8ca24687668f6caf9f51bb2OK127.0.0.1:6384> cluster replicate 67a80941bef448769a3777018c00360f05bc030cOK
經過cluster info和cluster nodes命令查看集羣狀態和複製關係。
redis-trib.rb搭建集羣
redis-trib.rb是redis官方推出的管理redis集羣的工具,集成在redis的源碼src目錄下,是基於redis提供的集羣命令封裝成簡單、便捷、使用的操做工具,能夠實現集羣的建立、檢查、槽遷移和均衡等常見運維操做。
安裝ruby
tar -zxvf ruby-2.6.5.tar.tar./configure -prefix=/usr/local/rubymakemake installcd /usr/local/ruby/cp bin/ruby /usr/local/bincp bin/gem /usr/local/bin/#安裝rubygem redis依賴gem install -l redis-4.1.0.gem#安裝redis-trib.rbcp /usr/local/redis/src/redis-trib.rb /usr/local/bin/
首先是修改conf配置文件以及啓動redis,步驟同上一章的前兩步一致,這裏就先忽略,咱們用redis-trib.rb建立集羣。
[redis@node1 ~]$ redis-trib.rb create --replicas 1 127.0.0.1:6379 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
[redis@node1 ~]$ redis-trib.rb check 127.0.0.1:6379
[redis@node1 ~]$ redis-trib.rb info 127.0.0.1:6379
redis-trib.rb管理集羣
上面咱們介紹了用redis-trib.rb如何搭建集羣,如今咱們來演示下如何經過redis-trib.rb管理集羣。
首先啓動一個新的實例。
redis-server redis_6385.conf
將該節點加入到集羣中
redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379
爲新節點分配slot
redis-trib.rb reshard 127.0.0.1:6385How many slots do you want to move (from 1 to 16384)? 300 //移動多少槽What is the receiving node ID? 629c52d1a6cb53e220ad58a864a7f00acbc12831 //接收槽的節點Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. //all表明從全部master從新分配 Type 'done' once you entered all the source nodes IDs. //從指定節點分配槽,最後用done結束。Source node #1:777ead5811e3da124ddfa141decfebed2d7a56b6 //源Source node #2:done
前兩步操做同添加master同樣。
redis-cli鏈接上新節點,輸入命令:cluster replicate對應的master的mode-id
針對於非空master,首先須要遷移slots,我麼把127.0.0.1:6385遷移到127.0.0.1:6379
redis-trib.rb reshard 127.0.0.1:6379
刪除空的master節點
redis-trib.rb del-node 127.0.0.1:6379 629c52d1a6cb53e220ad58a864a7f00acbc12831
爲了方便你們交流,我建了一個微信羣,你們能夠在羣裏聊技術、聊理想、聊生活,歡迎加入!
本文分享自微信公衆號 - MySQL數據庫技術棧(Mysqltechnology)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。