Grafana 开源版是一款开源可视化和分析软件。它允许您查询、可视化、警报和探索您的指标、日志和跟踪,无论它们存储在何处。它为您提供工具,将时间序列数据库 (TSDB) 数据转换为富有洞察力的图表和可视化效果。

下面是关于Grafana部署和升级的一些实操分享,包含:

  • 通过Docker部署Grafana
  • 升级Grafana
  • Grafana 配置
  • Grafana 迁移

一.Docker部署Grafana v10.1.1

1.启动

使用镜像自带默认启动容器脚本启动

docker run --name=grafana \
--hostname=$(hostname) \
--user=grafana \
--env=GF_SECURITY_ADMIN_USER=admin \
--env=GF_SECURITY_ADMIN_PASSWORD=j1VaCLiJ \
--env=GF_PATHS_CONFIG=/etc/grafana/grafana.ini \
--env=GF_PATHS_DATA=/var/lib/grafana \
--env=GF_PATHS_HOME=/usr/share/grafana \
--env=GF_PATHS_LOGS=/var/log/grafana \
--env=GF_PATHS_PLUGINS=/var/lib/grafana/plugins \
--env=GF_PATHS_PROVISIONING=/etc/grafana/provisioning \
--volume=/etc/hosts:/etc/hosts \
--volume=/etc/localtime:/etc/localtime \
--workdir=/usr/share/grafana \
-p 3000:3000 \
--restart=unless-stopped \
--log-opt max-file=3 \
--log-opt max-size=512m \
-itd \
grafana/grafana:10.1.1


# --volume=/opt/grafana/defaults.ini:/usr/share/grafana/conf/defaults.ini \
# --volume=/opt/grafana/grafana:/var/lib/grafana \

容器内启动进程

XXXXXXXX:/usr/share/grafana$ ps -ef |cat
PID   USER     TIME  COMMAND
    1 grafana   0:04 grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:default.log.mode=console cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins cfg:default.paths.provisioning=/etc/grafana/provisioning
   30 grafana   0:00 bash
   39 grafana   0:00 ps -ef
   40 grafana   0:00 cat

容器内启动脚本

XXXXXXXX:/usr/share/grafana/conf$ cat /run.sh

#!/bin/bash -e

PERMISSIONS_OK=0

if [ ! -r "$GF_PATHS_CONFIG" ]; then
    echo "GF_PATHS_CONFIG='$GF_PATHS_CONFIG' is not readable."
    PERMISSIONS_OK=1
fi

if [ ! -w "$GF_PATHS_DATA" ]; then
    echo "GF_PATHS_DATA='$GF_PATHS_DATA' is not writable."
    PERMISSIONS_OK=1
fi

if [ ! -r "$GF_PATHS_HOME" ]; then
    echo "GF_PATHS_HOME='$GF_PATHS_HOME' is not readable."
    PERMISSIONS_OK=1
fi

if [ $PERMISSIONS_OK -eq 1 ]; then
    echo "You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migrate-to-v51-or-later"
fi

if [ ! -d "$GF_PATHS_PLUGINS" ]; then
    mkdir "$GF_PATHS_PLUGINS"
fi

if [ ! -z ${GF_AWS_PROFILES+x} ]; then
    > "$GF_PATHS_HOME/.aws/credentials"

    for profile in ${GF_AWS_PROFILES}; do
        access_key_varname="GF_AWS_${profile}_ACCESS_KEY_ID"
        secret_key_varname="GF_AWS_${profile}_SECRET_ACCESS_KEY"
        region_varname="GF_AWS_${profile}_REGION"

        if [ ! -z "${!access_key_varname}" -a ! -z "${!secret_key_varname}" ]; then
            echo "[${profile}]" >> "$GF_PATHS_HOME/.aws/credentials"
            echo "aws_access_key_id = ${!access_key_varname}" >> "$GF_PATHS_HOME/.aws/credentials"
            echo "aws_secret_access_key = ${!secret_key_varname}" >> "$GF_PATHS_HOME/.aws/credentials"
            if [ ! -z "${!region_varname}" ]; then
                echo "region = ${!region_varname}" >> "$GF_PATHS_HOME/.aws/credentials"
            fi
        fi
    done

    chmod 600 "$GF_PATHS_HOME/.aws/credentials"
fi

# Convert all environment variables with names ending in __FILE into the content of
# the file that they point at and use the name without the trailing __FILE.
# This can be used to carry in Docker secrets.
for VAR_NAME in $(env | grep '^GF_[^=]\+__FILE=.\+' | sed -r "s/([^=]*)__FILE=.*/\1/g"); do
    VAR_NAME_FILE="$VAR_NAME"__FILE
    if [ "${!VAR_NAME}" ]; then
        echo >&2 "ERROR: Both $VAR_NAME and $VAR_NAME_FILE are set (but are exclusive)"
        exit 1
    fi
    echo "Getting secret $VAR_NAME from ${!VAR_NAME_FILE}"
    export "$VAR_NAME"="$(< "${!VAR_NAME_FILE}")"
    unset "$VAR_NAME_FILE"
done

export HOME="$GF_PATHS_HOME"

if [ ! -z "${GF_INSTALL_PLUGINS}" ]; then
  OLDIFS=$IFS
  IFS=','
  for plugin in ${GF_INSTALL_PLUGINS}; do
    IFS=$OLDIFS
    if [[ $plugin =~ .*\;.* ]]; then
        pluginUrl=$(echo "$plugin" | cut -d';' -f 1)
        pluginInstallFolder=$(echo "$plugin" | cut -d';' -f 2)
        grafana cli --pluginUrl ${pluginUrl} --pluginsDir "${GF_PATHS_PLUGINS}" plugins install "${pluginInstallFolder}"
    else
        grafana cli --pluginsDir "${GF_PATHS_PLUGINS}" plugins install ${plugin}
    fi
  done
fi

exec grafana server                                         \
  --homepath="$GF_PATHS_HOME"                               \
  --config="$GF_PATHS_CONFIG"                               \
  --packaging=docker                                        \
  "$@"                                                      \
  cfg:default.log.mode="console"                            \
  cfg:default.paths.data="$GF_PATHS_DATA"                   \
  cfg:default.paths.logs="$GF_PATHS_LOGS"                   \
  cfg:default.paths.plugins="$GF_PATHS_PLUGINS"             \
  cfg:default.paths.provisioning="$GF_PATHS_PROVISIONING"

2.定制启动

  • 配置文件本地存储
  • 数据目录本地存储

1.复制/etc/grafana/grafana.ini 到宿主机,作为模板再挂载进去

docker run -itd --name "grafana" --entrypoint /bin/bash grafana/grafana:10.1.1
docker cp grafana:/etc/grafana/grafana.ini /opt/grafana/grafana.ini
docker rm -f grafana

2.创建本地用于挂载的数据目录

mkdir /opt/grafana/grafana -p
chmod 777 /opt/grafana/grafana

3.启动命令

默认镜像 WORKDIR 就是 /usr/share/grafana ,可以不用 (--workdir=/usr/share/grafana )指定

docker run --name=grafana \
--hostname=$(hostname) \
--user=grafana \
--env=GF_SECURITY_ADMIN_USER=admin \
--env=GF_SECURITY_ADMIN_PASSWORD=j1VaCLiJ \
--env=GF_PATHS_CONFIG=/etc/grafana/grafana.ini \
--env=GF_PATHS_DATA=/var/lib/grafana \
--env=GF_PATHS_HOME=/usr/share/grafana \
--env=GF_PATHS_LOGS=/var/log/grafana \
--env=GF_PATHS_PLUGINS=/var/lib/grafana/plugins \
--env=GF_PATHS_PROVISIONING=/etc/grafana/provisioning \
--volume=/etc/hosts:/etc/hosts \
--volume=/etc/localtime:/etc/localtime \
--volume=/opt/grafana/grafana.ini:/etc/grafana/grafana.ini \
--volume=/opt/grafana/grafana:/var/lib/grafana \
-p 3000:3000 \
--restart=unless-stopped \
--log-opt max-file=3 \
--log-opt max-size=512m \
-itd \
grafana/grafana:10.1.1

3.默认路径环境变量

Setting默认值
GF_PATHS_CONFIG/etc/grafana/grafana.ini
GF_PATHS_DATA/var/lib/grafana
GF_PATHS_HOME/usr/share/grafana
GF_PATHS_LOGS/var/log/grafana
GF_PATHS_PLUGINS/var/lib/grafana/plugins
GF_PATHS_PROVISIONING/etc/grafana/provisioning

二.Grafana配置

1.配置文件参考

Grafana 配置文件位于以下目录中:

  • 默认配置:$WORKING_DIR/conf/defaults.ini
  • 自定义配置:$WORKING_DIR/conf/custom.ini

配置默认值

/usr/share/grafana/conf/defaults.ini

禁止安装过程中修改

仅提供配置文件开头展示

##################### Grafana Configuration Defaults #####################
#
# Do not modify this file in grafana installs
#

# possible values : production, development
app_mode = production

配置示例

/etc/grafana/grafana.ini

所有内容都有默认值,所以您只需要取消对想要更改的内容的注释。

仅提供配置文件开头展示

##################### Grafana Configuration Example #####################
#
# Everything has defaults so you only need to uncomment things you want to
# change

# possible values : production, development
;app_mode = production

2.使用环境变量覆盖配置

不要使用环境变量添加新的配置设置。相反,使用环境变量来覆盖现有选项。

要覆盖选项:

GF_<SectionName>_<KeyName>

其中节名称是括号内的文本。一切都应该是大写的,.-应该被替换_。例如,如果您有以下配置设置:

# default section
instance_name = ${HOSTNAME}

[security]
admin_user = admin

[auth.google]
client_secret = 0ldS3cretKey

[plugin.grafana-image-renderer]
rendering_ignore_https_errors = true

[feature_toggles]
enable = newNavigation

您可以使用以下命令覆盖 Linux 计算机上的变量:

export GF_DEFAULT_INSTANCE_NAME=my-instance
export GF_SECURITY_ADMIN_USER=owner
export GF_AUTH_GOOGLE_CLIENT_SECRET=newS3cretKey
export GF_PLUGIN_GRAFANA_IMAGE_RENDERER_RENDERING_IGNORE_HTTPS_ERRORS=true
export GF_FEATURE_TOGGLES_ENABLE=newNavigation

三.Grafana升级(v6.4.3 -> v10.1.1)

之前做的,记录的不是很清晰,Dashboard应该是自动迁移,不需要单独处理。关于告警规则有了比较大的变动,但是也会自动更新,需要调整配置。

1.面板迁移

copy json 在新版 load 导入即可

2.告警规则迁移

参考: 升级警报

2.1继续保留旧警报

升级到 Grafana > 9.0 时,使用旧版警报的现有安装将自动升级到 Grafana Alerting,除非您在迁移之前选择退出 Grafana Alerting。在升级过程中,旧警报将迁移到新警报类型,并且不会丢失任何警报或警报数据。要继续使用旧警报并停用 Grafana 警报:

  1. 转到您的自定义配置文件 ($WORKING_DIR/conf/custom.ini)。
  2. 在您的配置中输入以下内容:
[alerting]
enabled = true

[unified_alerting]
enabled = false
  1. 重新启动 Grafana 以使配置更改生效。

如果您想重新打开警报,可以删除这两个标志以启用 Grafana 警报。

实操:

修改配置,使用旧版告警

swift@XXXXXXXX:/opt/grafana$ vim grafana.ini

修改内容示例

#################################### Alerting ############################
[alerting]
# Disable legacy alerting engine & UI features
enabled = true

#################################### Unified Alerting ####################
[unified_alerting]
#Enable the Unified Alerting sub-system and interface. When enabled we'll migrate all of your alert rules and notification channels to the new system. New alert rules will be created and your notification channels will be converted into an Alertmanager configuration. Previous data is preserved to enable backwards compatibility but new data is removed.```
enabled = false

重启服务

swift@XXXXXXXX:/opt/grafana$ docker restart grafana

报错了

INFO [09-15|15:45:22] Connecting to DB                         logger=sqlstore dbtype=sqlite3
ERROR[09-15|15:45:22] Critical error                           logger=cli reason="Grafana has already been migrated to Unified Alerting.\nAny alert rules created while using Unified Alerting will be deleted by rolling back.\n\nSet force_migration=true in your grafana.ini and restart Grafana to roll back and delete Unified Alerting configuration data." stackTrace="goroutine 1 [running]:\nruntime/debug.Stack()\n\truntime/debug/stack.go:24 +0x65\ngithub.com/grafana/grafana/pkg/cmd/grafana-server/commands.RunServer.func3()\n\tgithub.com/grafana/grafana/pkg/cmd/grafana-server/commands/cli.go:181 +0x9c\npanic({0x6205e0, 0x1eb8f30})\n\truntime/panic.go:890 +0x263\ngithub.com/grafana/grafana/pkg/services/sqlstore/migrations/ualert.AddDashAlertMigration(0xc00052a930)\n\tgithub.com/grafana/grafana/pkg/services/sqlstore/migrations/ualert/ualert.go:91 +0x58d\ngithub.com/grafana/grafana/pkg/services/sqlstore/migrations.(*OSSMigrations).AddMigration(0xc000d9ce00, 0xc00052a930)\n\tgithub.com/grafana/grafana/pkg/services/sqlstore/migrations/migrations.go:55 +0x14f\ngithub.com/grafana/grafana/pkg/services/sqlstore.(*SQLStore).Migrate(0xc000d5da40, 0x0?)\n\tgithub.com/grafana/grafana/pkg/services/sqlstore/sqlstore.go:140 +0x73\ngithub.com/grafana/grafana/pkg/services/sqlstore.ProvideService(0xc0007e4000, 0x1f21b80?, {0x1ec8600?, 0x96e1f28?}, {0x1ee14f0?, 0xc000427ae8?}, {0x1ef3d10?, 0xc001119130?})\n\tgithub.com/grafana/grafana/pkg/services/sqlstore/sqlstore.go:70 +0x107\ngithub.com/grafana/grafana/pkg/server.Initialize({{0x7ffec0c1ecfd, 0x18}, {0x7ffec0c1ece1, 0x12}, {0xc00165e900, 0x6, 0x6}}, {{0x0, 0x0}, {0x0, ...}, ...}, ...)\n\tgithub.com/grafana/grafana/pkg/server/wire_gen.go:234 +0x28b\ngithub.com/grafana/grafana/pkg/cmd/grafana-server/commands.RunServer({{0x1eae818, 0x6}, {0x1eafc40, 0xa}, {0x1eafc50, 0xe}, {0x1eafc30, 0xa}, 0xc000b46780})\n\tgithub.com/grafana/grafana/pkg/cmd/grafana-server/commands/cli.go:228 +0xfea\ngithub.com/grafana/grafana/pkg/cmd/grafana-server/commands.ServerCommand.func1(0xc0015a7b10?)\n\tgithub.com/grafana/grafana/pkg/cmd/grafana-server/commands/cli.go:97 +0xc5\ngithub.com/urfave/cli/v2.(*Command).Run(0xc00080d760, 0xc000b46780, {0xc000903cb0, 0x9, 0x9})\n\tgithub.com/urfave/cli/v2@v2.25.0/command.go:273 +0x9eb\ngithub.com/urfave/cli/v2.(*Command).Run(0xc00080da20, 0xc000b46640, {0xc000132000, 0xa, 0xa})\n\tgithub.com/urfave/cli/v2@v2.25.0/command.go:266 +0xc4d\ngithub.com/urfave/cli/v2.(*App).RunContext(0xc0006bf860, {0x1f0a0b0?, 0xc000136000}, {0xc000132000, 0xa, 0xa})\n\tgithub.com/urfave/cli/v2@v2.25.0/app.go:332 +0x616\ngithub.com/urfave/cli/v2.(*App).Run(...)\n\tgithub.com/urfave/cli/v2@v2.25.0/app.go:309\nmain.main()\n\tgithub.com/grafana/grafana/pkg/cmd/grafana/main.go:39 +0x285\n"
panic: Grafana has already been migrated to Unified Alerting.
Any alert rules created while using Unified Alerting will be deleted by rolling back.

Set force_migration=true in your grafana.ini and restart Grafana to roll back and delete Unified Alerting configuration data. [recovered]
        panic: Grafana has already been migrated to Unified Alerting.
Any alert rules created while using Unified Alerting will be deleted by rolling back.

Set force_migration=true in your grafana.ini and restart Grafana to roll back and delete Unified Alerting configuration data.

goroutine 1 [running]:

Grafana已经迁移到统一警报。

使用统一警报时创建的任何警报规则都将通过回滚删除。

在Grafana.ini中设置force_migration=true,然后重新启动Grafana以回滚并删除统一警报配置数据。

解决方法:

修改配置,配置 force_migration=true,重新启动

处理

swift@XXXXXXXX:/opt/grafana$ grep force_migration grafana.ini
;force_migration = false
swift@XXXXXXXX:/opt/grafana$ vim grafana.ini
swift@XXXXXXXX:/opt/grafana$ grep force_migration grafana.ini
force_migration = true

swift@XXXXXXXX:/opt/grafana$ docker restart grafana

查看日志,成功启动

INFO [09-15|15:48:19] starting                                 logger=ticker first_tick=2023-09-15T15:48:20+08:00
INFO [09-15|15:48:20] Update check succeeded                   logger=plugins.update.checker duration=614.25438ms
INFO [09-15|15:48:20] Request Completed                        logger=context userId=1 orgId=1 uname=admin method=GET path=/api/live/ws status=-1 remote_addr=192.168.20.5 time_ms=28 duration=28.145464ms size=0 referer= handler=/api/live/ws
INFO [09-15|15:48:26] Request Completed                        logger=context userId=1 orgId=1 uname=admin method=GET path=/api/ruler/grafana/api/v1/rules status=404 remote_addr=192.168.20.5 time_ms=4 duration=4.377736ms size=24 referer=http://192.168.1.236:3000/alerting/list handler=notfound
INFO [09-15|15:48:26] Request Completed                        logger=context userId=1 orgId=1 uname=admin method=GET path=/api/prometheus/grafana/api/v1/rules
 status=404 remote_addr=192.168.20.5 time_ms=4 duration=4.583239ms size=24 referer=http://192.168.1.236:3000/alerting/list handler=notfound
INFO [09-15|15:48:26] Request Completed                        logger=context userId=1 orgId=1 uname=admin method=GET path=/api/prometheus/d5ece8f4-d068-4cb2-8a8f-480915787e8c/api/v1/rules status=404 remote_addr=192.168.20.5 time_ms=7 duration=7.876743ms size=24 referer=http://192.168.1.236:3000/alerting/list handler=notfound
INFO [09-15|15:48:29] Request Completed                        logger=context userId=1 orgId=1 uname=admin method=GET path=/api/live/ws status=-1 remote_addr=192.168.20.5 time_ms=4 duration=4.490313ms size=0 referer= handler=/api/live/ws
ERROR[09-15|15:48:49] Update check failed                      logger=grafana.update.checker error="failed to get latest.json repo from github.com: Get \"https://raw.githubusercontent.com/grafana/grafana/main/latest.json\": net/http: request canceled (Client.Timeout exceeded while awaiting headers)" duration=30.001521916s
INFO [09-15|15:49:06] Usage stats are ready to report          logger=infra.usagestats

2.2检查告警是否迁移

查看告警规则中没有,进入面板查看,点击alert部分,能看到,但是提示删除信息

提示删除无效的通知程序。

Notifier with invalid identifier is detected

Do you want to delete notifier with invalid identifier: XGBO_eP7k from the dashboard JSON?
After successful deletion, make sure to save the dashboard for storing the update JSON.
Type "Delete" to confirm

参考:

原因

查看json model发现该uid ( XGBO_eP7k ) 是指向的告警方式,由于没有该告警方式,所以提示报错

                "message": "local-test_磁盘不足(小于5)",
                "name": "local-test 磁盘剩余严重alert",
                "noDataState": "keep_state",
                "notifications": [
                    {
                        "uid": "a82fma9Gk"
                    },
                    {
                        "uid": "XGBO_eP7k"
                    },
                    {
                        "uid": "Mnq4jFt4z"
                    }
                ]
                "message": "local-test 数据库",
                "name": "local-test 数据库从库存活状态_alert",
                "noDataState": "keep_state",
                "notifications": [
                    {
                        "uid": "a82fma9Gk"
                    },
                    {
                        "uid": "XGBO_eP7k"
                    }
                ]

解决方法:

1.创建告警方式,如果没有相同告警方式,就新建

2.将新建告警方式,绑定到告警规则中

3.组件升级

存在无法使用或要遗弃的组件

4.问题

单独迁移一个面板,异常,迁移整个老的grafana.db 正常

INFO [09-18|10:34:50] Database locked, sleeping then retrying  logger=sqlstore.transactions error="database is locked" retry=1 code="database is locked"
INFO [09-18|10:34:50] Database locked, sleeping then retrying  logger=sqlstore.transactions error="[sqlstore.max-retries-reached] retry 1: database is locked" retry=2 code="database is locked"
INFO [09-18|10:34:54] Database locked, sleeping then retrying  logger=sqlstore.transactions error="database is locked" retry=1 code="database is locked"
ERROR[09-18|10:34:54] Could not load alerts                    logger=alerting.ruleReader error="[sqlstore.max-retries-reached] retry 1: database is locked"
INFO [09-18|10:34:55] Database locked, sleeping then retrying  logger=sqlstore.transactions error="database is locked" retry=1 code="database is locked"
INFO [09-18|10:34:55] Database locked, sleeping then retrying  logger=sqlstore.transactions error="[sqlstore.max-retries-reached] retry 1: database is locked" retry=3 code="database is locked"
INFO [09-18|10:35:00] Database locked, sleeping then retrying  logger=sqlstore.transactions error="database is locked" retry=1 code="database is locked"
INFO [09-18|10:35:00] Database locked, sleeping then retrying  logger=sqlstore.transactions error="[sqlstore.max-retries-reached] retry 1: database is locked" retry=4 code="database is locked"
INFO [09-18|10:35:05] Database locked, sleeping then retrying  logger=sqlstore.transactions error="database is locked" retry=1 code="database is locked"
ERROR[09-18|10:35:05] Failed to save dashboard                 logger=context userId=1 orgId=1 uname=admin error="[sqlstore.max-retries-reached] retry 1: database is locked" remote_addr=192.168.20.5 traceID=
ERROR[09-18|10:35:05] Request Completed                        logger=context userId=1 orgId=1 uname=admin method=POST path=/api/dashboards/db/ status=500 remote_addr=192.168.20.5 time_ms=30227 duration=30.227138782s size=51 referer="http://192.168.1.236:3000/d/1/local-test?editPanel=183&orgId=1&tab=alert" handler=/api/dashboards/db

修改面板,无法保存,保存异常,且无法查看告警规则

迁移一个新的,可以正常使用,获取告警信息

关闭语音告警等

# 地址最后添加_test
DingTalk
tts

关闭

# 新增webhook测试

但是保存还是存在问题

ERROR[09-18|11:29:19] Failed getting data source               logger=datasources err="database is locked" uid= id=154 name= orgId=1
INFO [09-18|11:29:19] Database locked, sleeping then retrying  logger=sqlstore.transactions error="database is locked" retry=1 code="database is locked"
INFO [09-18|11:29:19] [SQL] SELECT `id`, `org_id`, `version`, `name`, `type`, `access`, `url`, `password`, `user`, `database`, `basic_auth`, `basic_auth_user`, `basic_auth_password`, `with_credentials`, `is_default`, `json_data`, `secure_json_data`, `read_only`, `uid`, `created`, `updated` FROM `data_source` WHERE `id`=? AND `org_id`=? LIMIT 1 []interface {}{127, 1} - took: 5.020739264s logger=sqlstore.xorm caller=[]
INFO [09-18|11:29:19] [SQL] SELECT `id`, `org_id`, `version`, `name`, `type`, `access`, `url`, `password`, `user`, `database`, `basic_auth`, `basic_auth_user`, `basic_auth_password`, `with_credentials`, `is_default`, `json_data`, `secure_json_data`, `read_only`, `uid`, `created`, `updated` FROM `data_source` WHERE `id`=? AND `org_id`=? LIMIT 1 []interface {}{154, 1} - took: 5.022162872s logger=sqlstore.xorm caller=[]
ERROR[09-18|11:29:19] Failed getting data source               logger=datasources err="database is locked" uid= id=154 name= orgId=1
ERROR[09-18|11:29:19] Failed getting data source               logger=datasources err="database is locked" uid= id=127 name= orgId=1

解决方法:

参考:https://github.com/grafana/grafana/issues/65115

# For "sqlite3" only. Enable/disable Write-Ahead Logging, https://sqlite.org/wal.html. Default is false.
;wal = false
wal = true

四.Docker部署Grafana v10.1.2

部署Grafana v10.1.2 版本,通过HAproxy转发。

1.启动Grafana服务

1.创建配置文件和环境

mkdir /opt/grafana/grafana -p
chmod 777 /opt/grafana/grafana
# touch /opt/grafana/defaults.ini

docker run -itd --name "grafana" --entrypoint /bin/bash grafana/grafana:10.1.2
docker cp grafana:/etc/grafana/grafana.ini /opt/grafana/grafana.ini
docker rm -f grafana

2.生成随机密码命令

openssl rand -base64 6

3.启动命令

docker run --name=grafana \
--hostname=$(hostname) \
--user=grafana \
--env=GF_SECURITY_ADMIN_USER=admin \
--env=GF_SECURITY_ADMIN_PASSWORD=aME0YwCt \
--env=GF_PATHS_CONFIG=/etc/grafana/grafana.ini \
--env=GF_PATHS_DATA=/var/lib/grafana \
--env=GF_PATHS_HOME=/usr/share/grafana \
--env=GF_PATHS_LOGS=/var/log/grafana \
--env=GF_PATHS_PLUGINS=/var/lib/grafana/plugins \
--env=GF_PATHS_PROVISIONING=/etc/grafana/provisioning \
--volume=/etc/hosts:/etc/hosts \
--volume=/etc/localtime:/etc/localtime \
--volume=/opt/grafana/grafana.ini:/etc/grafana/grafana.ini \
--volume=/opt/grafana/grafana:/var/lib/grafana \
-p 3000:3000 \
--restart=unless-stopped \
--log-opt max-file=3 \
--log-opt max-size=512m \
--cpus 4 \
-itd \
grafana/grafana:10.1.2

4.用户名,密码

admin
aME0YwCt

5.配置调整

未调整,正常访问,后续有问题,进行调整配置项再填入

[paths]
[server]
root_url = https://grafana.xxxxxx.cn/
[server.custom_response_headers]
[database]
# 数据库打开的最大连接数。
max_open_conn = 100
# 仅适用于“sqlite3”。设置启用/禁用预写日志记录。默认值为false(禁用)。
wal = true
# 此设置仅适用于sqlite并控制数据库锁定时系统重试事务的次数。默认值为5。
transaction_retries = 5
[datasources]
[remote_cache]
[dataproxy]
[analytics]
# 关闭grafana向 stats.grafana.org 发送匿名统计,每24小时发送一次
reporting_enabled = false
[security]

2.HAproxy代理新增配置

/etc/haproxy/haproxy.cfg

frontend xxxxxx-front
        # 创建acl规则,基于主机头判断,以grafana.开头的域名命中,-i表示不区分大小写
        acl grafana hdr_beg(host) -i grafana.
        
        # 根据acl规则选择后端,符合grafana acl规则的请求,进入grafana-back后端
        use_backend grafana-back if grafana
        
# 创建grafana后端
backend grafana-back
        balance roundrobin
        cookie SRV insert indirect nocache
        option httpchk HEAD / HTTP/1.0

        server xxxxxx-node001 10.26.116.163:3000 check inter 2000 rise 3 fall 3

热加载

swift@xxxxxx:/etc/haproxy$ sudo service haproxy reload
 * Reloading haproxy haproxy                                                                                                                                                                [WARNING] 302/161132 (11733) : parsing [/etc/haproxy/haproxy.cfg:59] : 'cookie' ignored because frontend 'xxxxxx-front' has no backend capability.
[WARNING] 302/161132 (11735) : parsing [/etc/haproxy/haproxy.cfg:59] : 'cookie' ignored because frontend 'xxxxxx-front' has no backend capability.
                                                                                                                                                                                     [ OK ]

登录地址

http://grafana.xxxxxxxx.com/login

五.Grafana迁移,从001 -> 002

将Grafana 从001机器迁移到002机器,并更新Haproxy配置

1.关闭服务

docker stop grafana

2.打包数据文件

swift@xxxxxxxx001:/opt$ sudo tar -czvf grafana.tar.gz grafana/

3.传包

将grafana.tar.gz 传输到002的/opt/下,可以通过scp或者静态站点wget传输

4.解压

swift@xxxxxxxx002:/opt$ sudo tar -xzvf grafana.tar.gz

5.002启动

docker run --name=grafana \
--hostname=$(hostname) \
--user=grafana \
--env=GF_SECURITY_ADMIN_USER=admin \
--env=GF_SECURITY_ADMIN_PASSWORD=aME0YwCt \
--env=GF_PATHS_CONFIG=/etc/grafana/grafana.ini \
--env=GF_PATHS_DATA=/var/lib/grafana \
--env=GF_PATHS_HOME=/usr/share/grafana \
--env=GF_PATHS_LOGS=/var/log/grafana \
--env=GF_PATHS_PLUGINS=/var/lib/grafana/plugins \
--env=GF_PATHS_PROVISIONING=/etc/grafana/provisioning \
--volume=/etc/hosts:/etc/hosts \
--volume=/etc/localtime:/etc/localtime \
--volume=/opt/grafana/grafana.ini:/etc/grafana/grafana.ini \
--volume=/opt/grafana/grafana:/var/lib/grafana \
-p 3000:3000 \
--restart=unless-stopped \
--log-opt max-file=3 \
--log-opt max-size=512m \
--cpus 4 \
-itd \
grafana/grafana:10.1.2

6.调整gateway中haproxy配置

        server xxxxxx-node002 192.168.1.100:3000 check inter 2000 rise 3 fall 3

7.热加载haproxy配置

sudo service haproxy reload

8.测试能否正常访问,用户是否存在,面板数据是否存在

可以正常使用

9.删除临时打包文件,删除旧容器

docker rm -f grafana
rm -rf /opt/grafana.tar.gz

六.插件

1.图像渲染器

Grafana 后端插件,使用无头浏览器 (Chromium) 将渲染面板和仪表板处理为 PNG。

内存要求

渲染图像需要大量内存,主要是因为 Grafana 在后台创建浏览器实例以进行实际渲染。我们建议系统渲染图像至少有 16GB 的可用内存。

并行渲染多个图像需要更大的内存占用。您可以使用远程渲染服务在远程系统上渲染图像,因此您的本地系统资源不会受到影响。

插件安装

您可以使用 Grafana CLI(推荐方式)或使用 Grafana Docker 映像安装该插件。

Grafana CLI(推荐)

grafana-cli plugins install grafana-image-renderer

七.备份

1.备份配置文件

将您可能在 Grafana 部署中修改的 Grafana 配置文件复制到备份目录。

Grafana 配置文件位于以下目录中:

  • 默认配置:$WORKING_DIR/conf/defaults.ini
  • 自定义配置:$WORKING_DIR/conf/custom.ini
注意:如果您使用debrpm软件包安装 Grafana,则您的配置文件位于 /etc/grafana/grafana.ini. 该路径是在 Grafanainit.d脚本中使用--config文件参数指定的。

2.备份数据

默认目录:/var/lib/grafana

插件目录也在其中

标签: Grafana

添加新评论