我有一个由 Java 客户端应用程序使用的 4 个节点的 Cassandra (2.2.1) 集群。复制因子为 3,读写一致性级别为 LOCAL_QUORUM。每个节点都有大约 5 GB 的数据。请求量约为每秒 2-4k。几乎没有删除操作,因此创建了少量的墓碑。
前段时间我注意到读写性能很差,而且随着时间的推移变得更糟——集群变得非常慢。读取(大多数情况下)和写入超时变得非常频繁。硬件应该不是问题,部署集群的服务器在磁盘性能,CPU和RAM资源方面确实很好。
我不清楚问题的原因,但我注意到几个可能指向根本原因的日志条目:
Java 客户端应用程序日志中的异常堆栈跟踪:
com.datastax.driver.core.exceptions.ReadTimeoutException:Cassandra 在读取查询期间以一致性 LOCAL_QUORUM 超时(需要 2 个响应,但只有 1 个副本响应)
有趣的是 1 个节点仍然响应。
失败提示错误的几个条目:
无法重播 /1.1.1.1 的提示;正在中止(已交付 135922),错误:操作超时 - 仅收到 0 个响应。
cassandra 日志中有以下几个异常:
请求期间出现意外异常;channel = [id: 0x10fc77df, /2.2.2.2:54459 :> /1.1.1.1:9042] java.io.IOException: Error while read(...): Connection timed out at io.netty.channel.epoll.Native .readAddress(Native Method) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] at io.netty.channel.epoll.EpollSocketChannel$EpollSocketUnsafe.doReadBytes(EpollSocketChannel.java:675) ~[netty -all-4.0.23.Final.jar:4.0.23.Final] 在 io.netty.channel.epoll.EpollSocketChannel$EpollSocketUnsafe.epollInReady(EpollSocketChannel.java:714) ~[netty-all-4.0.23.Final. jar:4.0.23.Final] 在 io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:326) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] 在 io。 netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:264) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] 在 io.netty.util.concurrent。
失败的批处理错误:
[<...>] 的准备语句批次大小为 3453794,超过指定阈值 1024000 到 2429794。(请参阅 batch_size_fail_threshold_in_kb)
看起来批处理太大了,顺便说一下我们有很多批处理操作。也许批次会影响系统?
最后,最常见的异常 - 在将日志记录级别切换为 DEBUG 后,这些条目一个接一个出现:
TIOStreamTransport.java:112 - 关闭输出流时出错。java.net.SocketException: 套接字在 java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116) 处关闭 ~[na:1.8.0_66] 在 java.net.SocketOutputStream.write(SocketOutputStream.java:153) 处~[na: 1.8.0_66] 在 java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) ~[na:1.8.0_66] 在 java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) ~[na:1.8.0_66]在 java.io.FilterOutputStream.close(FilterOutputStream.java:158) ~[na:1.8.0_66] 在 org.apache.thrift.transport.TIOStreamTransport.close(TIOStreamTransport.java:110) ~[libthrift-0.9.2. jar:0.9.2] 在 org.apache.cassandra.thrift.TCustomSocket.close(TCustomSocket.java:197) [apache-cassandra-2.2.1.jar:2.2.1] 在 org.apache.thrift.transport.TFramedTransport .close(TFramedTransport.java:
您对可能导致此问题的原因有任何想法吗?
谢谢!