第六節:Redis Cluster搭建詳解和集群運維(節點、槽位等)


一. 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.
View Code

參考: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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM