Grafana使用 ceph 作为持久化存储,一但我将 Grafana 的Deployment 删除重建之后,之前的所有数据都会丢失,重建的 PV 会映射到后端存储的新位置。万幸的是,我真的手欠重建了,还没有提前备份。。。万幸个鬼啊我。
在我历经 250 分钟重建 Dashboard 之后,心里久久不能平静,一句 MMP 差点就要脱口而出。

1. 低级方案

再这样下去我真的要变成 250 了,这怎么能忍,立马打开 Google 研究了一把 Grafana 备份的各种骚操作,发现大部分备份方案都是通过shell脚本调用 Grafana 的API来导出各种配置。备份脚本大部分都集中在这个 gist 中:
我挑选出几个比较好用的,大家也可以自行挑选其他的。

导出脚本

#!/bin/bash # Usage: # # export_grafana_dashboards.sh https://admin:REDACTED@grafana.dedevsecops.com create_slug () { echo "$1" | iconv -t ascii//TRANSLIT | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z } full_url=$1 username=$(echo "${full_url}" | cut -d/ -f 3 | cut -d: -f 1) base_url=$(echo "${full_url}" | cut -d@ -f 2) folder=$(create_slug "${username}-${base_url}") mkdir "${folder}" for db_uid in $(curl -s "${full_url}/api/search" | jq -r .[].uid); do db_json=$(curl -s "${full_url}/api/dashboards/uid/${db_uid}") db_slug=$(echo "${db_json}" | jq -r .meta.slug) db_title=$(echo "${db_json}" | jq -r .dashboard.title) filename="${folder}/${db_slug}.json" echo "Exporting \"${db_title}\" to \"${filename}\"..." echo "${db_json}" | jq -r . > "${filename}" done echo "Done"
这个脚本比较简单,直接导出了所有 Dashboard 的json配置,也没有标记目录信息,如果你用它导出的配置来恢复 Grafana,所有的 Dashboard 都会导入到 Grafana 的General目录下,不太友好。

导入脚本

grafana-dashboard-importer.sh
#!/bin/bash # # add the "-x" option to the shebang line if you want a more verbose output # # OPTSPEC=":hp:t:k:" show_help() { cat