2016-10-01 146 views
1

我有一个由Java客户端应用程序使用的4个节点的Cassandra(2.2.1)集群。复制因子为3,读取和写入的一致性级别为LOCAL_QUORUM。每个节点都有大约5 GB的数据。请求数量约为每秒2-4k。几乎没有删除操作,因此创建了少量的墓碑。Cassandra集群性能不佳

我注意到前段时间的读写性能很差,而且随着时间的推移它越来越差 - 集群变得非常慢。阅读(主要是经常)和写超时已经变得非常频繁。硬件不应该导致问题,在磁盘性能,CPU和RAM资源方面,部署集群的服务器确实很好。

问题的原因我不清楚,但我已经注意到这可能指向根源几个日志条目:

  1. 在Java客户端应用程序日志异常堆栈跟踪:

    COM .datastax.driver.core.exceptions.ReadTimeoutException:在一致性LOCAL_QUORUM读取查询期间卡桑德拉超时(被要求2层的反应,但只有1复制品回应)

有趣的是,1节点仍然响应。

  • 失败提示错误的若干项:

    无法重放提示来/1.1.1.1;中止(135922已交付),错误:操作超时 - 仅收到0个响应。在卡桑德拉日志

  • 几个以下例外:

    请求期间

    意外的异常;通道= [id:0x10fc77df,/2.2.2.2:54459:> /1.1.1.1:9042] java.io.IOException:读取时出错(...):连接超时 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] at io.netty.channel.epoll.EpollSocketChannel $ EpollSocketUnsafe.epollInReady(EpollSocketChannel.java:714)〜[netty-all-4.0。 23.Final.jar:4.0.23.Final] at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:326)〜[netty-all-4.0.23.Final.jar:4.0.23。最终] at io.netty.i0.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:264)〜[netty-all-4.0.23.Final.jar:4.0.23.Final] at io.netty。 util.concurrent.SingleThreadEventExecutor $ 2.run(SingleThreadEventExecutor.java:116)〜[netty-all-4.0.23.Final.jar:4.0.23.Final] at io.netty.util.concurrent.DefaultThreadFactory $ DefaultRunnableDecorator.run (DefaultThreadFactory.java:137)〜[netty-all-4.0.23.Final.jar:4.0.23.Final] at java.lang.Thread.run(Thread.java:745)[na:1.8.0_66]

  • 失败批次错误:

    准备语句的批次为[< ...>]是大小3453794的,由2429794.超过1024000指定的阈值(见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] at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)〜[na:1.8.0_66] at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)〜[na :1.8.0_66] at org.apache.thrift.transport.TIOStreamTransport.close(TIOStreamTransport.java:110)〜 [libthrift-0.9.2.jar:0.9.2] at org.apache.cassandra.thrift.TCustomSocket.close(TCustomSocket.java:197)[apache-cassandra-2.2.1.jar:2.2.1] at org.apache.thrif t.transport.TFramedTransport.close(TFramedTransport.java:89)[libthrift-0.9.2.jar:0.9.2] at org.apache.cassandra.thrift.CustomTThreadPoolServer $ WorkerProcess.run(CustomTThreadPoolServer.java:209)[ apache-cassandra-2.2.1.jar:2.2.1] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_66] at 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]

  • 你有什么关于什么会导致这个问题的想法?

    谢谢!

    +0

    您是否正在分批处理原子的原因?因为批次不适合Cassandra的表现。 –

    +0

    是的,我只是为了原子原因而进行批处理。我只是想 - 可以大批量减慢整个集群吗? – Atver

    +1

    是的,大量批次会降低性能。 –

    回答

    0

    对于第一点,我有一个想法:

    当你发出一个查询时,总是有要照顾它的线程。

    如果太多,应该有一个队列来组织它们。

    线程可能在队列中等待的时间也有一个超时。

    因此,您的副本没有足够快地回复,因为服务于特定查询的线程被丢弃。

    考虑玩一些写/读线程数。如果你的系统足够好,你可以在该区域分配更多的工作人员。

    记得与卡桑德拉应力玩了一会儿,速率线程= 其中默认为32。考虑从32增加cassandra.yaml的从32

    • concurrent_reads数量高达128
    • concurrent_writes最多128

    您也可以考虑减少数字。我建议测试测试并重新测试。

    您也可以与超时玩(多少线程可以生活在一个队列服务响应)从5000

    • read_request_timeout_in_ms最多的东西从2000年10000个
    • write_request_timeout_in_ms高达类似5000。

    在2点我怀疑是相同的,您的节点试图回复提示这样两件事情发生:

    1. 没有达到节点(检查一些网络问题)

    2. 也许你需要分配更多的工作线程,影响max_hints_delivery_threads。

    3点的容貌点1

    好运气有关。

    +0

    感谢您的详细解释。我会尝试这种方法,看看它是否有帮助。 – Atver