在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。
广告
将在 10 秒后关闭
bannerAds