时序数据库-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 写入数据
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停止
有一个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.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|
+----+------------+
我们会看到上面这种结果,从写入的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|
+-----------------------------------+------------+
时间戳是指格林威治时间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
因为我们要对用户写入的时间戳的解释前后一致,比如刚开始配置的是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。
数据文件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中有关时间精度和虚拟存储组数量的设置。
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
如果想改,正常情况我们推荐把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
(2)如果客户端是JDBC或者JAVA等原生API,可以通过下面方法设置:
JDBC: (IoTDBConnection) connection.setTimeZone("+08:00");
Session: session.setTimeZone("+08:00");
相应的查看的方法为:
JDBC: (IoTDBConnection) connection.getTimeZone();
Session: session.getTimeZone();
更多推荐
所有评论(0)