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 数据库,这也为我们迁移数据埋下了坑。
数据库迁移分为如下步骤:
-
安装 PostgreSQL Server
-
创建 Grafana 专用的用户和数据库。这一步之后得到连接串
确保授权。检查是否有权限建表、插入数据。
-
将被迁移到的主机的 IP 添加到防火墙白名单
-
将 Grafana 的配置文件改为使用
postgres
记得将原来的配置文件备份。
-
配置用户名密码等
-
如果采用 ssl 模式:需要把 mode 设置为所需,并填写 ca cert 路径。
-
-
然后重启
grafana
的systemd
服务。这样之后会自动在 pgsql 生成新的数据表。不建议采用预先创建后导入 schema 的方式。可能会导致失败
这一步还需要注意,考虑到网络因素应当给它充足的时间建表,实测需要五分钟。建议不低于八分钟。
可以通过查看日志确认。也可以从终端启动,这样能实时看到建表过程。
-
然后备份 Sqlite 格式的数据库。
-
删除 Sqlite 数据库中的这个表:
1DROP TABLE dashboard_snapshot;
这是因为此表采用了加密列,会导致 migrator 中途失败。而表中的内容(快照)基本无价值,也无关联。
-
使用 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.
插件会在实例间同步吗?
不会。如果插件增减,则需要每个实例手动安装一下。一定要确保各个实例的插件一致。
配置文件倒是会共享的(看起来是存数据库)