Prometheus升级指南

介绍

Prometheus是一个基于Metrics的监控系统 ,与Kubernetes同属CNCF(Cloud Native Computing Foundation),它已经成为炙手可热的Kubernetes生态圈中的核心监控系统,越来越多的项目(如Kubernetes和etcd等 )都加入了丰富的Prom原生支持,从侧面体现了社区对它的认可。 Prometheus 2.0带来了许多变化和改进,例如新的时间序列数据库,更好的资源使用,新的警报配置格式以及更好的Alertmanager发现。

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

Prometheus 2使用新的警报规则,因此您将使用Alertmanager吧现有的警报规则更新为新格式。本教程仅介绍最重要的更改。在升级到最新版本之前,您应该阅读Announcing Prometheus 2.0以确保您不受任何其他更改的影响。

准备

要学习本教程,您需要:

  • 你应该先购买一台服Ubuntu服务器,我建议您使用腾讯云免费开发者专属在线实验平台进行试验。
  • 需要Prometheus 1.x安装在您的服务器上,包括Prometheus Web UI。您可以通过运行prometheus -version命令查看您的Prometheus版本。输出包含您的Prometheus版本以及构建信息。

本教程假设:

  • 您已经创建了一个 prometheus用户。
  • 您已创建了保存Prometheus配置文件的目录/etc/prometheus
  • 您已创建保存Prometheus数据的目录/var/lib/prometheus
  • 在prometheus和promtool可执行文件位于/usr/local/bin
  • 您已将Prometheus配置为作为系统服务运行。

第1步 - 将Prometheus升级到1.8.2

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

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

prometheus -version
prometheus, 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页面上找到Prometheus的1.8.2版本及MO5校验码。你需要一个名为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
prometheus-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 - 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 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.0。为此,我们将附加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=/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,状态等:

● 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 2.0并使用Prometheus 1.8.2访问我们的旧数据。

第3步 - 配置Prometheus 2.0

在此步骤中,我们将配置Prometheus 2.0以使用输出,并将Prometheus 1.8.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

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

Prometheus configuration file - /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, 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

这将从提供的文件中生成一个名为ile-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命令不再存在。相反,Prometheus2.0引入了Alertmanager Service Discovery,它带来了许多新功能,并与Kubernetes等服务更好地集成。如果您不使用Alertmanager,请跳过此步骤的其余部分。

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

sudo nano /etc/prometheus/prometheus.yml

以下alerting指令指示Prometheus使用在腾讯云CVM9093端口上运行的Alertmanager。您可以在文件中的任何位置添加以下内容:

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服务发现,被上一步骤所取代。

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使用prometheus.yml目录中的/etc/prometheus文件。我们将使用--storage.tsdb.path来替代--storage.local.path。此外,我们添加了两个--web标志,因此我们可以访问内置的Web模板。

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

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

sudo systemctl daemon-reload

然后启动Prometheus:

sudo systemctl start prometheus

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

sudo systemctl status prometheus
● 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

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

第6步 - 测试Prometheus

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

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

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

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

接下来,再次单击“ 状态”链接,然后单击“目标”按钮以检查导出器是否按预期运行。该网页包含有关您的导出程序的详细信息,包括它们是否已启动并正在运行。

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

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

在“表达式”字段中,键入node_memory_MemAvailable/1024/1024以获取服务器的可用内存(以兆字节为单位)。单击“执行”按钮。

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

单击Graph选项卡可以随时查看可用内存。在图表上,您应该看到以前的数据和最新数据。

如果您没有看到旧数据,请通过检查其服务状态来确保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 - 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所包含的所有更改的更多信息。我们更推荐您使用专业的容器实例服务 CIS,体验便捷、安全、经济、灵活、兼容 Kubernetes 的全托管容器服务 。使用 CIS 可以极大降低您部署容器的门槛,降低您执行 batch 型任务或处理业务突增的成本。


参考文献:《How To Upgrade Prometheus 1.x to Prometheus 2.0 On Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

Consul+Prometheus系统监控之注册发现

缘起 前面几篇文章分别对系统服务、MySql以及Redis相关软件做了监控预警,但是大家有没有发现,在prometheus.yml里配置需要监听的服务时,我们需...

2.9K6
来自专栏北京马哥教育

10个方法助你轻松完成Linux系统恢复

在Linux中有一些应用程序可以帮助你保存系统快照。大多数应用程序都是针对于新手的,并不需要高级的Linux操作技巧。我们在这里挑选了10个,你可以从中选择适合...

5375
来自专栏Java技术分享

如何用redis/memcache做Mysql缓存层?

目前公司的一个项目,数据库用的是Mysql,正在考虑用redis/memcached做数据库的缓存层,目前的想法就是在读DB前,先读缓存层,如果有直接返回,如果...

32910
来自专栏FreeBuf

一种新型的Web缓存欺骗攻击技术

为了减少WEB响应时延并减小WEB服务器负担,现在WEB缓存技术已经用的非常普遍了,除了专门的CDN,负载均衡以及反向代理现在也会缓存一部分的网页内容。这里我要...

1294
来自专栏未闻Code

从Workflowy到印象笔记

Workflowy是一个极简风格的大纲写作工具,使用它提供的无限层级缩进和各种快捷键,可以非常方便的理清思路,写出一个好看而实用的大纲。如下图所示。

2142
来自专栏Java技术分享

如何用redis/memcache做Mysql缓存层?

目前公司的一个项目,数据库用的是Mysql,正在考虑用redis/memcached做数据库的缓存层,目前的想法就是在读DB前,先读缓存层,如果有直接返回,如果...

4459
来自专栏未闻Code

从Workflowy到印象笔记

Workflowy是一个极简风格的大纲写作工具,使用它提供的无限层级缩进和各种快捷键,可以非常方便的理清思路,写出一个好看而实用的大纲。如下图所示。

1281
来自专栏Java架构沉思录

Zookeeper总览

ZooKeeper是一款开源的 分布式应用 的 分布式协调服务 。它包含一个简单的 原语集 ,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zoo...

1871
来自专栏程序猿DD

使用Consul做服务发现的若干姿势

来源:http://blog.bossma.cn/consul/consul-service-register-and-discovery-style/?hms...

8004
来自专栏涤生的博客

服务框架之注册中心,你不知道的内幕

前一篇服务框架技术栈粗略分析了服务框架需要的各个核心模块,首先提到的就是注册中心,注册中心实现了服务注册和发现的功能,在服务框架中也发挥着重要的作用。今天主要围...

1232

扫码关注云+社区

领取腾讯云代金券