简而言之:如果我有 5 Tb 的数据,并希望将其部署在 5 台 Cassandra 服务器上 - 每台机器是否需要有 5 Tb 的磁盘空间来存储数据(不包括日志空间)?从文档中可以看出,有时 Cassandra 需要 2 倍的数据大小 - 所以是 10Tb/服务器还是阵列中总共 10Tb?
每台机器应该有多少 RAM?假设 5TB 都位于同一列空间中。我原本计划将每台机器的 RAM 最大化,但我不确定这是否足够。我需要一组总共具有 5TB RAM 的服务器吗?
答案1
如果您将 5 TB 的数据均匀分布在 5 台服务器上,则每台服务器将承载 1 TB 的数据。由于需要压缩,每台服务器将需要 2 TB 的磁盘空间(在最坏的情况下,压缩需要的磁盘空间是数据空间的两倍),这意味着您的集群中总共有 10 TB。
上述情况是您在集群中只存储一份数据副本。在这种情况下,如果服务器发生故障,您的五分之一的数据将无法访问。如果您想在集群中存储 2 份数据副本,每个节点将需要 4 TB 的磁盘空间,这意味着集群中总共需要 20 TB。
答案2
cassandra 建议每个节点的磁盘空间为 1/2 TB,因此,除非您愿意等待极长的压缩和非常长的 map/reduce 时间,否则您应该重新考虑需要多少台机器。
答案3
假设所有数据都在 RAM 中,那么这将是一台巨大而昂贵的机器。幸运的是,在大多数应用程序中,您不需要将所有数据都保存在内存中,而只需保存实时/活动数据即可。
当内存中缺少条目时,Cassandra 能够自动将数据从 HD 检索到 RAM。相反,当未访问的记录从内存中被删除时(“冷”数据)。您可以将 Cassandra 比作应用程序级缓存,其中条目是帐户行。在这种情况下,缓存命中/未命中可以解释为 Cassandra 文件系统磁盘上的记录必须被带回内存。
因此就尺寸而言:
- HDD 的大小适合整个数据集
- RAM 的大小是为了减少“缓存未命中”
- 复制因子影响吞吐量和弹性
所以说到 RAM:您只需要在内存中保留足够的数据,以避免不必要地从磁盘重新获取数据。它非常依赖于应用程序。我建议运行一些基准测试来验证您每天获得的活动会话数与系统上存储的会话总数。如果您的系统以读取为主,并且读取表现出时间局部性,那么这很适用。
另请查看此主题以获取更多灵感https://stackoverflow.com/questions/4924978/cache-design-question
实时数据与总数据的比例决定了系统的 RAM 需求。本质上,这是 Cassandra 未命中数与 RAM 成本之间的权衡。类似的考虑因素(在不同层面)适用于 CPU 缓存设计。