如何在Ubuntu16.04上将Prometheus1.x升级到Prometheus2.0

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 Diversity in Tech 基金来接收捐赠,作为 Write for DOnations 计划的一部分。

介绍

Prometheus 是一个开源监控系统,可从您的服务中收集指标。 Prometheus 2.0 带来了许多变化和改进,例如新的时间序列数据库、更好的资源使用、新的警报配置格式以及更好的 Alertmanager 发现。

在本教程中,您将现有的 Prometheus 1.x 安装升级到 Prometheus 2.0。 Prometheus 2.0 中新的时间序列数据库,称为 tsdb,与 Prometheus 1.x 不兼容,这意味着您无法使用 Prometheus 2 从 Prometheus 1.x 实例中读取数据。 为了解决这个限制,您需要将 Prometheus 1.x 配置为只读数据存储,以使您的旧数据可用。

Prometheus 2 使用新的警报规则格式,因此您需要将现有的警报规则更新为新格式并使用 Alertmanager。

最后,您将使用 Web UI 来确保 Prometheus 按预期工作。

本教程仅涵盖最重要的更改。 在升级到最新版本之前,您应该阅读 宣布 Prometheus 2.0 以确保您不受任何其他更改的影响。

先决条件

要遵循本教程,您需要:

  • 按照 使用 Ubuntu 16.04 的初始服务器设置教程 设置一台 Ubuntu 16.04 服务器,包括 sudo 非 root 用户和防火墙。
  • Prometheus 1.x 安装在您的服务器上,包括 Prometheus Web UI。 您可以通过运行 prometheus -version 命令找出您的 Prometheus 版本。 输出包含您的 Prometheus 版本以及构建信息。

本教程假设您的 Prometheus 安装有以下几点:

  • 您已经创建了一个 prometheus 用户。
  • 您已经创建了包含 Prometheus 配置文件的目录 /etc/prometheus
  • 您已经创建了保存 Prometheus 数据的目录 /var/lib/prometheus
  • prometheuspromtool 可执行文件位于 /usr/local/bin 中。
  • 您已将 Prometheus 配置为作为名为 prometheus 的 systemd 服务运行。

第 1 步 — 将 Prometheus 升级到 1.8.2

为了使用 Prometheus 2.0 访问您的旧数据,您需要将当前安装的 Prometheus 升级到版本 1.8.2,然后设置 Prometheus 2.0 以使用 remote_read 功能从旧版本读取.

使用 prometheus -version 命令,查看您当前的 Prometheus 版本。 输出包含版本和构建信息。 如果您已经在运行版本 1.8.2,请跳过此步骤。

prometheus -version
prometheus -version outputprometheus, version 1.7.1 (branch: master, revision: 3afb3fffa3a29c3de865e1172fb740442e9d0133)
  build user:       root@0aa1b7fc430d
  build date:       20170612-11:44:05
  go version:       go1.8.3

在你走得更远之前,停止 Prometheus 以便你可以替换它的文件:

sudo systemctl stop prometheus

您可以在项目的 GitHub Releases 页面上找到 Prometheus 1.8.2 以及校验和。 您需要一个名为 prometheus-1.8.2.linux-amd64.tar.gz 的文件。 使用以下 curl 命令,将 Prometheus 存档和校验和下载到您的主目录:

cd ~
curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/prometheus-1.8.2.linux-amd64.tar.gz
curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/sha256sums.txt

为确保您拥有真正未损坏的存档,请使用 sha256sum 命令为存档生成校验和,并将其与 sha256sums.txt 文件进行比较。

sha256sum -c sha256sums.txt 2>&1 | grep OK
Checksums checkprometheus-1.8.2.linux-amd64.tar.gz: OK

如果您在输出中没有看到 OK,请删除下载的存档并回溯上述步骤以再次下载。

现在,解压缩存档。

tar xvf prometheus-1.8.2.linux-amd64.tar.gz

prometheuspromtool 可执行文件复制到 /usr/local/bin 目录。

sudo cp prometheus-1.8.2.linux-amd64/prometheus /usr/local/bin
sudo cp prometheus-1.8.2.linux-amd64/promtool /usr/local/bin

将文件的用户和组所有权设置为 prometheus 用户。

sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

最后,启动 Prometheus 以确保它按预期工作。

sudo systemctl start prometheus

最后,检查服务的状态。

sudo systemctl status prometheus

您将看到以下输出:

Prometheus service status● prometheus.service - Prometheus
   Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-01-01 21:44:52 UTC; 2s ago
 Main PID: 1646 (prometheus)
    Tasks: 6
   Memory: 17.7M
      CPU: 333ms
   CGroup: /system.slice/prometheus.service
           └─1646 /usr/local/bin/prometheus -config.file /etc/prometheus/prometheus.yml -storage.local.path /var/lib/prometheus/
...

如果服务状态不是 active,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续教程。

验证 Prometheus 版本以确保您正在运行版本 1.8.2

prometheus -version
prometheus -version outputprometheus, version 1.8.2 (branch: HEAD, revision: 5211b96d4d1291c3dd1a569f711d3b301b635ecb)
  build user:       root@1412e937e4ad
  build date:       20171104-16:09:14
  go version:       go1.9.2

如果您没有看到 version 1.8.2,请确保您已下载正确的文件并重复本节中的步骤。

最后,删除您下载的文件,因为您不再需要它们。

rm -rf prometheus-1.8.2.linux-amd64.tar.gz prometheus-1.8.2.linux-amd64

接下来,您将重新配置现有安装,使其在安装后不会干扰 Prometheus 2.0。

第 2 步 — 将 Prometheus 1.8.2 配置为单独的服务

我们希望保留 Prometheus 1.8.2,以便我们可以访问旧数据,但我们需要确保我们的旧安装不会在安装 Prometheus 2 时干扰它。 为此,我们将 1 附加到所有与 Prometheus 相关的目录和可执行文件的名称。 例如,prometheus 可执行文件将变为 prometheus1。 我们还将更新服务定义并将其设置为在不同的端口上运行。

在继续之前,请停止 Prometheus,以便您可以重命名文件和目录。

sudo systemctl stop prometheus

/usr/local/bin 目录中,您会找到两个 Prometheus 可执行文件 - prometheuspromtool。 将它们分别重命名为 prometheus1promtool1

sudo mv /usr/local/bin/prometheus /usr/local/bin/prometheus1
sudo mv /usr/local/bin/promtool /usr/local/bin/promtool1

Prometheus 有两个关联的目录: /etc/prometheus 用于存储配置文件, /var/lib/prometheus 用于存储数据。 也重命名这些目录。

sudo mv /etc/prometheus /etc/prometheus1
sudo mv /var/lib/prometheus /var/lib/prometheus1

我们将 Prometheus 1.8.2 作为只读数据存储运行,因此我们不需要它来从导出器收集任何数据。 为确保这一点,我们将使用以下 truncate 命令从配置文件中删除所有内容。 在删除文件的内容之前,请创建文件的备份,以便您以后可以使用它来配置 Prometheus 2.0。

sudo cp /etc/prometheus1/prometheus.yml /etc/prometheus1/prometheus.yml.bak

然后用 truncate 清空配置文件的内容。

sudo truncate -s 0 /etc/prometheus1/prometheus.yml

接下来,将服务文件从 prometheus 重命名为 prometheus1

sudo mv /etc/systemd/system/prometheus.service /etc/systemd/system/prometheus1.service

在文本编辑器中打开 Prometheus 服务文件。

sudo nano /etc/systemd/system/prometheus1.service

您将在默认端口 9090 上运行 Prometheus 2.0,因此将 Prometheus 1.8.2 监听的端口更改为端口 9089。 将 ExecStart 指令替换为以下配置:

ExecStart - /etc/systemd/system/prometheus.service

...
ExecStart=/usr/local/bin/prometheus1 \
    -config.file /etc/prometheus1/prometheus.yml \
    -storage.local.path /var/lib/prometheus1/ \
    -web.listen-address ":9089"
...

保存文件并关闭文本编辑器。 重新加载 systemd 以应用更改。

sudo systemctl daemon-reload

启动 prometheus1 服务。

sudo systemctl start prometheus1

为确保它按预期工作,请检查服务的状态。

sudo systemctl status prometheus1

和之前一样,输出包含有关进程的信息,例如 PID、状态等:

Service status output● prometheus1.service - Prometheus
   Loaded: loaded (/etc/systemd/system/prometheus1.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-01-01 21:46:42 UTC; 3s ago
 Main PID: 1718 (prometheus1)
    Tasks: 6
   Memory: 35.7M
      CPU: 223ms
   CGroup: /system.slice/prometheus1.service
           └─1718 /usr/local/bin/prometheus1 -config.file /etc/prometheus1/prometheus.yml -storage.local.path /var/lib/prometheus1/
...

如果服务状态不是 active,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续教程。

启用该服务以确保它会在系统启动时启动。

sudo systemctl enable prometheus1

此时 Prometheus 1.8.2 不会抓取任何出口商。 一旦我们设置了 Prometheus 2.0,这将确保数据的一致性,它将使用当前安装作为旧数据的只读数据存储。 在下一步中,我们将安装 Prometheus 2.0 并使用 Prometheus 1.8.2 访问我们的旧数据。

第 3 步 — 配置 Prometheus 2.0

在这一步中,我们将配置 Prometheus 2.0 以抓取导出器并将 Prometheus 1.8.2 用作只读数据存储,以便我们可以访问现有数据。

在继续本教程之前,请按照 How To Install Prometheus on Ubuntu 16.04 教程的步骤 1 和 2 安装 Prometheus 2。

安装 Prometheus 后,创建一个新的配置文件。 配置文件格式没有改变,因此您可以将 Prometheus 1.x 配置文件与 Prometheus 2 一起使用。 将您在上一步中创建的现有 Prometheus 配置的备份复制到 /etc/prometheus/ 目录中。

sudo cp /etc/prometheus1/prometheus.yml.bak /etc/prometheus/prometheus.yml

将新创建的配置文件的用户和组所有权设置为 prometheus 用户。

sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml

您对该文件所做的唯一更改是告诉 Prometheus 2.0 使用 Prometheus 1.8.2 作为只读数据存储,以便您可以访问旧数据。 在文本编辑器中打开配置文件。

sudo nano /etc/prometheus/prometheus.yml

在配置文件的末尾,添加从远程 Prometheus 实例读取的 remote_read 指令。 告诉它从您的 Prometheus 1.8.2 实例 localhst:9089 中读取:

Prometheus 配置文件 - /etc/prometheus/prometheus.yml

...

remote_read:
    - url: http://localhost:9089/api/v1/read

完成后,保存文件并关闭文本编辑器。

在第一次运行 Prometheus 2.0 之前,我们将更新警报规则并配置 Alertmanager 以与 Prometheus 一起使用。 如果您不使用警报规则或 Alertmanager,请跳过下一步。

第 4 步 — 配置警报(可选)

Prometheus 1.x 警报规则是使用自定义语法定义的。 从 2.0 版开始,您可以使用 YAML 定义警报规则。 为了使迁移更容易,Prometheus 的 promtool 命令可以将旧规则文件转换为新格式。 如果您不使用警报规则,则可以跳过此步骤。

首先,将您拥有的所有规则从 /etc/prometheus1 目录复制到 /etc/prometheus 目录。

sudo cp /etc/prometheus1/*.rules /etc/prometheus/

此外,通过运行以下命令确保您拥有 promtool 2.0 版:

promtool --version

输出包含 promtool 版本和构建信息。

promtool --versionpromtool, version 2.0.0 (branch: HEAD, revision: 0a74f98628a0463dddc90528220c94de5032d1a0)
  build user:       root@615b82cb36b6
  build date:       20171108-07:11:59
  go version:       go1.9.2

如果版本不是 2.0,请确保将 promtool 可执行文件复制到正确的位置。

现在,导航到 /etc/prometheus 目录。

cd /etc/prometheus

为目录中的每个 .rules 文件运行以下 promtool 命令:

sudo promtool update rules file-name.rules

这会从提供的文件中生成一个名为 file-name.rules.yml 的新文件。 如果您在屏幕上看到任何错误消息,请按照屏幕上的日志解决问题,然后再继续本教程。

确保在 promtool 创建的文件上正确设置了用户和组所有权。

sudo chown prometheus:prometheus file-name.rules

最后,更新 Prometheus 配置文件以使用新创建的规则文件而不是旧规则文件。 在编辑器中打开配置文件。

sudo nano /etc/prometheus/prometheus.yml

.yml 后缀添加到 rule_files 指令下的每个条目,如下所示:

...
rule_files:
  - alert1.rules.yml
  - alert2.rules.yml
...

保存文件并退出编辑器。

现在删除不再需要的旧警报规则文件。

sudo rm alert1.rules alert2.rules

接下来,让我们配置 Prometheus 以发现 Alertmanager。 -alertmanager.url 标志不再存在。 取而代之的是,Prometheus 2.0 引入了 Alertmanager Service Discovery,它带来了许多新功能,并与 Kubernetes 等服务更好地集成。 如果您不使用 Alertmanager,请跳过此步骤的其余部分。

再次在编辑器中打开 prometheus.yml 文件:

sudo nano /etc/prometheus/prometheus.yml

以下 alerting 指令指示 Prometheus 使用在 Droplet 的端口 :9093 上运行的 Alertmanager。 您可以在文件的任意位置添加以下内容:

/etc/prometheus/prometheus.yml

global:
...

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - alertmanager:9093
      
rule_files:
...

保存文件并关闭文本编辑器。

Prometheus 现在可以使用警报规则并与 Alertmanager 通信,我们已准备好首次运行它。

第 5 步 — 运行 Prometheus 2.0

为了能够将 Prometheus 2.0 作为服务运行,我们需要创建一个服务文件。 我们可以从我们用于 Prometheus 1.8.2 的服务文件开始,因为除了 ExecStart 命令之外,它几乎相同。

通过复制现有的服务文件创建一个新的服务文件:

sudo cp /etc/systemd/system/prometheus1.service /etc/systemd/system/prometheus.service

在编辑器中打开新创建的服务文件:

sudo nano /etc/systemd/system/prometheus.service

Prometheus 2.0 在标志系统中带来了几个重要的变化,包括:

  • 标志现在使用双破折号 (--) 而不是单破折号作为前缀。
  • 所有 -storage.local-storage.remote 标志已被移除并替换为 --storage.tsdb 标志。
  • -alertmanager.url 已被移除并替换为 Alertmanager Service Discovery,这在上一步中有介绍。

ExecStart 指令替换为以下指令:

ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries

--config.file 指令指示 Prometheus 使用 /etc/prometheus 目录中的 prometheus.yml 文件。 我们将使用 --storage.tsdb.path 而不是 --storage.local.path。 此外,我们添加了两个 --web. 标志,因此我们可以访问内置的 Web 模板。

完成后,保存文件并关闭文本编辑器。

最后,重新加载 systemd,以便您可以使用新创建的服务。

sudo systemctl daemon-reload

然后启动普罗米修斯:

sudo systemctl start prometheus

检查服务的状态以确保它按预期工作。

sudo systemctl status prometheus
Prometheus service status● prometheus.service - Prometheus
    Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
    Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
  Main PID: 1947 (prometheus)
    Tasks: 7
    Memory: 54.3M
      CPU: 15.626s
    CGroup: /system.slice/prometheus.service
            └─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...

如果服务状态不是 active,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续教程。

既然您知道该服务可以工作,请使其在系统启动时启动:

sudo systemctl enable prometheus

您可以通过在 Web 浏览器中导航到 http://your_server_ip 并使用您在安装 Prometheus 时配置的凭据进行身份验证来访问 Prometheus 的 Web UI。 您将在下一步中使用 Web UI 来确保 Prometheus 按预期工作。

第 6 步 — 测试 Prometheus

让我们确保 Prometheus 2 按预期抓取所有导出器,并确保它可以访问之前安装的 Prometheus 的数据。

在 Web 浏览器中导航到 http://your_server_ip 以访问 Prometheus Web UI。 系统会要求您输入最初安装 Prometheus 时配置的用户名和密码。

输入凭据后,您将看到 Graph 页面,您可以在其中执行和可视化查询:

在执行查询之前,让我们检查一下 Prometheus 的版本和导出器状态。 点击地位导航栏中的链接,然后单击运行时和构建信息按钮。 您将看到包含有关 Prometheus 服务器信息的页面。

接下来,再次单击 Status 链接,然后单击 Targets 按钮以检查您的导出器是否按预期运行。 该网页包含有关您的出口商的详细信息,包括它们是否已启动和运行。

如果您看到任何错误,请确保在继续本教程之前按照屏幕上的说明进行解决。

您不会看到 Prometheus 1.8.2 数据源,因为它被用作数据存储而不是导出器。 因此,让我们确保我们可以访问旧数据和新数据。 单击 图形 按钮。

Expression 字段中,键入 node_memory_MemAvailable/1024/1024 以获取服务器的可用内存(以 MB 为单位)。 单击 执行 按钮。

您将看到屏幕上显示的结果:

单击 Graph 选项卡以可视化一段时间内的可用内存。 在图表上,您应该会看到以前的数据,在 Prometheus 不工作时休息一下后,您会看到最新的数据。

如果您没有看到旧数据,请通过检查其服务状态来确保 Prometheus 1.8.2 已启动,并且您已将 Prometheus 2.0 配置为将其用作远程数据库。

您已验证 Prometheus 正在正常工作并正确报告数据。 现在让我们看看如何删除 Prometheus 1.8.2 和不再使用的旧数据。

第 7 步 — 删除旧数据(可选)

一旦不再需要 Prometheus 1.8.2 和旧数据,您可能希望删除它。 请按照以下步骤清理所有内容。

警告:这是不可逆的操作! 一旦你删除了旧数据,除非你备份它,否则你将永远无法恢复它。


首先,从 Prometheus 2 配置文件中删除 remote_read 指令。 在编辑器中打开 Prometheus 2.0 配置文件:

sudo nano /etc/prometheus/prometheus.yml

找到并删除应该位于文件末尾的 remote_read 指令:

remote_read:
    - url: http://localhost:9089/api/v1/read

保存文件并关闭文本编辑器。 重新启动 Prometheus 以应用更改。

sudo systemctl restart prometheus

确保服务正常运行:

sudo systemctl status prometheus
Prometheus service status● prometheus.service - Prometheus
   Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
 Main PID: 1947 (prometheus)
    Tasks: 7
   Memory: 54.3M
      CPU: 15.626s
   CGroup: /system.slice/prometheus.service
           └─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...

如果服务状态不是 active,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续教程。

接下来,禁用并移除prometheus1服务,然后清理所有Prometheus 1.8.2相关目录和文件。

禁用该服务以确保它不会自动启动:

sudo systemctl disable prometheus1

然后停止服务:

sudo systemctl stop prometheus1

无输出表示操作成功完成。

现在删除 prometheus1 服务文件:

sudo rm /etc/systemd/system/prometheus1.service

最后,删除不再需要的剩余文件。 首先,删除位于 /usr/local/bin 目录中的 prometheus1promtool1 可执行文件。

sudo rm /usr/local/bin/prometheus1 /usr/local/bin/promtool1

然后删除用于存储数据和配置的 /etc/prometheus1/var/lib/prometheus1 目录。

sudo rm -r /etc/prometheus1 /var/lib/prometheus1

Prometheus 1.8.2 现在已从您的系统中删除,您的旧数据已不复存在。

结论

在本教程中,您将 Prometheus 1.x 升级到 Prometheus 2.0,更新了所有规则文件,并将 Prometheus 配置为发现 Alertmanager(如果存在)。

通过阅读官方 宣布 Prometheus 2.0 帖子和 项目的变更日志 ,了解有关 Prometheus 2.0 包含的所有更改的更多信息。