【发布时间】:2017-02-10 01:32:24
【问题描述】:
我有一个由 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 日志中有以下几个异常:
请求期间出现意外异常;频道 = [id: 0x10fc77df, /2.2.2.2:54459 :> /1.1.1.1:9042] java.io.IOException:读取时出错(...):连接超时 在 io.netty.channel.epoll.Native.readAddress(Native Method) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] 在 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.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] 在 io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] 在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
-
失败的批处理错误:
[<...>] 的准备好的语句批次大小为 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:89) [libthrift-0.9.2.jar:0.9.2] 在 org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:209) [apache-cassandra-2.2.1.jar:2.2.1] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66] 在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
您对导致此问题的原因有什么想法吗?
谢谢!
【问题讨论】:
-
您是否出于原子原因进行批处理?因为在 Cassandra 中批处理不是为了性能。
-
是的,我只是出于原子原因进行批处理。我只是想 - 大批量会减慢整个集群的速度吗?
-
是的,大批量会降低性能。
标签: java cassandra database-performance cassandra-2.2