在Grafana的仪表盘上进行自动更新时,当服务器的IO负载增加时,系统会自动注销登录→解决方法是更改使用的数据库从SQLite3
环境
- ホスト: Raspberry Pi 4 (4GB)
我们使用在DockerHub上公开的映像来运行Grafana。(请参考下面的docker-compose.yml)
version: "2"
services:
prometheus:
# 省略
grafana:
image: grafana/grafana-arm64v8-linux
links:
- prometheus
volumes:
- grafana-data:/var/lib/grafana
volumes:
grafana-data:
目前的情况
当使用iostat命令确认Raspberry Pi内核的tar.gz1解压状态时,%iowait数值接近50。这本身是因为Raspberry Pi的SD卡读写性能并不高,所以我认为这是无法避免的情况。
然而,当负载增加时,Grafana仪表盘的自动更新会触发,导致出现以下现象。
-
- Grafana上にUnauthorizedのメッセージが表示される
-
- Unauthorizedのメッセージが表示された後、勝手にログアウトされたり、Server Errorの画面が表示される
docker-compose logs grafanaに以下のようなログが記録される
grafana_1 | t=2020-09-06T04:34:56+0000 lvl=eror msg="Failed to look up user based on cookie" logger=context error="database is locked"
进行分析
根据日志所述,数据库被锁定,无法获取用户信息,并似乎已经注销。
如果您没有进行任何配置,DockerHub上发布的Grafana将会默认使用SQLite3作为数据库。由于SQLite3的锁定是以数据库为单位的,所以当IO负载较高时,锁定和解锁所需的时间会较长。在这段时间内,可能发生了读取用户信息的操作,从而导致了上述错误的发生。
应对
如果锁定是问题,那么使用其他关系型数据库管理系统(如PostgreSQL)可以降低由于锁定造成无法获取数据行的可能性。因此,我们决定使用PostgreSQL来配置Grafana。
当设置了以GF_开头的环境变量时,可以覆盖grafana.ini的配置,因此我们将docker-compose.yml配置如下以使用PostgreSQL。
services:
grafana:
image: grafana/grafana-arm64v8-linux
ports:
- 3111:3000
links:
- prometheus
- postgres
environment:
- GF_DATABASE_TYPE=postgres
- GF_DATABASE_HOST=postgres
- GF_DATABASE_NAME=grafana
- GF_DATABASE_USER=grafana_user
- GF_DATABASE_PASSWORD=aoZ62dMb
postgres:
image: postgres:12.4
environment:
- POSTGRES_USER=grafana_user
- POSTGRES_PASSWORD=aoZ62dMb
- POSTGRES_DB=grafana
在此设置中,您将以下设置添加到grafana.ini中。
[database]
type=postgres
host=postgres
name=grafana
user=grafana_user
password=aoZ62dMb
使用上述的设定,即使再次模拟之前经常自动退出登录的情况,现在已经不会再自动退出登录了。
然而,正如之前所述,树莓派的SD卡读写性能并不高,所以也许在系统负载较重的情况下,可能会导致登出。不过,我认为这种情况的概率大大降低了。
请参阅以下网页。
-
- https://grafana.com/docs/grafana/latest/installation/configure-docker/
- https://grafana.com/docs/grafana/latest/administration/configuration/
这是在树莓派上linux发行的一个东西。
尽管使用ionice可能还能解决问题,但由于我正在使用bfq IO调度器,因此无法使用它。而且,这次问题似乎是由于SQLite的锁范围过大引起的,所以我不使用ionice。
尽管使用ionice可能还能解决问题,但由于我正在使用bfq IO调度器,因此无法使用它。而且,这次问题似乎是由于SQLite的锁范围过大引起的,所以我不使用ionice。