淮安網(wǎng)站建設(shè)公司電話源碼交易平臺
探究Redis服務(wù)啟動的過程機制的技術(shù)原理和流程分析的指南(集群指令分析—下篇)
- Cluster XX的集群指令(擴展)
- 寫入記錄
- 主節(jié)點和備節(jié)點切換-CLUSTER FAILOVER
- 新加入master節(jié)點
- 新加入slave節(jié)點
- 為slave節(jié)點重新分配master
- 分配哈希槽
- 刪除從節(jié)點
- 刪除主節(jié)點
- 檢查集群所有節(jié)點是否正常
Cluster XX的集群指令(擴展)
下面是對Redis集群擴展的指令:
cluster myid
:用于獲取當前節(jié)點的ID。
該指令返回節(jié)點的ID。在Redis集群中,每個節(jié)點都有一個唯一的ID,通過該指令可以獲取當前節(jié)點的ID。這個ID在集群中具有重要的作用,例如在進行節(jié)點之間的通信時進行鑒權(quán)。
cluster slots
:用于獲取當前節(jié)點負責的槽信息。
該指令用于返回節(jié)點負責的槽(slot)信息。在Redis集群中,數(shù)據(jù)通過哈希槽的方式進行分片存儲,每個槽代表一個指定范圍的數(shù)據(jù),每個節(jié)點負責管理一部分槽。通過該指令可以獲取當前節(jié)點負責管理的槽的信息,包括槽的起始和結(jié)束范圍以及負責該槽的主節(jié)點和從節(jié)點信息。
cluster reset
:用于重置Redis集群的狀態(tài),慎用,可能導致數(shù)據(jù)丟失和系統(tǒng)不可用。
該指令用于重置Redis集群。這個指令的作用比較危險,它會重置整個集群的狀態(tài),并清除所有的節(jié)點信息和槽分配信息。因此,使用該指令需要非常謹慎,因為重置集群可能導致數(shù)據(jù)丟失和系統(tǒng)不可用。一般情況下,只有在出現(xiàn)集群狀態(tài)混亂或需要重新搭建集群時才會使用該指令。
寫入記錄
只有擁有哈希槽的節(jié)點才能存儲數(shù)據(jù),因此只有主節(jié)點才有寫入數(shù)據(jù)的權(quán)限。
[root src]# redis-cli -h xx.xx.xx.xx -p 6380
xx.xx.xx.xx:xxxx> get key
(nil)
xx.xx.xx.xx:xxxx> set key 123
OK
主節(jié)點和備節(jié)點切換-CLUSTER FAILOVER
在需要的slaves節(jié)點上執(zhí)行命令:CLUSTER FAILOVER,要進行主備切換,您需要先登錄到備節(jié)點,然后在備節(jié)點上執(zhí)行切換到主節(jié)點的命令。
[root ~]# /data/redis-x.x.x/src/redis-cli -h xx.xx.xx.xx -p xxxx
xx.xx.xx.xx:xxxx> cluster failover
(error) ERR You should send CLUSTER FAILOVER to a slave
xx.xx.xx.xx:xxxx> exit[root ~]# /data/redis-x.x.x/src/redis-cli -h xx.xx.xx.xx -p xxxx2
xx.xx.xx.xx:xxxx2> cluster failover ##切換到主節(jié)點
OK
xx.xx.xx.xx:xxxx> cluster nodes
777c9eab94812d13d8b9dc768460dcf1316283f1 xx.xx.xx.xx:xxxx slave c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c 0 1511223574993 6 connected
92dfe8ab12c47980dcc42508672de62bae4921b1 xx.xx.xx.xx:xxxx2 myself,master - 0 0 8 connected 500-5460
2f003cfd139ae4f2bbdac40b0055b46bdff96e0a xx.xx.xx.xx:xxxx slave 92dfe8ab12c47980dcc42508672de62bae4921b1 0 1511223577007 8 connected
新加入master節(jié)點
Redis實例添加到集群之前,請務(wù)必確保該Redis實例沒有存儲過任何數(shù)據(jù),并且沒有持久化的數(shù)據(jù)文件,否則在添加過程中會出現(xiàn)錯誤,為了進行節(jié)點的維護操作,您需要使用redis-trib.rb工具而不是redis-cli客戶端。在退出客戶端后,可以按照以下命令使用該工具:
/redis所在目錄/src/redis-trib.rb add-node 新節(jié)點ip:端口號 集群中任意節(jié)點ip:端口號
如果您需要添加新的Redis節(jié)點到集群中,請將"新節(jié)點ip"替換為要添加的Redis節(jié)點的IP地址,將"端口號"替換為對應(yīng)的端口號,并將"集群中任意節(jié)點ip"替換為已存在的集群中的任意一個節(jié)點的IP地址和端口號。
新加入slave節(jié)點
添加從節(jié)點到集群的操作可以按照以下步驟進行:
-
首先,通過運行命令
redis-cli
并使用cluster node
命令查看主節(jié)點的ID(用于替換"主節(jié)點的id")。 -
然后,退出redis-cli客戶端。
-
使用以下命令將從節(jié)點添加到集群:
/redis所在目錄/src/redis-trib.rb add-node --slave --master-id 主節(jié)點的id 新節(jié)點ip:端口號 集群中任意節(jié)點ip:端口號
在上述命令中,將"新節(jié)點ip"替換為要添加的從節(jié)點的IP地址,將"端口號"替換為對應(yīng)的端口號,將"主節(jié)點的id"替換為主節(jié)點的實際ID,將"集群中任意節(jié)點ip"替換為已存在的集群中的任意一個節(jié)點的IP地址和端口號。
[root@xxxx~]# /data/redis-x.x.x/src/redis-trib.rb add-node xx.xx.xx.xx:xxxx1 xx.xx.xx.xx:xxxx2
>>> Adding node xx.xx.xx.xx:xxxx1 to cluster xx.xx.xx.xx:xxxx2
>>> Performing Cluster Check (using node xx.xx.xx.xx:xxxx1)
M: c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c xx.xx.xx.xx:xxxx1slots:500-5460,15464-16383 (5881 slots) master2 additional replica(s)
S: 2f003cfd139ae4f2bbdac40b0055b46bdff96e0a xx.xx.xx.xx:xxxx2slots: (0 slots) slavereplicates c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c
M: 2da5edfcbb1abc2ed799789cb529309c70cb769e xx.xx.xx.xx:xxxx1slots:0-499,5461-15463 (10503 slots) master1 additional replica(s)
S: c0e1784f0359f986972c1f9a0d9788f3d69e6c99 xx.xx.xx.xx:xxxx2slots: (0 slots) slavereplicates 2da5edfcbb1abc2ed799789cb529309c70cb769e
S: 777c9eab94812d13d8b9dc768460dcf1316283f1 xx.xx.xx.xx:xxxx4slots: (0 slots) slavereplicates c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node xx.xx.xx.xx:xxxx1 to make it join the cluster.
[OK] New node added correctly.
為slave節(jié)點重新分配master
首先,登錄到需要設(shè)置為新的從節(jié)點的Redis實例上,可以使用以下命令:
/data/redis-xxxx/src/redis-cli -h xx.xx.xx.xx -p xxxx
然后,在Redis命令行界面上執(zhí)行以下命令:
cluster replicate 8c6534cbfbd2b5453ab4c90c7724a75d55011c27
上述命令中的"8c6534cbfbd2b5453ab4c90c7724a75d55011c27"是新的主節(jié)點的ID,將其替換為實際的ID。
執(zhí)行完以上命令后,繼續(xù)執(zhí)行以下命令:
cluster nodes
確認節(jié)點配置已更新,輸出結(jié)果應(yīng)包含類似如下內(nèi)容:
2f003cfd139ae4f2bbdac40b0055b46bdff96e0a xx.xx.xx.xx:xxxx myself,slave 8c6534cbfbd2b5453ab4c90c7724a75d55011c27 0 0 1 connected
分配哈希槽
reshard是redis cluster的核心功能,它通過遷移哈希槽來達到負載勻衡和可擴展目的。進入Redis所在目錄,并使用以下命令來執(zhí)行reshard操作:
/src/redis-trib.rb reshard 新節(jié)點ip:端口號
其中,"新節(jié)點ip:端口號"需要替換為實際的新節(jié)點的IP地址和端口號。執(zhí)行以上命令后,會詢問您要借用多少個哈希槽來分配給新的主節(jié)點。您可以根據(jù)需求輸入一個合適的數(shù)值,例如我們填入1000。
接下來,會要求您輸入新節(jié)點的ID(即新的主節(jié)點的ID),您需要輸入剛創(chuàng)建的節(jié)點的ID,即"ip:port"。
然后,會要求您輸入源節(jié)點。如果您想從所有節(jié)點中隨機選取一部分哈希槽分配給新節(jié)點,您可以輸入"all",否則可以輸入具體的源節(jié)點。
完成以上步驟后,Redis集群會開始移動哈希槽,并顯示相應(yīng)的狀態(tài)提示。
移動完成后,您可以進入Redis客戶端,并執(zhí)行以下命令:
cluster nodes
通過執(zhí)行以上命令,您可以查看集群節(jié)點的狀態(tài),確認新添加的節(jié)點已成功分配了哈希槽。
刪除從節(jié)點
刪除節(jié)點可以分為兩種情況:主節(jié)點和從節(jié)點。對于從節(jié)點,由于沒有分配哈希槽,因此刪除操作非常簡單,只需執(zhí)行以下命令:
/redis所在目錄/src/redis-trib.rb del-node 從節(jié)點ip:從節(jié)點端口號 從節(jié)點的id號
例如,刪除主節(jié)點IP為xxxxxxxx,端口號為6381,ID為d14e2f0538dc6925f04d1197b57f44ccdb7c683a的從節(jié)點,可以執(zhí)行以下命令:
[root@mysql-db01 src]# /data/redis-xxxx/src/redis-trib.rb del-node xxxxxx:6381 d14e2f0538dc6925f04d1197b57f44ccdb7c683a
執(zhí)行以上命令后,將從集群中移除節(jié)點,并發(fā)送CLUSTER FORGET消息到集群中的其他節(jié)點,最后關(guān)閉該節(jié)點。
同樣地,刪除主節(jié)點IP為xxxxxxx,端口號為6384,ID為e2cfd53b8083539d1a4546777d0a81b036ddd82a的從節(jié)點,可以執(zhí)行以下命令:
[root@mysql-db01 src]# /data/redis-xxxx/src/redis-trib.rb del-node xxxxxxx:6384 e2cfd53b8083539d1a4546777d0a81b036ddd82a
執(zhí)行以上命令后,同樣會將節(jié)點從集群中移除,并發(fā)送CLUSTER FORGET消息到集群中的其他節(jié)點,最后關(guān)閉該節(jié)點。
刪除主節(jié)點
在刪除主節(jié)點之前,需要進行一些數(shù)據(jù)遷移操作,并將該節(jié)點上的哈希槽分配給其他主節(jié)點。同時,在刪除主節(jié)點時,如果該主節(jié)點下還有從節(jié)點,需要將從節(jié)點分配給其他主節(jié)點或進行刪除操作。
如果主節(jié)點下有從節(jié)點,需要將從節(jié)點分配給其他主節(jié)點或刪除。
-
遷移主節(jié)點上的數(shù)據(jù):首先,連接到要刪除的主節(jié)點,可以使用以下命令連接到指定的主節(jié)點:
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-cli -h x.x.x.x -p xxxx
然后,執(zhí)行以下命令將主節(jié)點的數(shù)據(jù)遷移到其他主節(jié)點:
10.0.0.70:6383> cluster replicate f1f6e93e625e8e0cef0da1b3dfe0a1ea8191a1ad
這將把主節(jié)點的數(shù)據(jù)遷移到ID為f1f6e93e625e8e0cef0da1b3dfe0a1ea8191a1ad的主節(jié)點上。
-
處理主節(jié)點下的從節(jié)點:如果主節(jié)點下存在從節(jié)點,需要將這些從節(jié)點分配給其他主節(jié)點或進行刪除操作。
-
如果要分配給其他主節(jié)點,可以使用以下命令連接到主節(jié)點并執(zhí)行相應(yīng)的操作:
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-cli -h x.x.x.x -p xxxx x.x.x.x:xxxx> cluster nodes
然后根據(jù)需要,將從節(jié)點分配給其他主節(jié)點或刪除。
-
如果要刪除從節(jié)點,可以使用以下命令連接到其他主節(jié)點并執(zhí)行刪除操作:
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb del-node <主節(jié)點IP:端口號> <從節(jié)點ID>
使用上述命令將從節(jié)點分配給其他主節(jié)點或進行刪除操作。
-
-
遷移哈希槽(槽):使用以下命令進行遷移操作,將主節(jié)點上的哈希槽(槽)分配到其他主節(jié)點上,以保持集群的完整性:
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb reshard <待遷移哈希槽的主節(jié)點IP:端口號>
程序會提示您輸入遷移的哈希槽數(shù)量和接收哈希槽的主節(jié)點ID,按照提示進行操作即可。
-
刪除主節(jié)點:一旦完成數(shù)據(jù)遷移和哈希槽遷移操作,就可以刪除主節(jié)點了。使用以下命令連接到要刪除的主節(jié)點并執(zhí)行刪除操作:
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb del-node <待刪除主節(jié)點的IP:端口號> <待刪除主節(jié)點的ID>
執(zhí)行上述命令后,主節(jié)點將被成功刪除。
檢查集群所有節(jié)點是否正常
要檢查集群中任意節(jié)點的狀態(tài),可以使用以下命令:
/redis所在目錄/src/redis-trib.rb check 集群任意節(jié)點ip:節(jié)點端口號
例如,在節(jié)點IP為x.x.x.x,端口號為xxxx的節(jié)點上執(zhí)行集群檢查,可以執(zhí)行以下命令:
[root@mysql-db01 ~]# /data/redis-xxx.xxx.xxx.xxx/src/redis-trib.rb check x.x.x.x:xxxx
執(zhí)行以上命令后,會進行集群檢查并輸出集群狀態(tài)信息,包括主節(jié)點(帶有M標記)和從節(jié)點(帶有S標記)的具體信息,以及每個節(jié)點的哈希槽分配情況。
同時,還會對集群進行一些檢查,包括:
- 檢查所有節(jié)點是否對哈希槽配置達成一致;
- 檢查是否所有的16384個哈希槽都被分配到節(jié)點上。
在以上示例中,集群檢查結(jié)果顯示所有節(jié)點對于哈希槽的配置達成一致,且所有16384個哈希槽都被分配到了節(jié)點上。