一. Cluster搭建
1. 事先准備
(1). 服務器環境:Centos8
(2). Redis環境:安裝redis5.0版本
PS: 在redis 5.0之前,redis cluster的搭建需要借助Ruby環境,使用redis-trib指令進行集群的管理,redis5.0以后,redis已經內置了集群管理,使用redis-cli客戶端指令就可以進行集群的搭建和管理了。
(3). 准備好6個配置文件,對應端口分別為6379、6380、6381、6382、6383、6384,為了方便啟動管理,我們根據端口號建立6個不同的文件夾,同時把redis-server服務端程序也分別copy到對應的文件夾下,方便啟動。
PS:我們可以在window下進行這一步,然后再copy到Linux系統,另外redis cluster對應的配置修改如下:
# 一. 允許遠程訪問
#1. 注釋掉下面代碼,或者改為 bind 0.0.0.0
#bind 127.0.0.1
#2. 關閉保護模式
protected-mode no
#二. 通用配置
#1. 開啟守護進程
daemonize yes
#2. 配置密碼(必須設置相同的密碼,不設masterauth的話宕機了不能自動恢復)
requirepass 123456
#集群節點間的訪問密碼
masterauth 123456
#三.集群配置
port 6384 #配置端口
cluster-enabled yes #開啟集群
cluster-config-file nodes-6384.conf #集群節點配置文件
pidfile /var/run/redis_6384.pid
cluster-node-timeout 5000 #集群節點超時時間,超過這個時間,集群認為該節點故障,如果是主節點,會進行相應的主從切換
如圖:
2. 搭建步驟
(1). 將准備好的6個節點文件夾都copy到Centos下的redis-cluster文件夾內,執行下面的啟動指令。
PS:由於是從windows中copy進來的,所以第一次啟動需要授權一下,后續再啟動則不需要。
啟動指令(第一次需要授權一下)
cd /root/redis-cluster/6379 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6380 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6381 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6382 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6383 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6384 &&chmod 777 redis-server&& ./redis-server redis.conf
后續啟動指令(不需要授權)
cd /root/redis-cluster/6379 && ./redis-server redis.conf && cd /root/redis-cluster/6380 && ./redis-server redis.conf && cd /root/redis-cluster/6381 && ./redis-server redis.conf && cd /root/redis-cluster/6382 && ./redis-server redis.conf && cd /root/redis-cluster/6383 && ./redis-server redis.conf && cd /root/redis-cluster/6384 && ./redis-server redis.conf
通過配置集群后,啟動的redis實例后面有(cluster),如下圖:
(2). 回到redis安裝目錄下,執行集群構建指令(如果沒有密碼,則不需要 -a 123456,cluster最低要求3個主節點)
./redis-cli -a 123456 --cluster create 192.168.137.202:6379 192.168.137.202:6380 192.168.137.202:6381 192.168.137.202:6382 192.168.137.202:6383 192.168.137.202:6384 --cluster-replicas 1
輸入yes,確定集群關系的建立。
如下圖:
(3). 連接到集群上(任何一個節點即可),進行集群信息的查看
./redis-cli -c -h 192.168.137.202 -p 6380 -a 123456
如下圖,連接成功:
查看節點信息:cluster nodes
查看集群信息:cluster info
特別注意:
這里是在一台服務器部署的,所以各個redis實例之間是可以相互通信的,如果是多服務部署cluster,除了保證redis基礎端口開發,還要保證cluster的通信端口開放,即 通信端口=基礎端口號 + 10000 。
(通信流程詳見:https://www.cnblogs.com/yaopengfei/p/13884649.html)
3.上述指令總結
(1). 構建集群
# 無密碼 (--cluster-replicas 1 表示1個master對應1個從,如果是2,則表示1個master對應2個slave) ./redis-cli --cluster create 192.168.137.201:6379 192.168.137.201:6380 192.168.137.201:6381 192.168.137.201:6382 192.168.137.201:6383 192.168.137.201:6384 --cluster-replicas 1 #有密碼 ./redis-cli -a 123456 --cluster create 192.168.137.201:6379 192.168.137.201:6380 192.168.137.201:6381 192.168.137.201:6382 192.168.137.201:6383 192.168.137.201:6384 --cluster-replicas 1
(2). 連接與退出
#連接(cluster連接必須加 -c) ./redis-cli -c -h 192.168.137.201 -p 6380 -a 123456 #退出 exit
(3). 查看節點
cluster nodes
(4). 查看集群信息
cluster info
(5). 查看槽位信息
cluster slots
(6).查看某個節點信息
./redis-cli -h 192.168.137.201 -c -p 6384 info replication
(7). 計算某個key的槽位
cluster keyslot xxx
(8). 查看redis進程
ps -ef|grep redis
(9). 關閉redis
#關閉redis ./redis-cli shutdown #直接殺死 kill -p pid
4. 測試
(1). 掛掉1個主節點,看從節點是否會變為主節點頂替上去? 然后再把重啟剛才的掛掉的節點,看集群情況?
6384 節點是 6381的從節點,掛掉6381節點,發現6384變為了主節點。
重新啟動6381,發現6381變成了6384的從節點了。
二. 集群運維(節點、槽位)
通過./redis-cli --cluster help 查看命令幫助大全。

redis-cli --cluster help Cluster Manager Commands: create host1:port1 ... hostN:portN #創建集群 --cluster-replicas <arg> #從節點個數 check host:port #檢查集群 --cluster-search-multiple-owners #檢查是否有槽同時被分配給了多個節點 info host:port #查看集群狀態 fix host:port #修復集群 --cluster-search-multiple-owners #修復槽的重復分配問題 reshard host:port #指定集群的任意一節點進行遷移slot,重新分slots --cluster-from <arg> #需要從哪些源節點上遷移slot,可從多個源節點完成遷移,以逗號隔開,傳遞的是節點的node id,還可以直接傳遞--from all,這樣源節點就是集群的所有節點,不傳遞該參數的話,則會在遷移過程中提示用戶輸入 --cluster-to <arg> #slot需要遷移的目的節點的node id,目的節點只能填寫一個,不傳遞該參數的話,則會在遷移過程中提示用戶輸入 --cluster-slots <arg> #需要遷移的slot數量,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。 --cluster-yes #指定遷移時的確認輸入 --cluster-timeout <arg> #設置migrate命令的超時時間 --cluster-pipeline <arg> #定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值為10 --cluster-replace #是否直接replace到目標節點 rebalance host:port #指定集群的任意一節點進行平衡集群節點slot數量 --cluster-weight <node1=w1...nodeN=wN> #指定集群節點的權重 --cluster-use-empty-masters #設置可以讓沒有分配slot的主節點參與,默認不允許 --cluster-timeout <arg> #設置migrate命令的超時時間 --cluster-simulate #模擬rebalance操作,不會真正執行遷移操作 --cluster-pipeline <arg> #定義cluster getkeysinslot命令一次取出的key數量,默認值為10 --cluster-threshold <arg> #遷移的slot閾值超過threshold,執行rebalance操作 --cluster-replace #是否直接replace到目標節點 add-node new_host:new_port existing_host:existing_port #添加節點,把新節點加入到指定的集群,默認添加主節點 --cluster-slave #新節點作為從節點,默認隨機一個主節點 --cluster-master-id <arg> #給新節點指定主節點 del-node host:port node_id #刪除給定的一個節點,成功后關閉該節點服務 call host:port command arg arg .. arg #在集群的所有節點執行相關命令 set-timeout host:port milliseconds #設置cluster-node-timeout import host:port #將外部redis數據導入集群 --cluster-from <arg> #將指定實例的數據導入到集群 --cluster-copy #migrate時指定copy --cluster-replace #migrate時指定replace help For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
參考:https://www.cnblogs.com/zhoujinyi/p/11606935.html
幾個關鍵點:
當被刪除掉的節點重新起來之后不能自動加入集群,但其和主的復制還是正常的,也可以通過該節點看到集群信息(通過其他正常節點已經看不到該被del-node節點的信息)。
如果想要再次加入集群,則需要先在該節點執行cluster reset,再用add-node進行添加,進行增量同步復制。
1. 目標
(1). 向已有的redis cluster中添加兩個新節點 6385 和 6386,其中6385為主節點,並給6385分配1000個槽位(這1000個槽位隨機從其他主節點中抽取),然后將6386為6385的從節點。
(2). 刪除6386這個從節點,然后刪除6385這個主節點(刪除主節點前,先把主節點上的槽位還給6379節點)。
2. 事先准備
(1). 將redis cluster環境搭建好,3主3從,端口依次為:6379-6384,主從關系如下圖:
(2). 准備好6385 和 6386 的服務和配置文件,然后copy到對應目錄下。(配置文件詳見上面搭建過程的配置的修改)
3. 步驟
(1). 啟動6385 和 6386這兩個服務
(第一次需要授權一下).
cd /root/redis-cluster/6385 &&chmod 777 redis-server&& ./redis-server redis.conf
cd /root/redis-cluster/6386 &&chmod 777 redis-server&& ./redis-server redis.conf
(2). 配置6385為主節點
使用add-node命令新增一個主節點6385(master),前面的ip:port為新增節點,后面的ip:port為已知存在節點,看到日志最后有"[OK] New node added correctly"提示代表新節點加入成功 。(下面指令要手敲,復制進去可能不識別)
cd /root/redis
./redis-cli -a 123456 --cluster add-node 192.168.137.202:6385 192.168.137.202:6379
查看集群狀態:6385已經添加進去了,但是並沒有分配槽位。
注:新加進去的節點默認都為master主節點。
(3). 為6385分配1000個槽位
A. 找到集群任何一個主節點(這里用6380吧),然后對其進行分片操作。
./redis-cli -a 123456 --cluster reshard 192.168.137.202:6380
B. 進入提示流程:
How many slots do you want to move (from 1 to 16384)? (移動多少個槽位)
輸入:1000
What is the receiving node ID? (輸入接收槽位的節點ID)
輸入6385對應的ID:d282c41660c14959195bb0a4c4c8a61a0d6be0fc
Source node #1:
輸入:all (代表從所有主節點中隨機獲取1000個槽位,這里也可以輸入某個主節點的id,則表示從該主節點拿1000個槽位進行分配,如果輸入某個主節點id,下面還會有一步驟,輸入目標節點的id,選擇all,則沒有)
Do you want to proceed with the proposed reshard plan (yes/no)? (是否開始執行遷移)
輸入:yes
C. 查看集群狀態:6385節點被隨機分配了1000個槽位。
(4). 配置6386為6385的從節點
A. 先將6386節點添加進去
./redis-cli -a 123456 --cluster add-node 192.168.137.202:6386 192.168.137.202:6379
查看集群狀態:,默認是加進去都是稱為matser節點
B. 先連接到6386這個節點上,然后運行指令讓其稱為6385的從節點 (下面replicate后面的是6385的節點ID)
./redis-cli -c -h 192.168.137.202 -p 6386 -a 123456
cluster replicate d282c41660c14959195bb0a4c4c8a61a0d6be0fc
查看集群狀態:6386已經成為6385的從節點了
(5). 刪除6386這個從節點
運行下面指令(redis.cli 在redis安裝目錄下的),指定刪除的ip加端口,6386節點的id
./redis-cli -a 123456 --cluster del-node 192.168.137.202:6386 84686cb24cfe4ae37e13bcb7013d24e9f81a83cb
查看節點狀態:6386節點已經被移除
注意:從節點不涉及槽位的問題,可以直接被刪除。
(6). 刪除6385這個主節點
注:主節點上有槽位,刪除前必須先把槽位遷移,這里我們把6385上的1000個槽位統一移到6379節點上(這里只能全部移動到一個固定節點上)。
A. 運行下面指令 (這里可以隨意一個端口)
./redis-cli -a 123456 --cluster reshard 192.168.137.202:6385
B. 進入提示流程:
How many slots do you want to move (from 1 to 16384)? (移動多少個槽位)
輸入:1000
What is the receiving node ID? (輸入接收槽位的節點ID 這里輸入6379)
輸入6379對應的ID:xxxx
Source node #1: (表示從哪個節點遷移,這里輸入6385節點的id)
輸入:d282c41660c14959195bb0a4c4c8a61a0d6be0fc
Source node 2: (輸入done,開始生成遷移計划)
輸入:done
Do you want to proceed with the proposed reshard plan (yes/no)? (是否開始執行遷移)
輸入:yes
C. 查看節點情況:6385節點已經沒有槽位了
D. 刪除6385節點
運行下面指令(redis.cli 在redis安裝目錄下的),指定刪除的ip加端口,6385節點的id
./redis-cli -a 123456 --cluster del-node 192.168.137.202:6385 d282c41660c14959195bb0a4c4c8a61a0d6be0fc
E. 查看集群情況,6385節點已經被移除了
!
- 作 者 : Yaopengfei(姚鵬飛)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
- 聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。