Etcd-Etcd快速入门及PromQL查询etcd指标
Prometheus-Prometheus-Opterator中添加监控etcd集群
PS 参考博文 :一文带你快速入门etcd(万字长文)
目录
一、Etcd快速入门
1.1、 etcd 介绍
- 2013 年 6 月,CoreOS 发起了 etcd 项目。etcd 使用 Go 语言实现,是分布式系统中重要的基础组件,目前最新版本为 V3.4.9。etcd 可以用来构建高可用的分布式键值数据库,根据官网介绍,总结来说有如下的特点:
- 简单:etcd 的安装简单,且为用户提供了 HTTP API,用户使用起来也很简单
- 存储:etcd 的基本功能,数据分层存储在文件目录中,类似于我们日常使用的文件系统
- Watch 机制:Watch 指定的键、前缀目录的更改,并对更改时间进行通知
- 安全通信:SSL 证书验证
- 高性能:etcd 单实例可以支持 2k/s 读操作,官方也有提供基准测试脚本
- 一致可靠:基于 Raft 共识算法,实现分布式系统数据的高可用性、一致性
- etcd 是一个分布式键值存储数据库,支持跨平台,拥有强大的社区。etcd 的 Raft 算法,提供了可靠的方式存储分布式集群涉及的数据。etcd 广泛应用在微服务架构和 Kubernates 集群中,不仅可以作为服务注册与发现,还可以作为键值对存储的中间件。从业务系统 Web 到 Kubernetes 集群,都可以很方便地从 etcd 中读取、写入数据。
二、etcd 应用场景
- etcd 在稳定性、可靠性和可伸缩性表现极佳,同时也为云原生应用系统提供了协调机制。etcd 经常用于服务注册与发现的场景,此外还有键值对存储、消息发布与订阅、分布式锁等场景。
2.1、 键值对存储
- 如下是官方对 etcd 的描述:
A highly-available key value store for shared configuration and service discovery.
一个用于配置共享和服务发现的键值存储系统。
- 从其定义来看,etcd 是一个「键值存储」的组件,存储是 etcd 最基本的功能,其他应用场景都是建立在 etcd 的可靠存储上。etcd 的存储有如下特点:
- 采用键值对数据存储,读写性能一般高于关系型数据库;
- etcd 集群分布式存储,多节点集群更加可靠;
- etcd 的存储采用类似文件目录的结构:
- 叶子节点存储数据,其他节点不存储,这些数据相当于文件;
- 非叶节点一定是目录,这些节点不能存储数据。
- 比如 Kubernetes 将一些元数据存储在 etcd 中,将存储状态数据的的复杂工作交给 etcd,Kubernetes 自身的功能和架构能够更加专注。
2.2、服务注册与发现
- 分布式环境中,业务服务多实例部署,这个时候涉及到服务之间调用,就不能简单使用硬编码的方式指定服务实例信息。服务注册与发现就是解决如何找到分布式集群中的某一个服务(进程),并与之建立联系。
- 服务注册与发现涉及三个主要的角色:服务请求者、服务提供者和服务注册中心。
- 服务提供者启动的时候,在服务注册中心进行注册自己的服务名、主机地址、端口等信息;服务请求者需要调用对应的服务时,一般通过服务名请求服务注册中心,服务注册中心返回对应的实例地址和端口;服务请求者获取到实例地址、端口之后,绑定对应的服务提供者,实现远程调用。
- etcd 基于 Raft 算法,能够有力地保证分布式场景中的一致性。各个服务启动时注册到 etcd 上,同时为这些服务配置键的 TTL 时间,定时保持服务的心跳以达到监控健康状态的效果。通过在 etcd 指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个 Proxy 模式的 etcd,这样就可以确保访问 etcd 集群的服务都能够互相连接。
2.3、消息发布与订阅
- 在分布式系统中,服务之间还可以通过消息通信,即消息的发布与订阅。通过构建一个消息中间件,服务提供者发布对应主题的消息,而消费者则订阅他们关心的主题,一旦对应的主题有消息发布,即会产生订阅事件,消息中间件就会通知该主题所有的订阅者。
- 如微服务架构中的认证鉴权服务,Auth 服务的实例地址、端口和实例节点的状态存放在 etcd 中,客户端应用订阅对应的主题,而 etcd 设置 key TTL 可以确保存储的服务实例的健康状态。
2.4、分布式锁
- 分布式系统中涉及到多个服务实例,存在跨进程之间资源调用,对于资源的协调分配,单体架构中的锁已经无法满足需要,需要引入分布式锁的概念。分布式锁可以将资源标记存储,这里的存储不是单纯属于某个进程,而是公共存储,诸如 Redis、Memcache、关系型数据库、文件等。
- etcd 基于 Raft 算法,实现分布式集群的一致性,存储到 etcd 集群中的值必然是全局一致的,因此基于 etcd 很容易实现分布式锁。分布式锁有两种使用方式:保持独占和控制时序。
- 保持独占,从字面可以知道,所有获取资源的请求,只有一个成功。etcd 通过分布式锁原子操作 CAS 的 API,设置 prevExist 值,从而保证在多个节点同时去创建某个目录时,最后只有一个成功,创建成功的请求获取到锁。
- 控制时序,有点类似于队列缓冲,所有的请求都会被安排分配资源,但是获得锁的顺序也是全局唯一的,执行按照先后的顺序。etcd 提供了一套自动创建有序键的 API,对一个目录的建值操作,这样 etcd 会自动生成一个当前最大的值为键,并存储该值。同时还可以使用 API 按顺序列出当前目录下的所有键值。
三、PromQL查询etcd指标
3.1、etcd 节点可用性
运行节点的数
sum(up{job="etcd"})
检查节点是否有leader,指标为1 ,表示正常
max(etcd_server_has_leader)
Etcd 的leader角色变化
- Leader也会变化,但是过于频繁的变化可能影响etcd本身的性能。这可能是一个信号:由于连接问题leader变得不稳定,或者etcd 负载过重
changes(etcd_server_leader_changes_seen_total[1d])
3.2、请求情况
etcd gRPC 平均每分钟调用失败率
max(sum(rate(grpc_server_handled_total{grpc_type="unary",grpc_code!="OK"}[1m])) by (grpc_service) / sum(rate(grpc_server_started_total{grpc_type="unary"}[1m])) by (grpc_service) * 100.0)
raft协议的请求(提案):
- 指标有四个不同类型:committed、applied、pending和failed。以上四种可以提供etcd可能面临的问题的信息,其中最重要的是failed这个状态,如果是failed,则可能有两个原因:或是leader选举失败,或者失去法定节点数。
rate(etcd_server_proposals_failed_total{job=~"etcd"}[15m])
etcd_server_proposals_committed_total :已落实共识提案的总数
etcd_server_proposals_applied_total :已应用的共识提案总数
(etcd_server_proposals_committed_total - etcd_server_proposals_applied_total) >= 1000
etcd_server_proposals_pending :前正在处理的请求(提交会议讨论决定的建议) 数量
etcd_server_proposals_failed_total :失败提案总数
3.3、API Server对etcd 的读写缓存
缓存中的元素数
etcd_helper_cache_entry_count
缓存命中计数
etcd_helper_cache_hit_count
缓存未命中计数
etcd_helper_cache_miss_count
3.4、网络相关
grpc_server_started_total grpc :(高性能、开源的通用RPC(远程过程调用)框架)服务器启动总数
etcd_network_client_grpc_received_bytes_total :接收到grpc客户端的字节总数
etcd_network_client_grpc_sent_bytes_total :发送给grpc客户端的字节总数
etcd_network_peer_received_bytes_total etcd :网络对等方接收的字节总数(对等网络,即对等计算机网络,是一种在对等者(Peer)之间分配任务和工作负载的分布式应用架构,是对等计算模型在应用层形成的一种组网或网络形式)
etcd_network_peer_sent_bytes_total etcd :网络对等方发送的字节总数
3.5、磁盘操作状态
etcd_disk_backend_commit_duration_seconds_sum etcd :磁盘后端提交持续时间秒数总和
etcd_disk_backend_commit_duration_seconds_bucket etcd :磁盘后端提交持续时间
3.6、文件
process_open_fds{service="etcd-k8s"} :打开文件描述符的数量
process_max_fds{service="etcd-k8s"} :打开文件描述符的最大数量
etcd_disk_wal_fsync_duration_seconds_sum Wal :(预写日志系统)调用的fsync(将文件数据同步到硬盘)的延迟分布
etcd_disk_wal_fsync_duration_seconds_bucket :后端调用的提交的延迟分布
3.7、快照
etcd快照保存用时
etcd_debugging_snap_save_total_duration_seconds_sum
向往的地方很远,喜欢的东西很贵,这就是我努力的目标。