我的团队为内部应用程序运行 Cassandra。这是我们的设置:
- 我们正在运行 Cassandra 版本 3.11.13。
- 我们有多个键空间;每个微服务都有自己的微服务。
- 我们在两个 AWS 区域拥有主动-主动架构。
- 每个区域有 4 个节点:2 个种子节点和 2 个成员节点。
- 该拓扑在每个数据中心/区域中的复制因子为 4,因此所有节点都拥有 100% 的数据。
- 我们的读一致性是LOCAL_QUORUM,我们的串行一致性是LOCAL_SERIAL,以保持双活状态。
我们最近发生了一个事件,我们在应用程序客户端的查询期间看到读取超时。它们似乎只与一个键空间相关。经过大量故障排除后,我们发现nodetool repair
问题已得到解决。日志文件中没有任何异常让我们了解到存在数据不一致或损坏,因此我们只能假设是这种情况,因为它已通过修复修复。也没有出现表明磁盘问题的 EC2 硬件或操作系统故障。结果,我们没有真正的根本原因,也不知道将来如何预防这种情况。
我们确实注意到的一个症状是以下日志消息针对该特定键空间不断重复:
INFO [Native-Transport-Requests-1] 2023-07-04 11:53:15,913 MigrationManager.java:286 - Update Keyspace '[REDACTED]' From KeyspaceMetadata ......
修复后该症状消失。
我们想知道是否有人了解可能发生的情况以及随后如何预防它。
值得注意的是,我们没有根据指南进行足够频繁的维修。我们大约每三个月执行一次,但建议匹配gc_grace_seconds
您正在使用的值,目前为 10 天。
同样重要的是要知道,由于我们定期运行批处理作业,我们怀疑事件发生时存在较高程度的负载,但我们没有在 Cassandra 节点上看到压力迹象。
这意味着这可能是由于一个特定应用程序的写入模式造成的。
这一切都取决于所需的一致性。如果数据不必 100% 正确或最新,那么修复可能会带来更多麻烦。但是,如果需要更高级别的一致性,那么每周运行一次修复通常是一个好主意。这可以设置为由Cassandra Reaper之类的工具轻松管理。
这对我来说是一个很大的指标。尽管节点似乎没有受到压力,但复制失败的原因有很多。通常的原因是建立了过多的写入背压,导致一个或多个节点丢弃传入的写入。
网络不一致也是一个重要原因,因此这也值得关注。
Cassandra 的多租户集群存在问题,因为它很难找到根本原因(就像您所看到的),然后在不影响其他应用程序的情况下采取任何措施。将此应用程序从其他应用程序中分离出来并为其提供自己的集群可能是值得的。这样您就可以扩展资源以更好地适应其写入模式。
我还会尝试查看在相关键空间上运行的应用程序或批处理作业。如果可以降低写入吞吐量,那应该会有所帮助。这可以通过限制代码中的运行中写入线程来完成。另一种选择是让批处理作业指向 Pulsar 或 Kafka 主题之类的内容,然后构建一个消费者来从主题中读取数据并将写入应用到 Cassandra。
还要检查每个节点上的磁盘IO。如果达到最大,则可能是瓶颈所在。在这种情况下,可以通过为实例选择不同的驱动器类型来解决这个问题。