【发布时间】:2018-03-02 10:05:48
【问题描述】:
我在 Cassandra 集群(部署在 ec2 实例上)中遇到了这样一种情况,即集群的每个节点的磁盘空间都将用完。现在如果我在 Cassandra 集群中添加更多实例,是否会增加磁盘空间?
我的意思是,每当我们的空间不足时,我们可以向 cassandra 集群添加更多实例以增加整体磁盘空间吗?
如果是这样,这样做是否正确?
【问题讨论】:
我在 Cassandra 集群(部署在 ec2 实例上)中遇到了这样一种情况,即集群的每个节点的磁盘空间都将用完。现在如果我在 Cassandra 集群中添加更多实例,是否会增加磁盘空间?
我的意思是,每当我们的空间不足时,我们可以向 cassandra 集群添加更多实例以增加整体磁盘空间吗?
如果是这样,这样做是否正确?
【问题讨论】:
我的意思是,每当我们的空间不足时,我们可以添加更多 实例到 cassandra 集群以增加整体磁盘空间?
是的,是的。
考虑一个 4 节点集群,复制因子 (RF) 为 3,每个节点有 100GB 的存储空间。假设数据足迹的初始完整副本为 60GB。有 4 个节点和 3 个 RF,每个节点将负责 3/4 的数据,即 45GiB。
Address Load Owns Total
10.0.0.1 45.0 GiB 75.0% 100Gb
10.0.0.2 45.0 GiB 75.0% 100Gb
10.0.0.3 45.0 GiB 75.0% 100Gb
10.0.0.4 45.0 GiB 75.0% 100Gb
使用大小分层压缩(默认),您希望将每个节点保持在总磁盘使用量的 50% 以下。这种设置允许这样做。
但是,假设应用团队在一夜之间运行了大量负载。我们明天早上来,发现这个:
Address Load Owns Total
10.0.0.1 70.0 GiB 75.0% 100Gb
10.0.0.2 70.0 GiB 75.0% 100Gb
10.0.0.3 70.0 GiB 75.0% 100Gb
10.0.0.4 70.0 GiB 75.0% 100Gb
基本上,数据的完整副本已增长到 93.3 GiB。要将每个磁盘的数据量降至 50% 以下,我们将不得不添加更多节点。
但是有多少?
如果我们添加一个节点(保持 RF 为 3),这意味着每个节点负责 3/5(60% 的数据),即 55.98 GiB。关闭,但不完全在那里。
如果我们添加两个节点,则总共有 6 个,这意味着每个节点负责 50% 的数据,即 46.65 GiB。这确实使我们回到每个节点的 %50 以下,因此我们应该至少添加两个节点。
完成后,集群应如下所示:
Address Load Owns Total
10.0.0.1 46.65 GiB 50.0% 100Gb
10.0.0.2 46.65 GiB 50.0% 100Gb
10.0.0.3 46.65 GiB 50.0% 100Gb
10.0.0.4 46.65 GiB 50.0% 100Gb
10.0.0.5 46.65 GiB 50.0% 100Gb
10.0.0.6 46.65 GiB 50.0% 100Gb
请注意,简单地在新节点中引导只会将数据移动到这些节点。它确实不将其从现有节点中删除。为此,您应该在每个预先存在的节点上运行 nodetool cleanup。
【讨论】:
您可以向集群添加更多节点,然后重新平衡集群。这会将您的数据分散到更多节点,并且应该减少单个节点上的数据量。前提是您的数据分区得当。 同时,请检查您的 TTL 值和 GC_grace 并确保您消耗的空间量确实是合理的。
【讨论】: