查找故障节点
解决 Cassandra 问题的第一步是使用错误消息、指标和监控信息来确定问题是出在客户端还是服务器上,如果问题出在服务器上,则找到 Cassandra 集群中出现问题的节点。目标是确定这是一个系统性问题(例如,影响整个集群的查询模式)还是仅限于节点子集(例如,持有共享令牌范围的邻居,甚至单个硬件出现故障的节点)。
有很多信息来源可以帮助确定问题所在。下面列出了一些最常见的信息来源。
客户端日志和错误
集群的客户端通常会留下最好的面包屑线索。也许某个特定数据中心的客户端延迟或错误率有所增加(可能排除了其他数据中心的节点),或者客户端正在接收特定类型的错误代码,表明存在特定类型的问题。故障排除人员通常只需阅读错误消息就可以排除许多故障模式。实际上,许多 Cassandra 错误消息都包含最后联系的协调器,以帮助操作员找到要从哪里开始的节点。
一些常见错误(假设客户端具有与 Datastax drivers <client-drivers>
相似的错误名称)可能导致的罪魁祸首(括号内)。
-
SyntaxError
(客户端)。这和其他QueryValidationException
表明客户端发送了格式错误的请求。这些很少是服务器问题,通常表明查询错误。 -
UnavailableException
(服务器):这意味着 Cassandra 协调器节点已拒绝查询,因为它认为可用的副本节点数量不足。如果许多协调器都抛出此错误,则很可能意味着集群中确实存在(通常)多个节点处于停机状态,您可以使用nodetool status <nodetool-status>
识别它们。如果只有一个协调器抛出此错误,则可能意味着该节点已与其他节点分离。 -
OperationTimedOutException
(服务器):当客户端设置超时时间并且查询花费的时间超过提供的超时时间时,这是最常见的超时消息。这是一个客户端超时,这意味着它花费的时间超过客户端指定的超时时间。错误消息将包含最后尝试的协调器节点,这通常是一个很好的起点。此错误通常表明客户端超时时间设置过于激进,或者服务器协调器/副本存在延迟。 -
ReadTimeoutException
或WriteTimeoutException
(服务器):当客户端未指定较低的超时时间并且存在基于cassandra.yaml
配置文件中提供的值的协调器超时时间时,这些错误就会出现。它们通常表明存在严重的服务器端问题,因为默认值通常为几秒钟。
指标
如果您将 Cassandra 指标
报告到集中式位置(例如 Graphite 或 Grafana),则通常可以使用这些指标缩小问题范围。在此阶段,将问题缩小到特定数据中心、机架,甚至节点组是主要目标。一些有用的指标包括
错误
Cassandra 将节点间消息传递错误称为“丢弃”,并提供了一些 丢弃消息指标
来帮助缩小错误范围。如果特定节点正在积极丢弃消息,则它们很可能与问题相关。
延迟
对于超时或延迟相关问题,您可以从 operating/metrics.adoc#table-metrics[表指标
] 开始,通过比较协调器级别指标(例如 CoordinatorReadLatency
或 CoordinatorWriteLatency
)与其关联的副本指标(例如 ReadLatency
或 WriteLatency
)来进行比较。问题通常会在 99th
百分位数出现,然后才会出现在 50th
百分位数或 平均值
上。虽然 最大值
协调器延迟通常不是很有用,因为内部使用指数衰减的蓄水池来生成指标,但与协调器上增加的 99th
百分位数相关的 最大值
副本延迟可以帮助缩小问题范围。
通常有三种主要可能性
-
所有节点上的协调器延迟都很高,但只有少数节点的本地读取延迟很高。这表明副本节点速度很慢,而协调器只是副作用。这通常发生在客户端不了解令牌的情况下。
-
少数节点上的协调器延迟和副本延迟同时增加。如果客户端了解令牌,这几乎总是会发生,并且表明少数令牌范围(仅环的一部分)的副本速度很慢。
-
许多节点上的协调器和本地延迟都很高。这通常表明集群容量已达到临界点(每秒写入或读取次数过多),或者出现新的查询模式。
重要的是要记住,根据客户端的负载均衡行为和一致性级别,协调器和副本指标可能或可能不会相关。特别是,如果您使用 TokenAware
策略,则同一节点的协调器和副本延迟通常会一起增加,但如果您只使用普通的 DCAwareRoundRobin
,则协调器延迟可能会与不相关的副本节点延迟一起增加。例如
-
TokenAware
+LOCAL_ONE
:始终应使同一节点上的协调器和副本延迟一起上升 -
TokenAware
+LOCAL_QUORUM
:始终应使同一数据中心中的协调器和多个副本延迟一起上升。 -
TokenAware
+QUORUM
:其他数据中心的副本延迟会影响协调器延迟。 -
DCAwareRoundRobin
+LOCAL_ONE
:协调器延迟和不相关的副本节点延迟将一起上升。 -
DCAwareRoundRobin
+LOCAL_QUORUM
:不同的协调器和副本延迟将一起上升,几乎没有相关性。
查询速率
有时,表指标
查询速率指标可以帮助缩小负载问题范围,因为协调器每秒查询数 (QPS) 的“微小”增加可能与副本级别 QPS 的大幅增加相关。这最常发生在 BATCH
写入中,其中客户端可能发送单个 BATCH
查询,其中可能包含 50 个语句,如果您的副本数为 9(RF=3,三个数据中心),则意味着每个协调器 BATCH
写入都会变成 450 个副本写入!这就是为什么将 `BATCH’s 保持在同一个分区中如此重要的原因,否则您可能会因一个“单个”查询而耗尽大量的 CPU 容量。