Grafana 数据迁移和高可用实践

版本:7.4.2

操作系统:Ubuntu 18(Azure)

常用的命令

服务管理

1sudo systemctl stop grafana-server.service
2sudo systemctl start grafana-server.service
3sudo systemctl status grafana-server.service

默认 Grafana Home

1ls -alh /user/share/grafana/

默认配置文件

Grafana 的配置文件是继承的,因此实际上可以改 grafana.ini

1sudo vi /usr/share/grafana/conf/defaults.ini

Grafana 日志

1sudo vi /var/log/grafana/grafana.log

从终端启动

1sudo grafana-server -homepath=/var/lib/grafana -config=/etc/grafana/grafana.ini

日志级别和 SQL 日志

可以通过下面的配置开启查询日志,这样万一出错可以看到是哪个 SQL 语句导致的:

1log_queries = false # true to enable

日志级别的修改:

1[log]
2level = info # debug, info, warn, error, critical

数据库迁移

默认情况下,Grafana 采用 SQLite 数据库,这也为我们迁移数据埋下了坑。

数据库迁移分为如下步骤:

  1. 安装 PostgreSQL Server

  2. 创建 Grafana 专用的用户和数据库。这一步之后得到连接串

    确保授权。检查是否有权限建表、插入数据。

  3. 将被迁移到的主机的 IP 添加到防火墙白名单

  4. 将 Grafana 的配置文件改为使用 postgres

    记得将原来的配置文件备份。

    1. 配置用户名密码等

    2. 如果采用 ssl 模式:需要把 mode 设置为所需,并填写 ca cert 路径。

  5. 然后重启 grafanasystemd 服务。这样之后会自动在 pgsql 生成新的数据表。

    不建议采用预先创建后导入 schema 的方式。可能会导致失败

    这一步还需要注意,考虑到网络因素应当给它充足的时间建表,实测需要五分钟。建议不低于八分钟。

    可以通过查看日志确认。也可以从终端启动,这样能实时看到建表过程。

  6. 然后备份 Sqlite 格式的数据库。

  7. 删除 Sqlite 数据库中的这个表:

    1DROP TABLE dashboard_snapshot;
    

    这是因为此表采用了加密列,会导致 migrator 中途失败。而表中的内容(快照)基本无价值,也无关联。

  8. 使用 migrator 将 export.db 导入数据库。(migrator 采用 wbh1/grafana-sqlite-to-postgres)

    需要注意的是,如果强制了 SSL, 那么你需要通过相关连接串 url 参数设置上。

 1# 1. install PostgreSQL
 2(left out)
 3# 2. create user and db for grafana
 4su - postgres
 5psql
 6create user grafana with password 'grafana@{your-password}';
 7create database grafanadb with owner grafana;
 8# now connection string is
 9# postgres://grafana:grafana@{your-password}@{database-ip}:5432/grafanadb
10
11# 3. create initial tables in grafanadb
12
13# 3.1 stop grafana
14service grafana-server stop
15vi /etc/grafana/grafana.ini
16# configure the following line
17[database]
18type = postgres
19url = {connection_string}
20ssl_mode = disable
21# end of configuration
22
23# 3.2. restart grafana-server
24service grafana-server start
25systemctl status grafana-server.service --no-pager --full
26
27# 4. migrate data from sqlite to postgresql
28
29# 4.1 download and install grafana-migrate tool
30# download
31https://github.com/wbh1/grafana-sqlite-to-postgres/releases/download/v2.0.1/grafana-migrate_linux_amd64-v2.0.1
32# and then scp it to ~ and copy to /usr/local/bin/grafana-migrate
33(left out)
34
35# 4.2 run grafana-migrate
36chmod +x /usr/local/bin/grafana-migrate
37grafana-migrate /var/lib/grafana/grafana.db {connection_string}
38
39# NOTICE
40# if you see some outputs like `pq: relation "org" does not exist`
41# it means that grafana is creating the tables.
42# most likely because grafana is not able to connect to postgresql
43# check log /var/log/grafana/grafana.log for more details

关闭 SSL

由于 HA 之后使用负载均衡器管理 SSL, 内部通信没必要用 SSL, 可以选择关闭 SSL 功能。

但是 root_url 依然保留原来的配置。root_url 字段是用于前端生成 URL 使用的,不能使用内部端口。

1[server]
2# protocol = https
3# http_port = 443
4domain = example.sub.domain.microsoftapp.net
5root_url = https://example.sub.domain.microsoftapp.net:443

AAD 和其他 OAuth

我们完全保留原来的设置即可。示例:

 1[auth.azuread]
 2name = Azure AD
 3enabled = true
 4allow_sign_up = true
 5client_id = ***
 6client_secret = ***
 7scopes = openid email profile
 8auth_url = https://login.microsoftonline.com/****/oauth2/v2.0/authorize
 9token_url = https://login.microsoftonline.com/****/oauth2/v2.0/token
10allowed_domains = microsoft.com microsoft.onmicrosoft.com
11allowed_groups = *** *** ***

关闭 Alert

为了避免迁移之后第一次开机触发大量 ICM, 建议先关闭 Alert

1sudo vi /usr/share/grafana/conf/defaults.ini
2[alerting]
3enabled = true # false to disable

当开机测试数据正常后,可以重新启用。

负载均衡器(Nginx 为例)

实际上就是添加反向代理。注意处理 WebSocket.

创建配置文件

vi /etc/nginx/sites-available/grafana-ha

建议通过软链接的方式将其链接到 /etc/nginx/sites-enabled。配置完使用 sudo nginx -t 测试是否有语法错误。

 1# this is required to proxy Grafana Live WebSocket connections.
 2map $http_upgrade $connection_upgrade {
 3  default upgrade;
 4  '' close;
 5}
 6
 7upstream grafana {
 8  # 在这里填写负载的机器
 9  server 10.69.**.**:3000;
10}
11server {
12    listen 80;
13    listen [::]:80;
14    server_name *****.microsoftapp.net;
15    return 301 https://$server_name$request_uri;
16}
17server {
18  root /usr/share/nginx/html;
19
20  index index.html index.htm;
21  server_name *****.microsoftapp.net;
22  listen 443 ssl;
23  ssl_certificate /etc/grafana/certs/bingviz.crt;
24  ssl_certificate_key /etc/grafana/certs/bingviz.rsa;
25  location / {
26    proxy_set_header Host $http_host;
27    proxy_pass http://grafana;
28  }
29
30  # Proxy Grafana Live WebSocket connections.
31  location /api/live/ {
32    proxy_http_version 1.1;
33    proxy_set_header Upgrade $http_upgrade;
34    proxy_set_header Connection $connection_upgrade;
35    proxy_set_header Host $http_host;
36    proxy_pass http://grafana;
37  }
38}
39# == Grafana end ==
40# edit 2022-7

在编辑此文件前,应当用 curl 检查负载实例是否可连接。

HSTS

如果使用了 OAuth, 建议强制跳转 SSL, 否则认证流程也会失败。

1server {
2    listen 80;
3    listen [::]:80;
4    server_name ***.demo-site.microsoftapp.net;
5    return 301 https://$server_name$request_uri;
6}

启用配置文件:

1ln -s /etc/nginx/sites-available/grafana-ha /etc/nginx/sites-enabled/grafana-ha
2nginx -t && service nginx restart && service nginx status

健康检查

Grafana 提供了 HTTP API 查询机器的状态。

1# view the current version
2curl https://example.sub.domain.microsoftapp.net/api/health
3# start sample output
4{
5"commit": "29e75ad97b",
6"database": "ok",
7"version": "7.4.2"
8}
9# end of sample output

建议将健康检查也加到 Grafana 的 Alert 中。你可以用 Prometheus 来收集这些数据。

其它注意事项

能否手动迁移 SQL?

不要手动导入 migrator 生成的 sql 文件。这是因为由于 sqlite 不支持 boolean 等原因,migrator 会生成临时列,最后将这些临时列一次性转换为 boolean. 如果手动导入,会导致开机后表不被 grafana 承认。

多个实例会不会导致一次产生多个 Alert?

经测试不会。只会有一个实例对一个事件产生 Alert.

插件会在实例间同步吗?

不会。如果插件增减,则需要每个实例手动安装一下。一定要确保各个实例的插件一致。

配置文件倒是会共享的(看起来是存数据库)