博客/社区

引导一个云范围本机多数据中心的可观测性堆栈

2022年2月10日7分钟

布拉姆Vogelaar DevOps云工程师工厂最近,他发表了介绍可观测性Grafana实验室的EMEA聚会中说话bob电竞频道

当我跟客户,他们会告诉我关于他们的应用程序在两个数据中心运行,但当我们进一步调查,事实证明,他们的可观测性堆栈是仅可在其中之一。

了接近去年3月回家。欧洲最大的云服务提供商OVHcloud有经验一个巨大的火在它的一个数据中心,造成一个巨大的故障在法国政府等知名客户。

事件发生后的第二天,我的同事负责质量管理问我如果我们能生存一个类似的灾难。这引发我看看单可观测性堆栈演变成一个跨多个数据中心的高可用性。

值得庆幸的是我们使用的工具等Grafana节奏为跟踪和Grafana洛基为日志能够复制在microservices设置。但是我们可以在多个数据中心中运行多个实例吗?和我们在一个地方,我们可能会失去一个组件或整个校园“轻松”?(即。,我们仍然有能力在我们的应用程序查看发生了什么?)

在最近的一次Grafanbob电竞频道a实验室EMEA聚会,我穿过云范围本机多数据中心的可观测性堆栈我们部署上面所有的问题的答案是“是的!”

下面是一个崩溃的过程。

介绍高

我的可观测性堆栈和介绍了进化领事,一个开源服务发现工具和一个内置的键值存储和服务网格工具HashiCorp建造和维护的。

我们可以宣布服务到领事通过定义Grafana领事服务在接下来的JSON团:

{"服务":{“检查”:[{“http”:“http://localhost: 3000”,“时间间隔”:“10”}],“id”:“grafana”、“名称”:“grafana”、“港”:3000年,“标签”(“标准”)}}

它将使领事检查的健康服务通过发送一个http请求发送到本地主机和宣布当健康服务的平台。一旦配置完成,我们可以查询领事像其他DNS服务器要求您的服务的下落。

挖@127.0.0.1 - p 8600 grafana.service。领事任何

你甚至可以领事合并到你的数据中心的绑定或飘散的DNS服务器。

连接高集群

领事可以意识到通过联合集群具有数据中心,但它总是使用本地数据中心集群的数据键值存储和查询服务。在我们的例子中,我们有两个数据中心——简单地称为DC1和DC2相连。

当连接时,领事集群相互了解,但一个DNS查询不会自动从一个集群。我们需要准备查询,可由发布以下JSON blob领事服务器使用curl。

curl http://127.0.0.1:8500 / v1 /查询请求后,数据@ - < < EOF{“名称”:“grafana”,“服务”:{“服务”:“grafana”“故障转移”:{“数据中心”:[" dc2 "]}}} EOF

上述准备查询称为“grafana”将设立两个集群,这样在DC1失败情况下,DNS请求转发到DC2。在DC2 Grafana服务,我们建立了相反的查询。在这两种场景中,如果有一个中断服务,它会自动故障转移到另一边,没有人察觉到,除了短暂的时间流逝的领事需要解决,你的服务在你的本地数据中心。

连接Grafana实例

现在我需要一些方法有两个Grafana实例相互通信。Grafana有三个数据库后端:SQLite, PostgreSQL和MySQL。SQLite是一个数据库,使用本地磁盘上的文件,显然没有规模。PostgreSQL没有开源主要复制所以总是会有一个主要数据中心和二级数据中心数据的落后。所以我选择的数据库MySQL主要的复制。Grafana将总是写本地MySQL,然后复制到其他实例,反之亦然。

接下来是Grafana更新数据源。而不是直接指向那些向你当地的洛基或普罗米修斯,你可以很容易地使用DNS条目创建查询为每个数据源(例如,loki.query。高:3100而不是192.168.43.40:3100)

连接普罗米修斯

我们应该如何实现高可用性普罗米修斯吗?我们做联盟?我们读过两次吗?我们写两次吗?

对于这个方案,我提出以下几点:普罗米修斯,方便,有一个内置的领事服务发现选项。所以有一长串的目标刮,我改变了DC1配置它使用本地集群领事发现所有服务在DC1宣布有标记“指标”和那些将刮。因此,在领事的一切正确的标签是自动刮到普罗米修斯和从那里你可以建立你的仪表盘。DC2,我们将配置复制和替换DC1 DC2。

- job_name: DC1 scrape_interval: 10年代consul_sd_configs: -服务器:localhost: 8500数据中心:DC1标签:-指标job_name: DC2…

连接Grafana洛基

Grafana洛基的解决方案很简单:您可以配置您的地方Promtail将你的日志两个端点。(注意:这里使用IP地址而不是查询,因为我要确定我写两遍。)

客户:url: https://192.168.43.40:3100洛基/ api / v1 /推- url: https://192.168.43.41:3100洛基/ api / v1 /推动

连接Grafana节奏

Grafana节奏是最具挑战性的工具配置。我们问了很多同样的问题在整个堆栈:发送两次?写两次?读过两次吗?

问题变成:我们引入一个代理吗?

这是在哪里Grafana代理配置有:

节奏:配置:名称:默认接收器:zipkin: