Cassandra 文档

版本

您正在查看预发布版本的文档。

查看最新版本

查找故障节点

解决 Cassandra 问题的第一步是使用错误消息、指标和监控信息来确定问题是出在客户端还是服务器上,如果问题出在服务器上,则找到 Cassandra 集群中出现问题的节点。目标是确定这是一个系统性问题(例如,影响整个集群的查询模式)还是仅限于节点子集(例如,持有共享令牌范围的邻居,甚至单个硬件出现故障的节点)。

有很多信息来源可以帮助确定问题所在。下面列出了一些最常见的信息来源。

客户端日志和错误

集群的客户端通常会留下最好的面包屑线索。也许某个特定数据中心的客户端延迟或错误率有所增加(可能排除了其他数据中心的节点),或者客户端正在接收特定类型的错误代码,表明存在特定类型的问题。故障排除人员通常只需阅读错误消息就可以排除许多故障模式。实际上,许多 Cassandra 错误消息都包含最后联系的协调器,以帮助操作员找到要从哪里开始的节点。

一些常见错误(假设客户端具有与 Datastax drivers <client-drivers> 相似的错误名称)可能导致的罪魁祸首(括号内)。

  • SyntaxError (客户端)。这和其他 QueryValidationException 表明客户端发送了格式错误的请求。这些很少是服务器问题,通常表明查询错误。

  • UnavailableException (服务器):这意味着 Cassandra 协调器节点已拒绝查询,因为它认为可用的副本节点数量不足。如果许多协调器都抛出此错误,则很可能意味着集群中确实存在(通常)多个节点处于停机状态,您可以使用 nodetool status <nodetool-status> 识别它们。如果只有一个协调器抛出此错误,则可能意味着该节点已与其他节点分离。

  • OperationTimedOutException (服务器):当客户端设置超时时间并且查询花费的时间超过提供的超时时间时,这是最常见的超时消息。这是一个客户端超时,这意味着它花费的时间超过客户端指定的超时时间。错误消息将包含最后尝试的协调器节点,这通常是一个很好的起点。此错误通常表明客户端超时时间设置过于激进,或者服务器协调器/副本存在延迟。

  • ReadTimeoutExceptionWriteTimeoutException (服务器):当客户端未指定较低的超时时间并且存在基于 cassandra.yaml 配置文件中提供的值的协调器超时时间时,这些错误就会出现。它们通常表明存在严重的服务器端问题,因为默认值通常为几秒钟。

指标

如果您将 Cassandra 指标 报告到集中式位置(例如 GraphiteGrafana),则通常可以使用这些指标缩小问题范围。在此阶段,将问题缩小到特定数据中心、机架,甚至节点组是主要目标。一些有用的指标包括

错误

Cassandra 将节点间消息传递错误称为“丢弃”,并提供了一些 丢弃消息指标 来帮助缩小错误范围。如果特定节点正在积极丢弃消息,则它们很可能与问题相关。

延迟

对于超时或延迟相关问题,您可以从 operating/metrics.adoc#table-metrics[表指标] 开始,通过比较协调器级别指标(例如 CoordinatorReadLatencyCoordinatorWriteLatency)与其关联的副本指标(例如 ReadLatencyWriteLatency)来进行比较。问题通常会在 99th 百分位数出现,然后才会出现在 50th 百分位数或 平均值 上。虽然 最大值 协调器延迟通常不是很有用,因为内部使用指数衰减的蓄水池来生成指标,但与协调器上增加的 99th 百分位数相关的 最大值 副本延迟可以帮助缩小问题范围。

通常有三种主要可能性

  1. 所有节点上的协调器延迟都很高,但只有少数节点的本地读取延迟很高。这表明副本节点速度很慢,而协调器只是副作用。这通常发生在客户端不了解令牌的情况下。

  2. 少数节点上的协调器延迟和副本延迟同时增加。如果客户端了解令牌,这几乎总是会发生,并且表明少数令牌范围(仅环的一部分)的副本速度很慢。

  3. 许多节点上的协调器和本地延迟都很高。这通常表明集群容量已达到临界点(每秒写入或读取次数过多),或者出现新的查询模式。

重要的是要记住,根据客户端的负载均衡行为和一致性级别,协调器和副本指标可能或可能不会相关。特别是,如果您使用 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 容量。

下一步:调查节点

一旦您尽可能地缩小了问题范围(数据中心、机架、节点),请使用 SSH 登录到其中一个节点,并继续使用 日志nodetool操作系统工具 进行调试。如果您无法登录,您可能仍然可以远程访问 日志nodetool