redis入門(二)
目錄
- redis入門(二)
- 前言
- 持久化
- RDB
- AOF
- 持久化檔案載入
- 高可用
- 哨兵
- 流程
- 安裝部署
- 配置技巧
- 叢集
- 原理
- 叢集搭建
- 參考文件
redis入門(二)
前言
在redis入門(一)簡單介紹了redis的歷史和安裝部署,以及基本的資料結構和api,本節講解redis持久化、高可用、redis叢集和分散式相關的知識。
持久化
redis作為記憶體資料庫,資料全部儲存到記憶體中。但是若出現斷電等原因會造成資料丟失。redis內建了2種持久化的方式,分別為RDB持久化和AOF持久化。
RDB
RDB持久化是把當前程序資料生成快照儲存到硬碟的過程,換句話來說是將當前redis記憶體中的資料全部儲存到硬碟。觸發RDB持久化過程分為手動觸發和自動觸發。
手動觸發
可以通過
save
和bgsave
兩個命令手動執行儲存RDB快照。
save
命令:會阻塞當前redis主程序,直到RDB儲存完成,save命令已經棄用,不建議生產環境使用。
bgsave
命令:redis程序會執行fork操作建立程序執行儲存RDB快照。只有在fork子程序才會短時間阻塞。建議大家都是用bgsave
bgsave
命令127.0.0.1:26379> save OK 127.0.0.1:26379> bgsave Background saving started
自動觸發
- 使用save相關配置,如
save m n
。表示m秒內資料集存在n次修改時,自動觸發bgsave。 - 若節點執行全量複製操作時,主節點自動執行
bgsave
生成RDB檔案併發給從節點。 執行
debug reload
命令重新載入redis時,也會觸發save操作。redis debug命令提供了幾個非常實用的debug功能
預設情況下執行shutdown命令時,如果沒有開啟AOF持久化功能且設定過rdb自動儲存策略則會自動執行bgsave。
- 使用save相關配置,如
原理
- 執行bgsave命令,Redis父程序判斷當前是否存在正在執行的子程序,如RDB/AOF子程序,如果存在bgsave命令直接返回。
父程序執行fork操作建立子程序,fork操作過程中父程序會阻塞,通過
info stats
命令檢視latest_fork_usec選項,可以獲取最近一個fork操作的耗時,單位為微秒。127.0.0.1:26379> info stats # Stats total_connections_received:1 ... latest_fork_usec:5391
- 父程序fork完成後,
bgsave
命令返回Background saving started
資訊並不再阻塞父程序,可以繼續響應其他命令。 子程序建立RDB檔案,根據父程序記憶體生成臨時快照檔案,完成後對原有檔案進行原子替換。執行
lastsave
命令可以獲取最後一次生成RDB的時間,對應info統計的rdb_last_save_time
選項。程序傳送訊號給父程序表示完成,父程序更新統計資訊,具體見info Persistence
下的rdb_*相關選項。O127.0.0.1:26379> lastsave (integer) 1572423635
常用配置
節點名 | 說明 |
---|---|
save | m秒有n次修改自動儲存 |
dbfilename | RDB儲存檔名,會儲存到dir配置的路徑種 |
通過
config set dbfilename
可以動態修改RDB儲存檔名,下次執行RDB儲存時會儲存到新的檔名中。
經驗
- RDB檔案壓縮儲存可以大幅度降低檔案大小
- 若磁碟損壞可以通過
config set
命令動態修改redis根路徑和RDB檔案路徑。 - RDB檔案載入速度遠快於AOF檔案載入速度
- RDB方式儲存沒辦法做到實時儲存,因此不能用於儲存不能丟失的資料。
- RDB方式儲存每次都會將記憶體中的資料全量進行儲存,因此不適用於記憶體資料較大且需要頻繁儲存的場景。
AOF
AOF(appendonlyfile)持久化:以獨立日誌的方式記錄每次寫命令,重啟時再重新執行AOF檔案中的命令達到恢復資料的目的。AOF儲存的不是資料,而是每次執行的命令,因此AOF檔案會比RDB檔案大的多。
原理
- 所有的寫入命令會追加到aof_buf(緩衝區)中。
AOF緩衝區根據對應的策略向硬碟做緩衝區檔案操作。
AOF有三種緩衝區檔案同步策略
- 隨著AOF檔案越來越大,需要定期對AOF檔案進行重寫,達到壓縮的目的。
當Redis伺服器重啟時,可以載入AOF檔案進行資料恢復。
緩衝區同步策略
- 實時同步
通過配置appendfsync always
,命令寫入快取後,呼叫系統fsync同步檔案操作。 - 每秒同步
通過配置appendfsync ecerysec
,命令寫入快取後,呼叫系統write操作。一個專門的執行緒每秒呼叫一次fsync同步檔案操作。 - 作業系統決定何時同步
通過配置appendfsync no
,命令寫入快取後,不做fsync同步檔案操作,同步操作由作業系統負責,通常同步週期最長30秒
- write操作會觸發延遲寫(delayedwrite)機制。Linux在核心提供頁緩衝區用來提高硬碟IO效能。write操作在寫入系統緩衝區後直接返回。同步硬碟操作依賴於系統排程機制,例如:緩衝區頁空間寫滿或達到特定時間週期。同步檔案之前,如果此時系統故障宕機,緩衝區內資料將丟失。
- fsync針對單個檔案操作(比如AOF檔案),做強制硬碟同步,fsync將阻塞直到寫入硬碟完成後返回,保證了資料持久化。
重寫機制
隨著命令不斷寫入AOF,檔案會越來越大,為了解決這個問題,Redis引入AOF重寫機制優化命令。AOF檔案重寫是把Redis程序內的資料轉化為寫命令同步到新AOF檔案的過程。定時AOF重寫不但可以減小硬碟檔案佔用,同時可以在redis重啟時更快的載入AOF檔案。
AOF重寫會重寫以下內容,AOF重寫可以刪除已經超時的資料,舊的AOF無效命令(先新增後刪除),多條寫命令合併為一個(多條插入集合可以合併為一條插入命令)
手動觸發:直接呼叫
bgrewriteaof
命令。127.0.0.1:26379> bgrewriteaof Background append only file rewriting started
自動觸發:根據
auto-aof-rewrite-min-size
和auto-aof-rewrite-percentage
引數確定自動觸發時機。
- 執行AOF重寫請求。如果當前程序正在執行AOF重寫如果當前程序正在執行bgsave操作,重寫命令延遲到bgsave完成之後再執行。
- 父程序執行fork建立子程序,開銷等同於bgsave過程。
- 主程序fork操作完成後,繼續響應其他命令。所有修改命令依然寫入AOF緩衝區並根據appendfsync策略同步到硬碟,保證原有AOF機制正確性。
由於fork操作運用寫時複製技術,子程序只能共享fork操作時的記憶體資料。 - 子程序根據記憶體快照,按照命令合併規則寫入到新的AOF檔案。每次批量寫入硬碟資料量由配置
aof-rewrite-incremental-fsync
控制,預設為32MB,防止單次刷盤資料過多造成硬碟阻塞。 - 新AOF檔案寫入完成後,子程序傳送訊號給父程序。
- 由於父程序依然響應命令,Redis使用“AOF重寫緩衝區”儲存這部分新資料,防止新AOF檔案生成期間丟失這部分資料。
- 父程序更新統計資訊,具體見
info persistence
下的aof_*相關統計。
持久化檔案載入
- AOF持久化開啟且存在AOF檔案時,優先載入AOF檔案
- AOF關閉或者AOF檔案不存在時,載入RDB檔案
- 載入AOF/RDB檔案成功後,Redis啟動成功。
- AOF/RDB檔案存在錯誤時,Redis啟動失敗並列印錯誤資訊。
高可用
Redis支援主從複製,但是當發生故障的時候必須人工進行故障轉移,人工故障轉移實際就不是服務高可用。
- 2.8 版本之前 Redis 複製採用 sync 命令,無論是第一次主從複製還是斷線重連後再進行復制都採用全量同步,成本太高
- 2.8 ~ 4.0 之間複製採用 psync 命令,這一特性主要添加了 Redis 在斷線重連時候可通過 offset 資訊使用部分同步
- 4.0 版本之後也採用 psync,相比於 2.8 版本的 psync 優化了增量複製,這裡我們稱為 psync2.0,2.8 版本的 psync 可以稱為 psync
主從複製詳細流程可以看Redis 主從複製 psync1 和 psync2 的區別
哨兵
Redis Sentinel包含若干個Sentinel節點和Redis資料節點,每個Sentinel節點會對Redis節點和其餘Sentinel節點進行監控,當它發現節點不可達時,會對節點做下線標識。如果被標識的是主節點,它還會和其他Sentinel節點進行“協商”,當大多數Sentinel節點都認為主節點不可達時,它們會選舉出一個Sentinel節點來完成自動故障轉移的工作,同時會將這個變化實時通知給Redis應用方。整個過程完全是自動的,不需要人工來介入,所以這套方案很有效地解決了Redis的高可用問題。
哨兵僅僅時在主從複製之上做了額外的監控處理,因此實際架構並沒有發生改變。
Redis2.8版本的哨兵成為Redis Sentinel 2,對初始Sentinel實現的重寫,使用更強大、更簡單的預測演算法。Redis Sentinel 1是 Redis 2.6版本出廠的,已經棄用。
流程
- 哨兵定時監控主節點。
- 主節點發生故障時,若個哨兵對主節點發生故障情況達成一致,哨兵會選舉出一個哨兵節點作為領導者負責故障轉移。
- 哨兵從從節點選舉出一個新的節點作為主節點。執行
slaveof no one
命令,將其設定為主節點。 - 哨兵將其餘節點設定為新的主節點的從節點。執行
slaveof masterip masterport
從節點從主節點全量複製
redis4.0版本以後可以避免主從切換的全量複製問題。
安裝部署
關於哨兵的服務搭建可以檢視我的另一篇部落格《Windows版本redis高可用方案探究》,介紹了在windows版本的哨兵搭建,linux下也是大同小異的。
redis服務配置
配置名 | 配置說明 |
---|---|
slaveof | 主節點的ip和埠 |
requirepass | 當前節點的密碼 |
masterauth | 主節點的密碼 |
當主從設定密碼時,必須要設定為一樣的,否則可能出現主從切換時,密碼發生變化導致從無法連線上主。
哨兵配置
一個完整哨兵配置如下
port 26379
daemonize yes
logfile "26379.log"
dir "/opt/soft/redis/data"
sentinel myid 5511e27289c117b38f42d2b8edb1d5446a3edf68
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 10000
sentinel auth-pass mymaster test1
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
#發現兩個slave節點
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
#發現兩個sentinel節點
sentinel known-sentinel mymaster 127.0.0.1 26380 282a70ff56c36ed56e8f7ee6ada741 24140d6f53
sentinel known-sentinel mymaster 127.0.0.1 26381 f714470d30a61a8e39ae031192f1fe ae7eb5b2be
sentinel current-epoch 0
- 主redis配置
sentinel monitor <master-name> <ip> <port> <quorum>
- master-name:是主節點的別名
- ip和port:主節點的ip和埠
- quorum:代表要判定主節點最終不可達所需要的票數。
同一個哨兵可以監控多個主節點,只需要將不同主節點設定為不同的別名即可。
- 哨兵id
sentinel myid ID
哨兵首次啟動會生成一個40位的唯一id,並會將id寫入到配置檔案中: - 其他哨兵可選配置
sentinel <option_name> <master_name> <option_value>
其他配置結構都是以sentinel
開頭,後面根據一個配置名 然後是redis別名和配置值- down-after-milliseconds:每個哨兵節點都要定期傳送
ping
命令從而判斷Redis和其餘哨兵系欸點是否可達,若超過了配置的時間沒有恢復,則認為不可達,也被稱之為主觀下線。 配置格式為sentinel down-after-milliseconds <master-name> <times>
,times為超時時間,單位為毫秒 - parallel-syncs:當哨兵集合對主節點故障達成一致時,哨兵領導者節點會左故障轉移操作,選出新的主節點。而從節點則會向新的主節點進行資料複製操作。若有大量的從節點同時複製,對網路頻寬會佔用一定影響,尤其時Redis4.0以前每次主從切換都需要繼續全量資料同步。配置格式為
sentinel parallel-syncs <master-name> <nums>
,nums為並行同步的數量,配置為1時,從節點則會輪詢同步。 - failover-timeout:當故障轉移失敗時,過一點時間後再嘗試故障轉移。配置格式為
sentinel failover-timeout <master-name> <times>
,times為故障轉移失敗重試的時間間隔,單位為毫秒。 - auth-pass:若redis節點配置了密碼,則哨兵節點也需要配置redis的密碼。需要注意的是,若redis配置密碼,則主從Redis以及哨兵都需要配置相同的密碼。
notification-script:當發生故障轉移期間,當一些警告級別的Sentinel事件發生時(例如-sdown:客觀下線和、-odown:主觀下線),會觸發配置路徑的指令碼,並轉遞事件引數,可以通過指令碼通過右鍵、簡訊或其他方式進行通知預警。配置格式為
sentinel notification-script <master-name> <script-path>
,script-path為指令碼路徑。客觀下線:哨兵每隔1秒對主節點、從節點和其他哨兵節點發送
ping
命令做心跳檢測,當超過down-after-milliseconds
未響應,則認為節點不可達,即為主觀下線。
主觀下線:當哨兵監控的主節點主觀下線時,哨兵節點會通過通過 sentinel is-master-down-by-addr
命令向其他哨兵節點確認主節點是否下線。當有quorum
個哨兵認為主節點不可達(主觀下線)時,則認為主節點客觀下線(大部分哨兵都同意主節點下線,即為客觀),即當主節點客觀下線時哨兵領導者就會開始主節點的故障轉移。
* client-reconfig-script:當發生發生故障轉移發生主從切換時,可以呼叫特定指令碼執行指定的任務以通知新主節點的位置。sentinel client-reconfig-script <master-name> <script-path>
。
- down-after-milliseconds:每個哨兵節點都要定期傳送
動態修改配置
哨兵也和redis節點類似,支援動態修改配置,通過
sentinel set <master_name> <option_name> <option_value>
,修改當前哨兵的指定主節點的哨兵配置。
配置技巧
- 多個哨兵節點不應該部署在同一臺物理機上。
- 至少部署三個且為奇數個的哨兵。因為哨兵領導者至少需要一半加一個哨兵節點投票選舉。
叢集
Redis Cluster是官方提供的Redis分散式解決方案,在3.0版本正式推出。
原理
Redis叢集通過分片的方式來儲存資料庫中的鍵值對。一般有Hash分割槽和順序分割槽兩種方式分片,Redis使用Hash分割槽的方式將資料進行平均分佈。Redis內部分為0~16383個虛擬槽,將虛擬槽分發給各個Redis節點。叢集上線前需要先將所有虛擬槽分發完成。
當一個Redis節點設定了虛擬槽時,它通過訊息通知其他的節點自己所處的虛擬槽,這樣所有的Redis節點都會更新並儲存槽資訊。
叢集命令執行
當客戶端向叢集某個Redis傳送了一個命令時,該節點會計算要處理的資料鍵屬於哪個槽,若屬於自己的槽則直接執行命令,若屬於其他節點,則傳送一個MOVED錯誤執行請求重定向,客戶端接受到MOVE重定向請求則會將命令傳送到重定向後的節點執行。
重新分片
當Redis叢集重新分片時,則將重新分配的虛擬槽的資料轉移到目標節點,這個轉移操作並不會影響新的命令請求。
ASK錯誤
當在分片期間執行命令時,可能出現部分資料被遷移到新的節點中,部分資料還在老的節點中未遷移,Redis叢集也能夠從容的應對該種情況,通過ASK錯誤執行ASK重定向將客戶端轉向正在遷移的目標節點,客戶端則到新的節點重新執行命令。
叢集搭建
- 準備配置
- 啟動所有Redis節點
- Redis節點握手,發現叢集
- 分配虛擬槽
- 叢集上線
- 搭建叢集主從
搭建由3個Redis節點組成的叢集。將data目錄設定為redis根目錄,所有的RDB檔案,AOP檔案,日誌和配置都存放到data目錄中。
準備配置
準備三個配置檔案,以
redis-{port}.config
命名。
比如7379埠的redis節點配置如下,7380和7381配置類似。
port 7379 pidfile /var/run/redis_7379.pid logfile "log/redis-7379.txt" dbfilename dump-7379.rdb dir ./data/ appendfilename "appendonly-7379.aof" # 開啟叢集模式 cluster-enabled yes # 節點超時時間,單位毫秒 cluster-node-timeout 15000 # 叢集內部配置檔案 cluster-config-file "nodes-7379.conf"
啟動節點
啟動三個redis節點
shell jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7379.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7380.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7381.config
啟動完成由於沒有叢集配置,預設會先建立叢集配置nodes-{port}.conf
jake@Jake-PC:~/tool/demo/redis-cluster/redis/data$ ls appendonly-7379.aof appendonly-7381.aof nodes-7380.conf redis-7379.config redis-7380.config redis-7381.config appendonly-7380.aof nodes-7379.conf nodes-7381.conf redis-7379.txt redis-7380.txt redis-7381.txt
啟動成功後會顯示
Running in cluster mode
表示以叢集模式執行節點握手
節點握手是指叢集節點通過Gossip協議彼此通訊,達到感知對方的過程。只需要在客戶端發起
cluster meet {ip} {port}
命令。127.0.0.1:7379> cluster meet 127.0.0.1 7380 127.0.0.1:7379> cluster meet 127.0.0.1 7381
握手完畢後可以通過
cluster nodes
檢視當前的叢集節點127.0.0.1:7379> cluster nodes ffff2fe734c1ae5be4f66d574484a89f8bd303f3 127.0.0.1:7379@17379 myself,master - 0 1572506163000 0 connected 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 127.0.0.1:7381@17381 master - 0 1572506162658 2 connected 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 127.0.0.1:7380@17380 master - 0 1572506163689 1 connected
通過
cluster info
檢視當前叢集狀態127.0.0.1:7379> cluster info cluster_state:fail cluster_slots_assigned:0 cluster_slots_ok:0 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:3 cluster_size:0 cluster_current_epoch:2 cluster_my_epoch:0 cluster_stats_messages_ping_sent:84 cluster_stats_messages_pong_sent:88 cluster_stats_messages_meet_sent:2 cluster_stats_messages_sent:174 cluster_stats_messages_ping_received:88 cluster_stats_messages_pong_received:86 cluster_stats_messages_received:174
若此時讀寫資料會返回錯誤
127.0.0.1:7379> set hello redis-cluster (error) CLUSTERDOWN Hash slot not served 127.0.0.1:7379> get hello (error) CLUSTERDOWN Hash slot not served
由於前面我們提到了叢集搭建完成後必須先分配虛擬槽。
cluster_ slots_ assigned
是已分配的虛擬槽,目前是0,因此我們需要將虛擬槽進行分配。分配虛擬槽
通過命令
CLUSTER ADDSLOTS <slot> [slot ...]
分配虛擬槽,但是redis原生命令只能一個個分配或者一次分配多個,沒辦法直接分配一個區間的虛擬槽,因此需要自己修改redis原始碼支援,或者可以寫一個指令碼批量分配。批量分配槽
在linux上可以通過shell 指令碼,在windows上可以通過powershell,且powershell指令碼原生支援m..n生成m到n的一維陣列,比較方便。
我個人對linux上的shell指令碼不是很瞭解,查找了下資料也沒有像powershell或者python類似的初始化一維陣列的語法。
目前已經發布的powershell core(powershell 6.0)支援跨平臺,下面我們通過powershell指令碼實現批量分配槽。再次之前我先要在linux上安裝powershell
我本機安裝的是Ubuntu 18.04,以超級使用者身份註冊 Microsoft 儲存庫一次。 註冊後,可以通過
sudo apt-get upgrade powershell
更新PowerShell。# Download the Microsoft repository GPG keys wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb # Register the Microsoft repository GPG keys sudo dpkg -i packages-microsoft-prod.deb # Update the list of products sudo apt-get update # Enable the "universe" repositories sudo add-apt-repository universe # Install PowerShell sudo apt-get install -y powershell # Start PowerShell pwsh
下載並安裝完成後,通過
pwsh
可以啟用powershell,就可以執行powershell指令碼了。我們可以通過
redis-cli -p port CLUSTER ADDSLOTS <slot> [slot ...]
直接執行指令碼設定虛擬槽。
在powershell中分配0到5的一維陣列PS C:\Users\Dm_ca> 0..5 0 1 2 3 4 5
通過
redis-cli -p 7379 CLUSTER ADDSLOTS (0..5000)
分配0~5000的槽給7379埠PS /home/jake/tool/demo/redis-cluster/redis> ./src/redis-cli -p 7379 CLUSTER ADDSLOTS (0..5000) OK
同樣分配其他的從給其他redis節點
PS /home/jake/tool/demo/redis-cluster/redis> ./src/redis-cli -p 7380 CLUSTER ADDSLOTS (5001..10000) OK PS /home/jake/tool/demo/redis-cluster/redis> ./src/redis-cli -p 7381 CLUSTER ADDSLOTS (10001..16383) OK
再次檢視redis叢集狀態,可以看到狀態已經從fail變為ok,且cluster_slots_ok分配了16384個槽。
127.0.0.1:7379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:3 cluster_size:3 cluster_current_epoch:2 cluster_my_epoch:0 cluster_stats_messages_ping_sent:3734 cluster_stats_messages_pong_sent:3677 cluster_stats_messages_meet_sent:2 cluster_stats_messages_sent:7413 cluster_stats_messages_ping_received:3677 cluster_stats_messages_pong_received:3736 cluster_stats_messages_received:7413
檢視叢集節點情況,可以看到每個節點後分配的槽的範圍
127.0.0.1:7379> cluster nodes ffff2fe734c1ae5be4f66d574484a89f8bd303f3 127.0.0.1:7379@17379 myself,master - 0 1572510104000 0 connected 0-5000 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 127.0.0.1:7381@17381 master - 0 1572510106000 2 connected 10001-16383 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 127.0.0.1:7380@17380 master - 0 1572510106756 1 connected 5001-10000
搭建叢集主從
目前我們分配了3個主節點形成另一個redis叢集。但是若一個節點掛了,則整個叢集又會變為不可用狀態。
將7379節點關閉,然後檢視叢集狀態
127.0.0.1:7380> cluster nodes 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 127.0.0.1:7380@17380 myself,master - 0 1572510227000 1 connected 5001-10000 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 127.0.0.1:7381@17381 master - 0 1572510230245 2 connected 10001-16383 ffff2fe734c1ae5be4f66d574484a89f8bd303f3 127.0.0.1:7379@17379 master,fail - 1572510210543 1572510209905 0 disconnected 0-5000 127.0.0.1:7380> cluster info cluster_state:fail cluster_slots_assigned:16384 cluster_slots_ok:11383 cluster_slots_pfail:0 cluster_slots_fail:5001 cluster_known_nodes:3 cluster_size:3 cluster_current_epoch:2 cluster_my_epoch:1 ...
因此我們需要實現叢集高可用,為每個redis主節點加入從節點。
準備三個配置檔案埠分別設定為7479、7480和7481,分別對應7379、7380和7381的從庫。啟動三個redis節點
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7479.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7480.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7481.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7479 cluster meet 127.0.0.1 7379 OK jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7480 cluster meet 127.0.0.1 7380 OK jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7481 cluster meet 127.0.0.1 7379 OK
再次檢視叢集節點
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7481 cluster nodes 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 127.0.0.1:7380@17380 master - 0 1572514591000 1 connected 5001-10000 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 127.0.0.1:7381@17381 master - 0 1572514593720 2 connected 10001-16383 44b31c845115b8e20ad07c50ef1fa035a8f77574 127.0.0.1:7479@17479 master - 0 1572514592000 3 connected 57dd93502af7600b074ed1a021f4f64fbb56c3f4 127.0.0.1:7481@17481 myself,master - 0 1572514591000 5 connected 0e0899d1c692fa3106073880d974acd93c426011 127.0.0.1:7480@17480 master - 0 1572514592713 4 connected ffff2fe734c1ae5be4f66d574484a89f8bd303f3 127.0.0.1:7379@17379 master - 0 1572514592000 0 connected 0-5000
通過
cluster replicate {nodeId}
命令將當前節點設定為叢集主節點的從節點。jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7479 cluster replicate ffff2fe734c1ae5be4f66d574484a89f8bd303f3 OK jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7480 cluster replicate 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 OK jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7481 cluster replicate 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 OK
再次檢視節點狀態,可以看到三個新增節點已經變為從庫
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7481 cluster nodes 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 127.0.0.1:7380@17380 master - 0 1572514841965 1 connected 5001-10000 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 127.0.0.1:7381@17381 master - 0 1572514842981 2 connected 10001-16383 44b31c845115b8e20ad07c50ef1fa035a8f77574 127.0.0.1:7479@17479 slave ffff2fe734c1ae5be4f66d574484a89f8bd303f3 0 1572514842000 3 connected 57dd93502af7600b074ed1a021f4f64fbb56c3f4 127.0.0.1:7481@17481 myself,slave 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 0 1572514841000 5 connected 0e0899d1c692fa3106073880d974acd93c426011 127.0.0.1:7480@17480 slave 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 0 1572514841000 4 connected ffff2fe734c1ae5be4f66d574484a89f8bd303f3 127.0.0.1:7379@17379 master - 0 1572514840000 0 connected 0-5000
把7381的主庫斷開,後7481自動變為主。
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7381 shutdown 127.0.0.1:7481> cluster nodes 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 127.0.0.1:7380@17380 master - 0 1572515223688 1 connected 5001-10000 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 127.0.0.1:7381@17381 master,fail - 1572515116020 1572515114203 2 disconnected 44b31c845115b8e20ad07c50ef1fa035a8f77574 127.0.0.1:7479@17479 slave ffff2fe734c1ae5be4f66d574484a89f8bd303f3 0 1572515221634 3 connected 57dd93502af7600b074ed1a021f4f64fbb56c3f4 127.0.0.1:7481@17481 myself,master - 0 1572515220000 6 connected 10001-16383 0e0899d1c692fa3106073880d974acd93c426011 127.0.0.1:7480@17480 slave 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 0 1572515221000 4 connected ffff2fe734c1ae5be4f66d574484a89f8bd303f3 127.0.0.1:7379@17379 master - 0 1572515222656 0 connected 0-5000
最後將7381恢復,7381變為7481的從庫
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7381 cluster nodes 57dd93502af7600b074ed1a021f4f64fbb56c3f4 127.0.0.1:7481@17481 master - 0 1572515324842 6 connected 10001-16383 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 127.0.0.1:7380@17380 master - 0 1572515325852 1 connected 5001-10000 44b31c845115b8e20ad07c50ef1fa035a8f77574 127.0.0.1:7479@17479 slave ffff2fe734c1ae5be4f66d574484a89f8bd303f3 0 1572515322000 3 connected 1d3f7bd0d705ce2926ccc847b4323fcfbfe29f53 127.0.0.1:7381@17381 myself,slave 57dd93502af7600b074ed1a021f4f64fbb56c3f4 0 1572515324000 2 connected 0e0899d1c692fa3106073880d974acd93c426011 127.0.0.1:7480@17480 slave 36f26b6c6a87202a4a29eba4daf7bf2ff47e2914 0 1572515324000 4 connected ffff2fe734c1ae5be4f66d574484a89f8bd303f3 127.0.0.1:7379@17379 master - 0 1572515323837 0 connected 0-5000
參考文件
- redis
- redis開發與運維
- redis配置檔案詳解
- redis debug命令詳解
- Redis 主從複製 psync1 和 psync2 的區別
- 在 Linux 上安裝 PowerShell Core
本文地址:https://www.cnblogs.com/Jack-Blog/p/11776847.html
作者部落格:傑哥很忙
歡迎轉載,請在明顯位置給出出處及連結