1. 程式人生 > >CODIS2.x原理 之 資料遷移流程

CODIS2.x原理 之 資料遷移流程

作者:鄒祁峰
郵箱:[email protected]
部落格:http://blog.csdn.net/qifengzou
日期:2016.08.03 10:42:40
轉載請註明來自”祁峰”的CSDN部落格

CODIS有一個非常重要的特點就是:支援熱擴容。即:在不停止服務的情況下,實現叢集裝置的增減。其實現此功能的技術基礎就是“資料遷移功能”。資料遷移的主要目的是將屬於某codis-server組的slot的所有資料遷移到另外一個codis-server組中。

1 建立遷移任務

建立遷移任務有2中方式:一種是直接通過codis-config介面提交遷移任務;另一種是通過給codis-config傳送post請求的方式提交遷移任務。但是這兩種方式的處理流程是一致的。大體流程如下:
這裡寫圖片描述

流程說明:
1.遷移指令中指明瞭將編號(from~to)所有slot都遷移到指定codis-server分組。
2.遷移任務的最小單位是slot。因此,本流程將會建立(to - from + 1)個slot遷移任務放入zk任務佇列中。
3.注意:如果存在未完成的遷移任務時,則禁止提交新的遷移任務。

2 發起遷移指令

程式coddis-config dashboard會啟一個task協程專門用來從zk中獲取遷移任務,再將其轉換為遷移指令傳送給源codis-server程式。其大體流程如下:
這裡寫圖片描述

3.執行遷移操作

源codis-server收到來自codis-config dashboard的slot遷移指令後,則會該slot下的所有key遷移到目的codis-server服務。其大體流程如下:
這裡寫圖片描述

注意事項:
1.源codis-server收到slot遷移指令後,會與目的codis-server直接建立tcp連線。該tcp連線通道用於傳輸被遷移資料。
2.一旦某key遷移完成,則立即刪除。

4 發起強制遷移

正在執行某slot遷移的過程中,同時codis-proxy可能會收到操作屬於該slot下key的請求。如果直接去目的codis-server下操作,可能出現該key還未遷移完成,依然還在源codis-server; 如果直接去源codis-server下操作,可能出現該key已經遷移完成。為了防止此類情況的出現,只要該slot處於遷移狀態,則不管三七二十一,程式codis-proxy都會給源codis-server傳送”遷移該key”的遷移指令。其大體處理流程如下:
這裡寫圖片描述

5 自動負載均衡

由於配置失誤,或則後期增減容量導致各分組slot分配不均。一旦出現這種情況,有2種解決方案:1.使用人工提交遷移任務 2.使用自動負載均衡功能。第一種方案的處理已在上面的章節說明,在此無需贅述。第二種方案的大體處理流程如下:
這裡寫圖片描述

注意事項:
1.使用自動負載均衡需要滿足一個前提:所有codis-server的分組master必須配置maxmemory。
2.各組codis-server分配多少個slot是由其maxmemory決定。比如:A組maxmemory為10G, B組maxmory為1G,進行自動均衡處理後,A組分配的slot會是B組的10倍。
3.自動負載均衡並不會達到絕對意義上的均衡,其只做到maxmemory與分配的slot個數的比例均衡。無法達到操作次數的均衡。
4.自動負載均衡的處理過程中,如果發現存在maxmemory與分配的slot個數比例不均衡時,則會進行發起slot遷移的操作。達到均衡目的的前提下,此過程中會做到儘量減少slot的遷移。