我們可以參考redis-trip或者cachecloud的**來了解cluster資料遷移的流程,主要分為如下幾部:
設定遷移中的節點狀態,比如要把slot x的資料從節點a遷移到節點b的話,需要把a設定成migrating狀態,b設定成importing狀態。
1
cluster setslot importing
1
cluster setslot migrating
遷移資料,這一步首先使用cluster getkeysinslot 命令獲取該slot中所有的key, 然後每個key依次用migrate命令轉移資料。
資料轉移完畢之後,正式將slot指派給新的節點b
1
cluster setslot node
在整個遷移中,會出現對於單個key的阻塞情況,原因是migrate命令是原子性的,在單個key的遷移過程中,對這個key的訪問會被阻塞。但是,一般來說,乙個key的資料不會特別大,所以絕大多數情況下瞬間都能完成,所以一般不會真正影響使用。而其他任何情況都不會造成集群的不可用,如果出現了,比如出現slot級的不可用,說明client端的處理存在某些問題。接下來,本文也會介紹一些client端使用的注意事項。
前邊說了,redis cluster的資料遷移基本不會影響集群使用,但是,在資料從節點a遷移到b的過程中,資料可能在a上,也可能在b上,redis是怎麼知道要到哪個節點上去找的呢?這裡就要先介紹一下ask和moved這兩個轉向訊號了。顧名思義,出現這個資訊就說明需要的資料並不在當前節點上,需要做一次轉向處理,其中,moved是永久轉向訊號,ask則表示只需要這一次操作做轉向。
比如,在節點a向節點b的資料遷移過程中,各個key分散在節點a和節點b中,所以當客戶端在a中沒找到某個key時,就會得到乙個ask,然後再去b中查詢,實際上就是多查一次。
需要注意的是,客戶端查詢b時,需要先發一條asking命令,否則這個針對帶有importing狀態的槽的命令請求將被節點b拒絕執行。
對於客戶端,簡單來說就是,收到moved時,需要更新slot對映資訊,收到ask時,則需要向新節點發asking命令並重新執行操作。
看了一下jedis**,也正是按照這個邏輯實現的。
1234567
891011
1213
1415
1617
1819
2021
22
} catch (jedisredirectionexception jre)// release current connection before recursion or renewing
releaseconnection(connection);
connection = null;
if (jre instanceof jedisaskdataexception) else if (jre instanceof jedismoveddataexception) else
return runwithretries(slot, attempts - 1, false, asking);
} finally {
操作出現異常時,會分別判斷movedexception和askexception,然後作相應處理。
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....