我有一个包含多个数据库,就像一个InfluxDB服务器实例sensors
,network
,telegraf
等等。
这些数据库一起消耗了几十 GB,我只想将sensors
数据库卸载到另一台更强大的机器上。
最简单的情况是我在另一台机器上创建一个新的 InfluxDB 服务器实例,然后将influxdb/data/sensors
文件夹移动(rsync)到另一台机器上,然后从原来的机器上删除它。
虽然我还没有测试过,但我认为这不会那么容易;有一个data/_internal
目录,然后是meta/meta.db
文件和wal/*
目录,这可能需要所有内容都保持“原样”,以便服务器实例启动时不会出错。
因为我说的是每个数据库有几十 GB,所以理想情况下,我只想挂载一个新的 ssd,复制文件/目录,然后将该新 ssd 挂载到另一台机器上,并将其直接用作新的数据源无需进一步复制。
我基本上希望我可以像将 rrd-tool 的rrd
文件从一台机器移动到另一台机器一样简单地做到这一点。
这可能吗?如果没有,我有什么选择?
正如 Yuri Lachin 指出的那样,我使用influxd backup
/ influxd restore
。
虽然它的缺点是首先需要将数据保存在磁盘上,然后从那里读入,但它似乎是最灵活的方法。
Rsyncing 50GB 确实需要一定的数量,并且在此期间数据库需要离线,这不是backup / restore
; 所以没有数据丢失。它还允许将曾经位于单个 InfluxDB 实例上的数据迁移到不同的 InfluxDB 服务器,而无需考虑元数据数据库的问题。
在backup / restore
可以步骤,其中第一步IST最初备份所有数据库的数据,将其还原到新的服务器实例,然后再出口的最新数据,其并没有使它成为第一个备份完成,恢复它再次进入新的数据库。
步骤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
,因此您可能需要0.0.0.0
先将其绑定到,可能通过将INFLUXDB_BIND_ADDRESS
远程实例上的环境变量设置为0.0.0.0:8088
,如指定在文档中,然后重新启动服务器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句