2012-02-13 38 views
1

之所以能够重新创建一个简单的场景,看近底部连续应激后不平衡卡桑德拉集群负载写道

首先,一些底色成问题的更新。我正在Amazon EC2上做一些Cassandra实验。我在东方有4个节点,在西方有4个节点。为了模拟我的使用案例,我使用运行在单独的East-EC2实例上的cassandras内部压力工具发布:

./stress -d us-eastnode1,...,us-eastnode4 --replication-strategy NetworkTopologyStrategy - -strategy-properties us-east:3,us-west:3 -e LOCAL_QUORUM -c 200 -i 10 -n 1000000

接下来我运行了同样的写法,同时也开始了对应的local_quorum读取另一个单独的West -EC2例如:

./stress -d美国westnode1,...,美国westnode4 -o读-e LOCAL_QUORUM -c 200 -i 10-百万

杉后st 300k左右读取,其中一个西方节点开始以约80%iowait cpu阻塞,并将总读取速度降低约90%。与此同时,写作完成的速度接近正常速度。为了弄清楚是什么导致这个单一节点变成了Iowait块,我刚刚开始阅读,并立即出现了同样的问题。

我的代币是这样的,它在东方节点周围是平衡的,每个西方节点+1在每个对应的东方节点上,即。 us-eastnode1:0,us-westnode1:1,us-eastnode2:42535295865117307932921825928971026432等。实际负载在整个集合中达到平衡,所以我从中找到了可能的原因。

我最终进行了一次重大压缩(尽管CF只有10个sstables,并且没有小时的压缩已经被启动了>小时)。一旦我再次尝试读取压力,节点就很好......然而,下一个连续节点则会遇到同样的问题。这是我发现的最大线索,但我不知道它在哪里。

我已经问过卡桑德拉IRC,但从那里没有任何想法。任何人对我可以尝试的新事物有任何想法,试图找出这里出了什么问题?

第二天更新 一些进一步的钻研,我能够通过简单地运行写应激两次,然后运行该读重现此。 nodetool cfstats在第一次写入后显示每个节点负责约750k个密钥,这对于DC中4个节点的1,000,000个密钥和RF:3是有意义的。但是,在第二次写入压力之后,us-westnode1拥有约1,500,000个密钥,而us-westnode1-3每个拥有约875,000个密钥。然后当它尝试读取时,具有它应该具有的两倍负载的节点正在陷入停滞。 这让我觉得麻烦在于压力工具。它将覆盖具有相同c0-c199列的相同0000000-0999999行。然而,不管怎样,没有一个节点的数据负载与第一次运行时的数据负载大致相同。

简单娱乐 通过删除第二个DC作为变量缩小了问题的范围。现在运行1个DC,每个拥有25%所有权的4个节点RandomPartitioner,并写入以下内容:

./stress -d node1,...,node4 --replication-factor 3 -e QUORUM -c 200 -i 10 -n 1000000

经过一次写入(和次要压缩)之后,每个节点都有〜7.5gb的负载。
经过两次写入(和次要压缩)后,每个节点都有〜8个。6GB的负载,除了节点2〜15GB。 在所有节点上运行主要压缩后,每个节点回到〜7.5gb的负载。

这是否只是一个奇怪的压缩问题,当有效覆盖整个数据集时就会出现压力问题?

+0

您正在EC2上运行?你使用实例存储还是EBS? – fennec 2012-02-14 17:48:32

+0

实例存储。今天进一步调查并正在更新问题。似乎与第二次运行压力写入时不正确的负载平衡有关。 – user1207932 2012-02-14 19:57:45

回答

1
Is this simply a weird compaction issue that crops up when effectively overwriting the entire dataset like the stress tool does? 

是的,压实桶将有点随机行为,并且对于某些节点不紧凑以及其他节点是正常的。 (也就是说,听起来像节点2基本上没有压缩完成可能只是在后面。)

如果您的实际工作量还涉及大量覆盖,您应该测试Leveled Compaction,它旨在做一个更好,更多在这种情况下可预测的工作:http://www.datastax.com/dev/blog/leveled-compaction-in-apache-cassandra