Druid數據遷移小計
Druid 官方網站上講了相關的 Dump Segment 和 Insert Segment 相關的功能,但是經過測試這些功能都不好用,報 Guice 的依賴錯誤,懶得找具體原因了,換一種方式: 冷遷移。
Druid 的數據存儲
既然要冷遷移就需要了解一下 Druid 的存儲相關的知識了。Druid 的數據存儲主要是以 segment
為單位進行的,Druid 不僅要把 segment
保存到文件目錄下,還需要在 metadata
里面把該 segment
相關的信息記錄下來好進行管理。
# get druid deep storage directory
cat $DRUID_HOME/conf/druid/_common/common.runtime.properties | grep druid.storage
# ger druid metadata storage
cat $DRUID_HOME/conf/druid/_common/common.runtime.properties | grep metadata.storage
根據上面配置文件我們就可以分別拿到 segment
的路徑和 metadata
中的 segment
配置。
Deep Storage
Druid 的 Deep Storage 目錄組織得還是非常清晰的:{dataSourceName}/{timeRangeStart}_{timeRangeEnd}/{time}
所以我們的數據遷移可以只遷移指定時間范圍內的。既然連目錄都知道了,那就很簡單了,把想要遷移的數據按目錄復制出來就行了。
metadata
Druid 不管是用什么數據庫做元數據存儲表肯定都一樣,記錄 segment
位置的就是 druid_segments
表了。
字段 | 解釋 |
---|---|
dataSource | 數據集名稱 |
created_date | 創建日期 |
start | 開始日期 |
end | 結束日期 |
payload | 配置信息(此列為二進制存儲,內容為一個 JSON需要進行轉換后才能看到) |
注意事項: payload 中的配置息寫死了 segment 的位置,如果你遷移數據后不能在新服務器中的數據目錄與原服務器一致則需要修改這個 payload 內容,下方代碼即為數據轉換代碼可以把數據解析並修改后再通過下方在代碼生成回 HEX String 並更新到數據庫表中。
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import java.util.Scanner;
/**
* @author sunzq
*/
public class HexConvert {
public static void main(String[] args) throws DecoderException {
Scanner scanner = new Scanner(System.in);
while (true) {
String s = scanner.nextLine();
if (s.equals("q")) {
return;
}
// maven dependency: commons-codec
if (s.startsWith("{")) {
System.out.println(Hex.encodeHexString(s.getBytes()));
} else {
System.out.println(new String(Hex.decodeHex(s)));
}
}
}
}
遷移到新服務器
拿到導出的 segment
文件放到新服務器的指定位置,再去數據庫里面插入此 segment
對應的記錄就完成了數據的遷移,還是很簡單的。
驗證
用瀏覽器訪問 coornidator 節點的 API http://ip:port/druid/v2/datasources
看看 datasource
添加了沒有,如果沒有更新上可以試試重啟 coordinator 節點和 historical 節點。