InfluxDB:仅将多个数据库中的一个从一个服务器实例移动到另一个
InfluxDB: Move only one database of many from one server instance to another
我有一个包含多个数据库的 InfluxDB 服务器实例,例如 sensors
、network
、telegraf
等等。
这些数据库总共占用几十 GB,我只想将 sensors
数据库卸载到另一台更强大的机器上。
最简单的情况是我在另一台机器上创建一个新的 InfluxDB 服务器实例,然后将 influxdb/data/sensors
文件夹移动 (rsync) 到另一台机器,然后将其从原来的机器上删除。
虽然我还没有测试过,但我认为这不会那么容易工作;有一个 data/_internal
目录,然后是 meta/meta.db
文件以及 wal/*
目录,这可能需要保留所有内容 "as-is" 以便服务器实例能够启动无错误。
因为我说的是每个数据库几十 GB,理想情况下我只想安装一个新的 ssd,复制 files/directories,然后在另一台机器上安装这个新的 ssd 并使用它直接作为新的数据源,无需进一步复制。
我基本上希望我能以一种像将 rrd-tool 的 rrd
文件从一台机器移动到另一台机器一样简单的方式来做到这一点。
这可能吗?如果没有,我有什么选择?
我可能会按照你在问题中提到的那样尝试将 influxdb/data/sensors
目录复制到新机器上。
_internal
数据库维护 运行 时间统计。因此,如果您不查看该数据库,则可以忽略它。
我不知道它在哪里使用它的元数据,所以要小心。
wal/*
- 目录只是预写日志以避免数据丢失。我假设您为此 activity 有一些停机时间。如果您可以在执行此复制之前在传感器数据库中找到最新数据,则 wal 不会丢失数据。
不确定从 运行ning influxdb 实例 rsync influxdb/data/sensors
目录文件是否安全。至少你应该使用 rsync 和 运行ning influxd 复制文件,然后停止 influxd 服务并重复 rsync 以获取最近更新的文件。
如果不将“influxdb/meta/meta.db”复制到新服务器,您的新实例将不知道现有的旧数据库和度量。
据我所知,InfluxData 没有正式记录或推荐手动文件复制的过程。
可能使用官方的influxd backup
/ influxd restore
命令是一种更安全的方法。 1-2 年前,当我尝试使用它们时,它们是有问题的,但现在可能会起作用。您可以 运行 从远程旧实例备份到新服务器并在本地恢复备份。
编辑 2022:这是适用于 InfluxDB 1.x 的解决方案,此处显示的命令可能无法直接适用于 2.x。这是 2.x backup/restore 文档的 link:https://docs.influxdata.com/influxdb/v2.2/backup-restore/
The InfluxDB 2.2 influx backup command is not compatible with versions of InfluxDB prior to 2.0.0.
正如 Yuri Lachin 指出的那样,我使用了 influxd backup
/ influxd restore
。
虽然它确实有缺点,需要先将数据保存在光盘上,然后再从那里读取,但这似乎是最灵活的方法。
Rsyncing 50GB 确实需要一定的量,而且这段时间数据库需要离线,这不是backup / restore
的要求;所以没有数据丢失。它还允许将过去位于单个 InfluxDB 实例上的数据迁移到不同的 InfluxDB 服务器,而无需考虑元数据库的问题。
backup / restore
可以分步进行,第一步是先备份数据库的所有数据,恢复到新的服务器实例中,然后再导出最新的数据,但是没有'不要将其放入第一个备份中,将其再次还原到新数据库中。
第 1 步:
在包含新的空 InfluxDB 服务器实例的机器上,从远程旧 InfluxDB 实例备份数据:
influxd backup \
-portable \
-host 192.168.11.10:8088 \
-database sensors \
/var/lib/influxdb/export-sensors-01
之后将此数据导入新的服务器实例:
influxd restore \
-portable \
/var/lib/influxdb/export-sensors-01
第 2 步:
现在花点时间调整InfluxDB客户端当前连接的IP-address或域名,使其指向新的InfluxDB服务器;如有必要,请重新启动客户端。
第 3 步:
在 backup
完成并且您使用新 IP-address 重新启动客户端期间,新数据仍在写入旧数据库,因此我们需要同步该数据。
同样,在新服务器上,从旧服务器上提取备份,但指定丢失数据的时间范围和不同的目标目录:
influxd backup \
-portable \
-host 192.168.11.10:8088 \
-database sensors \
-start 2019-06-22T19:30:00Z \
-end 2019-06-24T00:00:00Z \
/var/lib/influxdb/export-sensors-02
显然指定 -end
也很重要,我做的一个没有 -end
参数的测试开始再次备份整个数据库。我刚刚 ctrl-d 退出并删除了 /var/lib/influxdb/export-sensors-02
并使用 -end
参数集再次启动它。
-start
参数可以包含几分钟的已恢复数据,因为在恢复第二次备份期间,这些重复的条目将被忽略或覆盖已经存在的相同值。
例如,如果您在下午 4 点开始主备份并在下午 6 点完成,则第二个备份可以包含 5:55pm 的 -start
参数和一对 -end
参数未来几天,这没问题,因为只要你切换客户端的 IP-addresses,就不会再有未来的数据写入旧数据库。可能 -since
参数会更好,但我在时间范围上做了一些试验,所以我把它留在使用 -start
+-end
.
为了将刚刚备份的丢失数据插入 /var/lib/influxdb/export-sensors-02
,您需要做更多的工作,因为 您不能 restore
现有数据库。如果您尝试这样做,不会损坏任何东西,只会显示一条警告消息,并且 restore
会中止。
所以我们需要将数据恢复到一个新的临时数据库中:
influxd restore \
-portable \
-database sensors \
-newdb sensors_tmp_backup \
/var/lib/influxdb/export-sensors-02
然后将数据复制到sensors
数据库中:
influx \
-database=sensors_tmp_backup \
-execute 'SELECT * INTO sensors..:MEASUREMENT FROM /.*/ GROUP BY *'
并删除临时数据库:
influx \
-database=sensors_tmp_backup \
-execute 'DROP DATABASE sensors_tmp_backup'
如果一切正常,删除备份目录
rm -rf /var/lib/influxdb/export-sensors-01
rm -rf /var/lib/influxdb/export-sensors-02
在使用第 2 步更改地址之前,您可以测试第 3 步几次,通过几次备份使新数据库赶上旧数据库。这是熟悉步骤 3 中的过程的好方法。
如果你是 运行 InfluxDB in Docker,就像我一样,你可以从主机执行所有命令。第 3 步将如下所示:
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influxd backup -portable -host 192.168.11.10:8088 -database sensors -start 2019-06-22T19:40:00Z -end 2019-06-24T00:00:00Z /var/lib/influxdb/export-sensors-02
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influxd restore -portable -database sensors -newdb sensors_tmp_back /var/lib/influxdb/export-sensors-02
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influx -database=sensors_tmp_back -execute 'SELECT * INTO sensors..:MEASUREMENT FROM /.*/ GROUP BY *'
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influx -database=sensors_tmp_back -execute 'DROP DATABASE sensors_tmp_back'
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 rm -rf /var/lib/influxdb/export-sensors-01
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 rm -rf /var/lib/influxdb/export-sensors-02
如果您在访问远程 InfluxDB 服务器时遇到问题,请记住 RPC-port 8088
通常出于安全原因绑定到 localhost
,因此您可能需要绑定它首先设置为 0.0.0.0
,可能是通过将远程实例上的环境变量 INFLUXDB_BIND_ADDRESS
设置为 0.0.0.0:8088
、as specified in the documentation,然后重新启动服务器。
我有一个包含多个数据库的 InfluxDB 服务器实例,例如 sensors
、network
、telegraf
等等。
这些数据库总共占用几十 GB,我只想将 sensors
数据库卸载到另一台更强大的机器上。
最简单的情况是我在另一台机器上创建一个新的 InfluxDB 服务器实例,然后将 influxdb/data/sensors
文件夹移动 (rsync) 到另一台机器,然后将其从原来的机器上删除。
虽然我还没有测试过,但我认为这不会那么容易工作;有一个 data/_internal
目录,然后是 meta/meta.db
文件以及 wal/*
目录,这可能需要保留所有内容 "as-is" 以便服务器实例能够启动无错误。
因为我说的是每个数据库几十 GB,理想情况下我只想安装一个新的 ssd,复制 files/directories,然后在另一台机器上安装这个新的 ssd 并使用它直接作为新的数据源,无需进一步复制。
我基本上希望我能以一种像将 rrd-tool 的 rrd
文件从一台机器移动到另一台机器一样简单的方式来做到这一点。
这可能吗?如果没有,我有什么选择?
我可能会按照你在问题中提到的那样尝试将 influxdb/data/sensors
目录复制到新机器上。
_internal
数据库维护 运行 时间统计。因此,如果您不查看该数据库,则可以忽略它。
我不知道它在哪里使用它的元数据,所以要小心。
wal/*
- 目录只是预写日志以避免数据丢失。我假设您为此 activity 有一些停机时间。如果您可以在执行此复制之前在传感器数据库中找到最新数据,则 wal 不会丢失数据。
不确定从 运行ning influxdb 实例 rsync influxdb/data/sensors
目录文件是否安全。至少你应该使用 rsync 和 运行ning influxd 复制文件,然后停止 influxd 服务并重复 rsync 以获取最近更新的文件。
如果不将“influxdb/meta/meta.db”复制到新服务器,您的新实例将不知道现有的旧数据库和度量。
据我所知,InfluxData 没有正式记录或推荐手动文件复制的过程。
可能使用官方的influxd backup
/ influxd restore
命令是一种更安全的方法。 1-2 年前,当我尝试使用它们时,它们是有问题的,但现在可能会起作用。您可以 运行 从远程旧实例备份到新服务器并在本地恢复备份。
编辑 2022:这是适用于 InfluxDB 1.x 的解决方案,此处显示的命令可能无法直接适用于 2.x。这是 2.x backup/restore 文档的 link:https://docs.influxdata.com/influxdb/v2.2/backup-restore/
The InfluxDB 2.2 influx backup command is not compatible with versions of InfluxDB prior to 2.0.0.
正如 Yuri Lachin 指出的那样,我使用了 influxd backup
/ influxd restore
。
虽然它确实有缺点,需要先将数据保存在光盘上,然后再从那里读取,但这似乎是最灵活的方法。
Rsyncing 50GB 确实需要一定的量,而且这段时间数据库需要离线,这不是backup / restore
的要求;所以没有数据丢失。它还允许将过去位于单个 InfluxDB 实例上的数据迁移到不同的 InfluxDB 服务器,而无需考虑元数据库的问题。
backup / restore
可以分步进行,第一步是先备份数据库的所有数据,恢复到新的服务器实例中,然后再导出最新的数据,但是没有'不要将其放入第一个备份中,将其再次还原到新数据库中。
第 1 步:
在包含新的空 InfluxDB 服务器实例的机器上,从远程旧 InfluxDB 实例备份数据:
influxd backup \
-portable \
-host 192.168.11.10:8088 \
-database sensors \
/var/lib/influxdb/export-sensors-01
之后将此数据导入新的服务器实例:
influxd restore \
-portable \
/var/lib/influxdb/export-sensors-01
第 2 步:
现在花点时间调整InfluxDB客户端当前连接的IP-address或域名,使其指向新的InfluxDB服务器;如有必要,请重新启动客户端。
第 3 步:
在 backup
完成并且您使用新 IP-address 重新启动客户端期间,新数据仍在写入旧数据库,因此我们需要同步该数据。
同样,在新服务器上,从旧服务器上提取备份,但指定丢失数据的时间范围和不同的目标目录:
influxd backup \
-portable \
-host 192.168.11.10:8088 \
-database sensors \
-start 2019-06-22T19:30:00Z \
-end 2019-06-24T00:00:00Z \
/var/lib/influxdb/export-sensors-02
显然指定 -end
也很重要,我做的一个没有 -end
参数的测试开始再次备份整个数据库。我刚刚 ctrl-d 退出并删除了 /var/lib/influxdb/export-sensors-02
并使用 -end
参数集再次启动它。
-start
参数可以包含几分钟的已恢复数据,因为在恢复第二次备份期间,这些重复的条目将被忽略或覆盖已经存在的相同值。
例如,如果您在下午 4 点开始主备份并在下午 6 点完成,则第二个备份可以包含 5:55pm 的 -start
参数和一对 -end
参数未来几天,这没问题,因为只要你切换客户端的 IP-addresses,就不会再有未来的数据写入旧数据库。可能 -since
参数会更好,但我在时间范围上做了一些试验,所以我把它留在使用 -start
+-end
.
为了将刚刚备份的丢失数据插入 /var/lib/influxdb/export-sensors-02
,您需要做更多的工作,因为 您不能 restore
现有数据库。如果您尝试这样做,不会损坏任何东西,只会显示一条警告消息,并且 restore
会中止。
所以我们需要将数据恢复到一个新的临时数据库中:
influxd restore \
-portable \
-database sensors \
-newdb sensors_tmp_backup \
/var/lib/influxdb/export-sensors-02
然后将数据复制到sensors
数据库中:
influx \
-database=sensors_tmp_backup \
-execute 'SELECT * INTO sensors..:MEASUREMENT FROM /.*/ GROUP BY *'
并删除临时数据库:
influx \
-database=sensors_tmp_backup \
-execute 'DROP DATABASE sensors_tmp_backup'
如果一切正常,删除备份目录
rm -rf /var/lib/influxdb/export-sensors-01
rm -rf /var/lib/influxdb/export-sensors-02
在使用第 2 步更改地址之前,您可以测试第 3 步几次,通过几次备份使新数据库赶上旧数据库。这是熟悉步骤 3 中的过程的好方法。
如果你是 运行 InfluxDB in Docker,就像我一样,你可以从主机执行所有命令。第 3 步将如下所示:
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influxd backup -portable -host 192.168.11.10:8088 -database sensors -start 2019-06-22T19:40:00Z -end 2019-06-24T00:00:00Z /var/lib/influxdb/export-sensors-02
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influxd restore -portable -database sensors -newdb sensors_tmp_back /var/lib/influxdb/export-sensors-02
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influx -database=sensors_tmp_back -execute 'SELECT * INTO sensors..:MEASUREMENT FROM /.*/ GROUP BY *'
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 influx -database=sensors_tmp_back -execute 'DROP DATABASE sensors_tmp_back'
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 rm -rf /var/lib/influxdb/export-sensors-01
docker exec -w /var/lib/influxdb/ influxdb-1.7.6 rm -rf /var/lib/influxdb/export-sensors-02
如果您在访问远程 InfluxDB 服务器时遇到问题,请记住 RPC-port 8088
通常出于安全原因绑定到 localhost
,因此您可能需要绑定它首先设置为 0.0.0.0
,可能是通过将远程实例上的环境变量 INFLUXDB_BIND_ADDRESS
设置为 0.0.0.0:8088
、as specified in the documentation,然后重新启动服务器。