手把手帶你搭建redis集羣

    redis-clusterredis官方提供的分佈式數據庫解決方案,集羣經過分片進行數據共享,並提供複製和故障轉移功能。css

    redis集羣主要分爲主節點和從節點。主節點用於處理槽,而從節點用於複製某個主節點,並在被複制的主節點下線時,代替主節點繼續處理命令請求。node


Redis分區規則nginx


    redis cluster 採用虛擬槽分區,全部的鍵根據哈希函數映射到0-16383整數槽內,每個節點負責維護一部分槽以及槽所映射的鍵值數據。槽是集羣內數據管理和遷移的基本單位。redis

redis虛擬槽分區的特色:sql

  • 解耦數據與節點之間的關係,簡化了節點擴容和收縮難度。數據庫

  • 節點自身維護槽的映射關係,無需客戶端維護槽分區元數據。ruby

  • 支持節點、槽、鍵之間的映射查詢,用於數據路由、在線伸縮等場景。服務器

  • 當數據庫中的16384個槽都有節點在處理時,集羣處於上線狀態,不然集羣處於下線狀態。微信

集羣搭建運維


    redis集羣節點數量至少爲6個才能保證組成完整的高可用集羣,咱們在一臺服務器上啓動6redis進程來模擬33從的redis集羣。

1. 節點配置

集羣模式須要開啓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
2. 分別啓動redis服務進程

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
3. 節點握手

節點握手是指一批運行在集羣模式下的節點經過Gossip協議彼此通信,到達互相感知的過程。握手命令:cluster meet {IP} {PORT}

127.0.0.1:6379cluster meet 127.0.0.1 6380127.0.0.1:6379cluster meet 127.0.0.1 6381127.0.0.1:6379cluster meet 127.0.0.1 6382127.0.0.1:6379cluster meet 127.0.0.1 6383127.0.0.1:6379> cluster meet 127.0.0.1 6384
4. 查看當前集羣組件狀況

127.0.0.1:6379cluster 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
5. 查看集羣狀態

如今的集羣狀態仍是fail,是由於集羣尚未完成槽到節點的映射。

127.0.0.1:6379cluster 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
6. 分配槽

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
7. 加入從庫

第六步咱們已經爲三個主節點分配了槽,接下來爲三個主節點分配從節點。使用cluster replicate {nodeID}命令,命令必須在從節點執行,nodeID是主節點ID

127.0.0.1:6380cluster replicate de08278d07ef9c2e5f863614c45352f1deb04797OK127.0.0.1:6382cluster replicate 2b06b51b6453cd75e8ca24687668f6caf9f51bb2OK127.0.0.1:6384cluster replicate 67a80941bef448769a3777018c00360f05bc030cOK
8. 查看集羣狀態

經過cluster infocluster nodes命令查看集羣狀態和複製關係。

redis-trib.rb搭建集羣


    redis-trib.rbredis官方推出的管理redis集羣的工具,集成在redis的源碼src目錄下,是基於redis提供的集羣命令封裝成簡單、便捷、使用的操做工具,能夠實現集羣的建立、檢查、槽遷移和均衡等常見運維操做。

1. 環境準備

安裝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/
2. 建立集羣

首先是修改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
3. check檢查集羣

[redis@node1 ~]$ redis-trib.rb check 127.0.0.1:6379
4. info查看集羣信息

[redis@node1 ~]$ redis-trib.rb info 127.0.0.1:6379


redis-trib.rb管理集羣


上面咱們介紹了用redis-trib.rb如何搭建集羣,如今咱們來演示下如何經過redis-trib.rb管理集羣。


1. 添加master節點


首先啓動一個新的實例。

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 ID629c52d1a6cb53e220ad58a864a7f00acbc12831 //接收槽的節點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
2. 添加slave節點

前兩步操做同添加master同樣。

redis-cli鏈接上新節點,輸入命令:cluster replicate對應的mastermode-id

3. 從集羣中刪除節點

針對於非空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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索