我正在考虑设计一个Cassandra集群。
用例将存储用于时间序列数据的大量微小样本(使用KairosDB),数据几乎是不可变的(非常罕见的删除,没有更新)。那部分工作得非常好。
然而,几年之后数据将会非常大(考虑到复制因素,它将达到几百TB的最大大小 - 超过1 PB)。
我知道建议不要在每个Cassandra节点上使用超过5TB的数据,因为在压缩和修复期间I / O负载很高(显然旋转磁盘已经非常高)。 由于我们不想为这个用例构建一个包含数百个节点的整个数据中心,我正在调查是否可以在旋转磁盘上使用高密度服务器(例如,在RAID10中使用旋转磁盘,每个节点至少10TB或20TB或JBOD,服务器将具有良好的CPU和RAM,因此系统将受I / O限制。)
Cassandra每秒的读/写量可以通过一个没有任何压力的小集群来管理。我还要提到的是,这不是一个高性能的事务系统,而是一个用于存储,检索和一些分析的数据存储,而且数据几乎是不可变的 - 所以即使压缩或修复/重建需要几天的几个服务器同时它可能根本不会成为一个问题。
我想知道是否有人对使用旋转磁盘的高服务器密度以及您正在使用的配置(Cassandra版本,每个节点的数据大小,每个节点的磁盘大小,磁盘配置:JBOD / RAID,硬件类型)有经验反馈)。
提前感谢您的反馈。
最好的问候。
答案 0 :(得分:17)
超级密集节点的风险不一定在修复和压缩期间最大化IO - 它无法可靠地解决总节点故障。在您对Jim Meyer的回复中,您注意到不建议使用RAID5,因为重建期间失败的可能性太高 - 相同的潜在故障是针对超密集节点的主要参数。
在pre-vnodes的日子里,如果你有一个已经死亡的20T节点,你必须恢复它,你必须从邻近的(2-4)节点流20T,这将最大化所有这些节点,增加它们失败的可能性,并且需要(小时/天)来恢复向下节点。在那段时间里,您运行时冗余度降低,如果您重视数据,这可能会带来风险。
许多人都赞赏vnode的原因之一是它将负载分配给更多邻居 - 现在,用于引导替换节点的流操作来自数十台计算机,从而分散了负载。但是,您仍然存在一个基本问题:您必须在节点上获得20T数据而不会引导失败。流媒体长期以来比期望的更加脆弱,在云网络上无故障流20T的可能性并不是太棒了(尽管它再次变得越来越好)。
你能运行20T节点吗?当然。但重点是什么?为什么不运行5个4T节点 - 您可以获得更多冗余,可以相应地缩小CPU /内存,而且您不必担心一次性重新引导20T。
我们的“密集”节点是具有Cassandra 2.1.x的4T GP2 EBS卷(x> = 7以避免2.1.5 / 6中的OOM)。我们使用单个卷,因为虽然你建议“cassandra现在支持JBOD很好”,但我们的经验是依赖Cassandra的平衡算法不太可能给你你想的那样 - IO会在设备之间轰动一下(压倒一个,然后压倒下一个,等等),它们会不对称地填充。对我来说,这是对很多小卷的一个很好的论据 - 我宁愿只看到单个卷上的一致用法。
答案 1 :(得分:4)
我还没有使用过KairosDB,但是如果它能让你控制Cassandra的使用方式,你可以考虑一些事情:
查看您是否可以使用增量维修而非全面维修。由于您的数据是不可变的时间序列,因此您不会经常需要修复旧的SSTable,因此增量修复只会修复最近的数据。
将旧数据存档在不同的密钥空间中,并且仅在不经常修复密钥空间时(例如拓扑更改时)。对于日常维修,只需要修理'#34; hot"您用于最近数据的密钥空间。
尝试使用不同的压缩策略,可能是DateTiered。这可能会减少压缩所花费的时间,因为它可以减少压缩旧数据的时间。
还有其他一些可能有用的修复选项,例如,如果您运行多个数据中心,我发现-local选项可以显着加快修复速度。或许你可以更频繁地进行有限的修理,而不是在所有事情上杀死全面修理。
我有一些使用RAID5的Cassandra集群。到目前为止,这种方法运行良好,但如果阵列中的两个磁盘发生故障,则节点将变为不可用,因为禁止对阵列进行写入。然后,某人必须手动干预以修复故障磁盘或从群集中删除该节点。如果你有很多节点,那么磁盘故障将是一种相当普遍的现象。
如果没有人给出关于运行20 TB节点的答案,我建议在您自己的数据集上运行一些实验。设置一个20 TB的节点并用数据填充它。当你填写它时,监控写入吞吐量,看看在压缩发生时吞吐量是否会出现无法忍受的下降,以及在多少TB变得无法容忍的情况下。然后让一个空的20 TB节点加入集群并在新节点上运行完整修复,并查看将其一半数据集迁移到该节点所需的时间。这可以让您了解更换群集中的故障节点需要多长时间。
希望有所帮助。
答案 2 :(得分:2)
我建议您考虑应用程序的数据模型以及如何对数据进行分区。对于时间序列数据,使用由分区键+一列或多列组成的复合键[1]可能是有意义的。分区根据分区键的散列分布在多个服务器上(取决于您使用的Cassandra分区程序,请参阅cassandra.yaml)。
例如,您可以按生成数据的设备([2]中的模式1)或一段时间(例如,每天)对服务器进行分区,如[2]中的模式2所示。
您还应该知道每个分区的最大值数限制为20亿[3]。因此,强烈建议使用分区。不要将整个时间序列存储在单个分区中的单个Cassandra节点上。
[1] http://www.planetcassandra.org/blog/composite-keys-in-apache-cassandra/
[2] https://academy.datastax.com/demos/getting-started-time-series-data-modeling