Redis Cluster分片擴容

2022-08-20 07:03:11 字數 1451 閱讀 8568

redis分片

分片場景

在業務量相對較小的時候,可以將所有資料都存到一台機器上,只使用redis單機模式,不存在分片問題。如果業務的資料量超過一台物理機器的記憶體大小時,則會面對擴充套件問題,需要多台機器去存資料,此時,需要使用到redis的分片技術。

如何分片

redis通過分slot的方式進行分片。例如有a、b、c三颱機器組成的乙個集群。對於集群裡面的節點而言,三者會全部覆蓋16384個slots(2k位元組bit)。對於每乙個請求而言,會通過乙個hash演算法,得到乙個2k位元組(16384個slots)範圍內的乙個值,這個值則對應唯一乙個節點,這個節點處理該請求。

擴容場景

當資源不夠,需要增加節點時,需要對slots進行節點的重複分配。而此時,又不能停止對外服務,解決方案如何?

假設原來有三個節點:a(0至5000),b(5001至10000),c(10001到16383)。現在需要增加第四個節點d節點進來,重新分配如下:

需要將c節點的slots,從13000~16383的slot遷移到d節點中。redis通過提供一組命令原語完成遷移操作。

遷移邏輯

遷移工作,可以使用redis-trib管理軟體進行遷移,具體原理如下:

1、對目標節點,即是d節點傳送cluster setslot import 命令,讓目標節點做好準備接收遷移準備。

2、對源節點,即是c節點,傳送cluster setslot migrating命令,讓源節點做好準備遷移準備。

3、對源節點,傳送cluster getkeysinslot 命令,獲取對應slot的最多count個屬於slot的key名。

4、對於步驟3中獲取的key,向源節點傳送命令migrate 0 命令,將被選中的鍵原子地從源節點遷移到目標節點。

5、重複上述3,4步驟,直到所有key都遷移成功

遷移期間訪問問題

當在遷移過程中,如果被訪問的slot,可能會有部分key存在在源節點,有部分在目標節點中。

1、當客戶端傳送請求到源節點的時候,源節點會檢視對應的key是否還在本節點,如果存在,則直接執行命令返回給客戶。如果不存在,則會給客戶端返回乙個ask錯誤,指引客戶端往正在匯入的目標slot去請求對應的key。客戶端可以通過返回的ask錯誤中的目標節點進行對應key的請求。

2、當客戶端傳送請求到目標節點時。

1)如果客戶端請求時,帶上asking標識,由目標節點會執行對應key的查詢。正常情況下,如果是通過查詢源slot,獲取ask錯誤之後,再到目標節點進行查詢的時候,需要帶上asking標識。

2)如果客戶端請求時,未帶上asking標識,原由上,對應的slot還屬於源節點,則目標節點會拒絕執行key查詢,會返回乙個moved錯誤給客戶端,告訴客戶端對應的key的slot屬於源節點。正常情況下,如果第一次請求key到了正在遷移的目標節點,則會收到moved錯誤。

CygWin安裝RedisCluster指南

安裝前確認磁碟有6g以上的磁碟容量,安裝時雙擊setup x86 64.exe,基本按照預設設定安裝就行,也可自己指定安裝路徑等,3 deps hiredis net.c中注釋掉 並在 include sds.h 之後追加 ifdef cygwin define tcp keepcnt 8 defi...

RedisCluster搭建步驟

安裝redis 配置並啟動redis節點 選兩台機器執行該步驟 把redis安裝目錄redis.conf修改如下並複製進對應的700 資料夾 bind 10.11.147.40 redis安裝機器ip 注意這裡千萬不要用127.0.0.1或者注釋掉這行,以上兩種都會導致遠端機器連線不到redis p...

redisCluster環境準備

需要 redis3.0以上的版本 我使用了redis3.2.12 之後需要ruby環境 yum install ruby yum install rubygems 安裝redis trib.rb執行依賴的ruby的包redis 3.2.2.gem 位址為 gem install redis 3.2....