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 节点。