我在EC2 m1.xlarge的3个实例上设置了Cassandra(1.2.10)集群的3个节点。
基于默认配置,其中包含一些准则,例如:
datastax_clustering_ami_2.4
不使用EBS,而是在临时设备上突袭了0 xfs,
在单独的磁盘上提交日志,
RF = 3,
6GB堆,200MB新大小(也已通过更大的新大小/堆值进行了测试),
增强limits.conf。
每秒有500次写入,该集群只能工作几个小时。在那之后,由于CPU过载(主要是GC +压缩),似乎无法响应。
节点保持Up,但是它们的负载巨大,并且日志中充满了GC信息和消息,例如:
ERROR [Native-Transport-Requests:186] 2013-12-10 18:38:12,412 ErrorMessage.java (line 210) Unexpected exception during request java.io.IOException: Broken pipe
nodetool在每个节点上显示许多丢弃的突变:
Message type Dropped
RANGE_SLICE 0
READ_REPAIR 7
BINARY 0
READ 2
MUTATION 4072827
_TRACE 0
REQUEST_RESPONSE 1769
对于m1.xlarge的3节点群集,500 wps太多了吗?我应该添加节点吗?还是可以通过某种方式进一步调整GC?您可以为m1.xlarge的3个节点提供什么负载?您的GC配置是什么?
最佳答案
Cassandra完全能够在单个节点上每秒处理成千上万次小写操作。我刚刚检查了我的笔记本电脑,Cassandra 1.2上的cassandra-stress每秒获得大约29000次写入。因此,即使对于单个节点,每秒500次写入也不是一个令人印象深刻的数字。
但是请注意,将数据刷新到磁盘的速度也受到限制,并且您绝对不希望传入的数据速率接近HDD的物理功能。因此,如果这些写入足够大,那么每秒500次写入可能会太多。
那么首先-写入的平均大小是多少?您的复制因素是什么?将写入次数乘以复制因子和平均写入大小-然后您将大致了解集群所需的写入吞吐量。但是您应该为其他I / O相关任务(如压缩)留一些安全余量。互联网上有各种基准测试,告诉一个m1.xlarge实例应该能够以20 MB / s到100 MB / s的速度写入...
如果您的群集具有足够的I / O吞吐量(例如,比需要的吞吐量高3倍),但是您发现OOM问题,则应尝试:
减少memtable_total_space_mb(这将导致C *更频繁地刷新较小的memtable,从而更早地释放堆)
将write_request_timeout降低到例如2秒而不是10秒(如果您有大量写入操作,那么您不想在驻留在堆中的传入队列中保留太多写入操作)
关闭row_cache(如果您启用了它)
较小的key_cache
考虑升级到Cassandra 2.0,这使很多东西脱离了堆(例如,bloom过滤器和索引摘要);如果您仅在每个节点上存储大量数据,这尤其重要
添加更多硬盘并设置多个数据目录,以提高刷新性能
设置更大的新一代尺寸;对于6 GB的堆,我通常将其设置为大约800M,以避免对使用年限长的gen施加压力。
如果您确定内存刷新滞后,请确保启用稳定压缩-这样会减少物理上保存到磁盘的数据量,但会增加CPU周期
关于amazon-ec2 - Cassandra可以在m1.xlarge实例上处理多少负载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20502001/