InfluxDB:仅将多个数据库中的一个数据库从一个服务器实例移动到另一个服务器实例

时间:2019-06-14 10:43:06

标签: influxdb

我有一个InfluxDB服务器实例,其中包含多个数据库,例如sensorsnetworktelegraf等。

这些数据库总共要消耗数十GB,我只想将sensors数据库卸载到另一台功能更强大的计算机上。

最简单的情况是,我在另一台计算机上创建一个新的InfluxDB服务器实例,然后将influxdb/data/sensors文件夹移动(同步)到另一台计算机上,并将其从原始计算机中删除。

虽然我尚未对其进行测试,但我认为这样做并不容易;有一个data/_internal目录,然后还有meta/meta.db文件和wal/*目录,为了使服务器实例能够正常运行,可能需要将所有内容保持“原样”启动没有错误。

由于我正在谈论每个数据库数十GB,因此理想情况下,我只想挂载一个新的ssd,复制文件/目录,然后将该新的ssd挂载到另一台机器上,然后直接用作新的数据源,而无需进一步复制。

我基本上希望我可以像将rrd-tool的rrd文件从一台计算机移动到另一台计算机一样简单。

这可能吗?如果没有,我有什么选择?

3 个答案:

答案 0 :(得分:2)

不确定从正在运行的influxdb实例中同步influxdb/data/sensors目录文件是安全的。至少您应该使用rsync和运行中的influxd复制文件,然后停止influxd服务并重复rsync以获取最近更新的文件。

如果不将“ influxdb / meta / meta.db”复制到新服务器,则新实例将不了解现有的旧数据库和度量。

AFAIK,InfluxData没有正式记录或推荐手动文件复制过程。

可能使用官方的influxd backup / influxd restore命令是一种更安全的方法。 1-2年前,当我尝试使用它们时,它们是越野车,但现在可能会起作用。您可以从远程旧实例在新服务器上运行备份,然后在本地还原备份。

答案 1 :(得分:0)

我可以像您在问题副本influxdb/data/sensors目录中提到的那样,尝试将其复制到新计算机上。

_internal数据库维护运行时统计信息。因此,如果您不查找该数据库,则可以忽略它。

我不知道它在使用它的元数据,所以要小心。

wal/*-目录只不过是预写日志以避免数据丢失。我假设您为此活动有一些停机时间。如果在进行此复制之前可以在传感器数据库中找到最新数据,则不会因wal丢失数据。

答案 2 :(得分:0)

正如Yuri Lachin所指出的,我求助于使用influxd backup / influxd restore

虽然确实存在缺点,首先需要将数据保存在磁盘上,然后从那里读取数据,但这似乎是最灵活的方法。

同步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地址或域名,并使其指向新的InfluxDB服务器。如有必要,请重新启动客户端。

第3步:

backup完成期间,您使用新的IP地址重新启动了客户端,新数据仍被写入旧数据库,因此我们将需要同步这些数据。

同样,在新服务器上,从旧服务器上提取备份,但指定丢失数据的时间范围和另一个目标目录:

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点结束,则第二个备份可以在下午两天包含-start参数(下午5:55)和-end参数。将来,这没有问题,因为一旦您切换了客户端的IP地址,就不会再有更多的将来数据写入旧数据库了。可能是-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中的过程的好方法。


如果像我一样在Docker中运行InfluxDB,则可以从主机执行所有命令。然后,第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端口8088通常绑定到localhost,因此您可能需要将其绑定到{{1 }},首先,可以将远程实例上的环境变量0.0.0.0设置为INFLUXDB_BIND_ADDRESSas specified in the documentation,然后重新启动服务器。

相关问题