Druid 官方网站上讲了相关的 Dump Segment http://druid.io/docs/latest/operations/dump-segment.html 和 Insert Segment http://druid.io/docs/latest/operations/insert-segment-to-db.html 相关的功能, 但是经过测试这些功能都不好用, 报 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 节点.
来源: http://www.bubuko.com/infodetail-2765065.html