• 时序数据库-5-[IoTDB]的数据迁移


    参考IoTDB部署运维
    使用tar压缩文件夹 tar -zcvf test.tar.gz ./test/ 该命令表示压缩当前文件夹下的文件夹test,压缩后缀名为test.tar.gz。

    tar -zxvf test.tar.gz解压到当前目录

    1 单机安装iotdb

    1.1 时间戳同步

    (1)把当前时区调整为上海+8区
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    (2)安装ntpdate
    yum install -y ntpdate
    (3)使用ntpdate同步标准时间(或者同步其他的时间服务器
    ntpdate us.pool.ntp.org
    (4)查看时间date
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2 写入数据

    nohup start-server.sh >/dev/null 2>&1 &启动
    nohup start-server.sh >/tmp/iotdb.log 2>&1 &启动
    start-cli.sh -h 127.0.0.1 -p 6667 -u root -pw root登陆客户端
    stop-server.sh停止
    
    • 1
    • 2
    • 3
    • 4

    有一个timestamp_precision的配置项文件名在IoTDB的配置文件iotdb-engine.properties里,默认是ms。

    (1)创建存储组
    set storage group to root.sg
    (2)查看存储组
    show storage group
    (3)创建时间序列
    create timeseries root.sg.d.s1 with datatype=float,encoding=rle
    (4)查看时间序列
    show timeseries
    (5)向单个时间序列中插入数据
    insert into root.sg.d(timestamp,s1) values(1,510);
    insert into root.sg.d(timestamp,s1) values(2,520);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.3 时间精度

    启动CLI的时候加了一个参数 -disableISO8601,这是干啥的?这个参数的功能是 关闭ISO 8601格式打印,ISO 8601是一种日期和时间的表示方法。
    比如北京时间2021年5月21日下午2点22分22秒,ISO 8601 格式就是 :
    2021-05-21T14:22:22+08:00。

    start-cli.sh -disableISO8601登陆客户端
    IoTDB> select s1 from root.sg.d;
    +----+------------+
    |Time|root.sg.d.s1|
    +----+------------+
    |   1|       510.0|
    |   2|       520.0|
    +----+------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们会看到上面这种结果,从写入的SQL,到查询出的结果的Time列展示,都跟时间精度没关系,时间戳都只是一个整数。

    我们把这个 1、2 当做ms也可以,当做us、ns都可以。这就是最原始的样子,没有时间精度,时间戳就是一个long类型的数据,数据库接收到这个long,就存储这个long,并且查询的时候把这个long返回给客户端。

    所以,如果用long类型的时间戳跟数据库交互(凡是给数据库传输的时间戳都是long),数据库也会返回 long,完全不用管这个参数,只需要在客户端这边把这个long表达的意思理清楚就行。

    start-cli.sh登陆客户端
    IoTDB> select s1 from root.sg.d;
    +-----------------------------------+------------+
    |                               Time|root.sg.d.s1|
    +-----------------------------------+------------+
    |1970-01-01T08:00:00.000000001+08:00|       510.0|
    |1970-01-01T08:00:00.000000002+08:00|       520.0|
    +-----------------------------------+------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    时间戳是指格林威治时间1970年01月01日00时00分00秒到当前经过的时间。因此1970年01月01日00时00分00秒就是时间戳0。更具体一点,0时间戳也是1970年01月01日00时00分00秒000毫秒000微秒000纳秒。

    时间戳0没什么歧义,那1呢?是1970年01月01日00时00分01秒?还是00秒001毫秒?还是00秒000毫秒001微秒?亦或是00秒000毫秒000微秒001纳秒?

    也就是这个1个时间单位,到底代表多长的时间,这就是时间精度要管的。

    如果配置里的timestamp_precision =ms,
    那么1就表示1970年01月01日00时00分00秒001毫秒。
    1970-01-01T08:00:00.001+08:00
    
    如果我们配置的是纳秒,那么写入的1打印出来的就是:
    1970-01-01T08:00:00.000000001+08:00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    因为我们要对用户写入的时间戳的解释前后一致,比如刚开始配置的是ms,那么1就是ms,这时候改成ns,由于我们没有为每一个时间戳存储精度信息,这时候就会出现原本的1变成了ns。修改前后打印出来的日期就不一致了。

    为了避免这种情况,我们做了个启动检查,把timestamp_precision当做一个启动之后不能修改的配置项。

    如果想改,正常情况我们推荐把data/system目录都清空,重新来过。

    如果就想把老数据的时间格式改了,可以修改iotdb-engine.properties配置文件的同时,把data/system/schema/system.properties 里的timestamp_precision也一起改了。

    2 目录结构

    使用默认配置启动并且写数据之后,项目根目录会生成下面这些文件夹,都在data目录下:其中主要包括3部分,数据文件data/data,系统文件data/system,写前日志data/wal。
    在这里插入图片描述

    2.1 数据目录:data/data

    目录组织方式为:

    顺序/乱序数据 -> 
    存储组 -> 
    分区号(目前默认一个分区) -> 
    数据文件.tsfile及索引文件.resource。
    
    • 1
    • 2
    • 3
    • 4

    数据文件TsFile(Timeseries File)是我们设计的列存文件格式,主要存储各个时间序列原始数据,TsFile有单独的API,可以当做一个独立的工具使用,就像 Parquet、ORC 一样。 数据文件可以配置多目录,通过data_dirs参数配置。

    2.2 系统目录:data/system

    里面有几个重要的文件。
    (1)mlog.txt:元数据日志,采用追加的方式,记录了所有的元数据操作,包括增删存储组、增删时间序列等。重启的时候会重做这个文件里的日志,遇到错误的会跳过。
    (2)system.properties:系统属性,记录了一些启动后不可更改的参数,如分区粒度、时间精度等。
    (3)tlog.txt:标签和属性信息,如果没创建,这个文件就是空的。

    2.3 写前日志目录:data/wal

    写入的数据会先记录写前日志,然后写到内存里。当内存里的数据刷盘之后,写前日志才会被清理。当你发现写了一些数据之后,数据目录还是空的,这时候数据就在写前日志和内存里。

    写前日志是按照存储组组织的,一个写前日志文件对应一个TsFile文件。

    如果想强制将内存的数据刷盘,可以通过CLI执行flush命令。会持久化内存数据,并且清除写前日志。

    2.4 系统日志:data/logs

    除了上边那三个最重要的,还有系统日志,日志文件按照日期归档,没有日期的就是今天的。
    在这里插入图片描述

    3 数据迁移

    (1)迁移之前,最好用CLI控制台执行一次flush命令,持久化内存数据(这样就没有写前日志了)。重启一次IoTDB也是类似的效果。
    (2)迁移的IoTDB版本要相同。

    介绍几个场景:

    3.1 场景一

    把A 机器上的IoTDB整体迁移到B机器上(调试、数据备份等)。

    可以把整个data目录(包括数据目录data/data、系统目录data/system)都拷过去,在B机器配置好根目录,启动B机器的IoTDB即可。

    注意客户端的时区。
    注意配置文件iotdb-engine.properties中有关时间精度和虚拟存储组数量的设置。
    
    • 1
    • 2

    3.2 场景二

    把A机器上的IoTDB的部分存储组的数据迁移到B机器上。

    想迁移数据,元数据一定要迁移。首先把 A 机器的 data/system 目录拷贝到 B 机器上,接下来把 A 机器数据目录里的部分存储组目录拷贝到 B 机器,在 B 机器配置好对应的目录。启动 B 机器的 IoTDB 即可。

    3.3 场景三

    把A机器上的IoTDB的元数据迁移到B机器上,但是不要数据。
    把 A 机器的 data/system 目录拷贝到 B 机器的相应位置,启动 B 机器的 IoTDB 即可。

    4 报错及解决

    4.1 时间精度问题

    报错信息。
    org.apache.iotdb.db.exception.ConfigurationException: Parameter timestamp_precision can not be ms, please set to: ns。
    解决方案:修改配置文件conf/totdb-engine.properties。

    timestamp_precision
    
    • 1

    如果想改,正常情况我们推荐把data/system目录都清空,重新来过。

    如果就想把老数据的时间格式改了,可以修改iotdb-engine.properties配置文件的同时,把data/system/schema/system.properties 里的timestamp_precision也一起改了。

    4.2 IoTDB时区问题

    在尝试修改时区设置时发现 IoTDB 的 config 文件里居然没有发现时区的相关设置。后来才了解到,IoTDB服务器其实只针对long时间戳进行存储。时区只用来跟客户端进行交互。

    如果我的客户端默认的系统时区不正确,如何才能正确的写入和查询数据呢?
    (1)如果客户端是CLI命令行,可以通过SQL手动设置时区

    IoTDB> show time_zone
    Current time zone: America/New_York
    IoTDB> set time_zone=+08:00
    Time zone has set to +08:00
    IoTDB> show time_zone
    Current time zone: +08:00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2)如果客户端是JDBC或者JAVA等原生API,可以通过下面方法设置

    JDBC: (IoTDBConnection) connection.setTimeZone("+08:00");
    Session: session.setTimeZone("+08:00");
    相应的查看的方法为:
    JDBC: (IoTDBConnection) connection.getTimeZone();
    Session: session.getTimeZone();
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    微信小程序和H5之间互相跳转、互相传值
    ubuntu18.04中导出requirements.txt、
    【计算机操作系统慕课版】第二章课后习题笔记(创作周年纪念版)
    三元组顺序表表示的稀疏矩阵转置Ⅱ
    Java日志系列——logback,log4j2使用
    全国快递查询接口,快递,全球快递,配送,物流管理,物流数据,电子商务
    RabbitMQ消息可靠性保证机制--发送端确认
    Day08--初步创建并使用自定义组件
    最近发现齐博x1火车头发布信息异常
    JavaScript中常用字符串方法总结
  • 原文地址:https://blog.csdn.net/qq_20466211/article/details/127734223