集群指标

了解监控 Keycloak 节点之间通信的指标。

这是 使用指标进行故障排除 指南的一部分。

前提条件

  • 需要为 Keycloak 启用指标。请遵循 使用指标获取洞察力 指南了解更多详情。

  • 一个收集指标的监控系统。

指标

部署多个 Keycloak 节点可以实现负载在它们之间进行分配,但这需要节点之间的通信。本节介绍的指标可用于监控 Keycloak 之间的通信,以便识别可能的故障。

这仅适用于单站点部署。当使用多站点时,如 多站点部署 中所述,Keycloak 节点不会集群在一起,因此它们之间没有直接通信。

全局标签

cluster=<name>

集群名称。如果正在收集来自多个集群的指标,则此标签有助于识别它们所属的集群。

node=<node>

报告指标的节点名称。

所有以 vendor_jgroups_ 为前缀的指标名称仅用于故障排除和调试目的。指标名称可能会在 Keycloak 的未来版本中更改,恕不另行通知。因此,我们建议不要在仪表板或监控和警报中使用它们。

响应时间

以下指标公开了远程请求的响应时间。响应时间是在两个节点之间测量的,包括处理时间。所有请求都通过这些指标进行测量,并且在集群生命周期中,响应时间应保持稳定。

在健康的集群中,响应时间将保持稳定。响应时间增加可能表明集群性能下降或节点负载过重。

标签

node=<node>

它标识发送方节点。

target_node=<node>

它标识接收方节点。

指标 描述

vendor_jgroups_stats_sync_requests_seconds_count

到接收方节点的同步请求数。

vendor_jgroups_stats_sync_requests_seconds_sum

到接收方节点的同步请求的总持续时间

当启用直方图时,可以使用百分位桶。这些桶对于创建热图很有用,但是,收集和公开百分位桶可能会对部署性能产生负面影响。

带宽

Keycloak 接收和发送的所有字节都由这些指标收集。此外,所有内部消息(如心跳)也被计算在内。它们允许计算每个节点当前使用的带宽。

指标名称取决于正在使用的 JGroups 传输协议。
指标 协议 描述

vendor_jgroups_tcp_get_num_bytes_received

TCP

节点接收的总字节数。

vendor_jgroups_udp_get_num_bytes_received

UDP

vendor_jgroups_tunnel_get_num_bytes_received

TUNNEL

vendor_jgroups_tcp_get_num_bytes_sent

TCP

节点发送的总字节数。

vendor_jgroups_tunnel_get_num_bytes_sent

UDP

vendor_jgroups_tunnel_get_num_bytes_sent

TUNNEL

线程池

监控线程池大小是一个很好的指标,表明节点负载过重。所有接收到的请求都添加到线程池中进行处理,当线程池满时,请求将被丢弃。重传机制确保了可靠的通信,但会增加资源使用量。

在健康的集群中,线程池永远不应接近其最大大小(默认情况下为 200 个线程)。
线程池指标不适用于虚拟线程。当使用 OpenJDK 21 运行时,默认启用虚拟线程。
指标名称取决于正在使用的 JGroups 传输协议。默认传输协议是 TCP。
指标 协议 描述

vendor_jgroups_tcp_get_thread_pool_size

TCP

线程池中当前的线程数。

vendor_jgroups_udp_get_thread_pool_size

UDP

vendor_jgroups_tunnel_get_thread_pool_size

TUNNEL

vendor_jgroups_tcp_get_largest_size

TCP

池中曾经同时存在的最大线程数。

vendor_jgroups_udp_get_largest_size

UDP

vendor_jgroups_tunnel_get_largest_size

TUNNEL

流控制

流控制负责随着时间的推移将消息发送者的速率调整为最慢接收者的速率。这是通过基于信用的系统实现的,其中每个发送者在发送时都会减少其信用。当信用降至 0 以下时,发送者会阻塞,并且仅在收到来自接收者的补充消息时才恢复发送消息。

以下指标显示了阻塞消息的数量和平均阻塞时间。当值不为零时,可能表示接收方过载并可能降低集群性能。

每个节点都有两个独立的流控制协议,UFC 用于单播消息,MFC 用于多播消息。

健康的集群在所有指标中都显示零值。
指标 描述

vendor_jgroups_ufc_get_number_of_blockings

流控制阻塞发送者发送单播消息的次数。

vendor_jgroups_ufc_get_average_time_blocked

尝试发送单播消息时,流控制中平均阻塞时间(以毫秒为单位)。

vendor_jgroups_mfc_get_number_of_blockings

流控制阻塞发送者发送多播消息的次数。

vendor_jgroups_mfc_get_average_time_blocked

尝试发送多播消息时,流控制中平均阻塞时间(以毫秒为单位)。

重传

JGroups 提供可靠的消息传递。当消息在网络上丢失或接收者无法处理消息时,需要进行重传。重传会增加资源使用量,通常是系统过载的信号。

随机早期丢弃 (RED) 监控发送者队列。当队列几乎满时,消息将被丢弃,并且必须发生重传。它可以防止线程被满的发送者队列阻塞。

健康的集群在所有指标中都显示零值。
指标 描述

vendor_jgroups_unicast3_get_num_xmits

重传消息的数量。

vendor_jgroups_red_get_dropped_messages

发送者丢弃的消息总数。

vendor_jgroups_red_get_drop_rate

发送者丢弃的所有消息的百分比。

网络分区

集群大小

集群大小指标报告集群中存在的节点数。如果它不同,则可能表示节点正在加入、关闭,或者在最坏的情况下,正在发生网络分区。

健康的集群在所有节点中都显示相同的值。
指标 描述

vendor_cluster_size

集群中的节点数。

网络分区事件

集群中的网络分区可能由于多种原因而发生。此指标不能帮助预测网络分裂,但会发出已发生分裂并且集群已合并的信号。

健康的集群在此指标中显示零值。
指标 描述

vendor_jgroups_merge3_get_num_merge_events

检测和修复网络分裂的次数。

本页内容