我正在运行一个有 5 个节点的 Cassandra 集群,每个节点有 10 个 1Tb 磁盘 (JBOD)。目前,其中一个节点处于问题状态,由于单个磁盘空间不足,大型压缩无法成功完成。
我试图弄清楚在 JBOD 配置中添加额外的磁盘会产生什么效果。
- 现有数据是否会自动重新分配以最佳地利用新磁盘?
- 新添加的磁盘是否只会写入新数据?
- 我可以手动将 sstables 移动到不同的磁盘吗?
- 拆分 sstables 是一种选择吗?
我在网上找到了一些不完全确定的资料:
- https://stackoverflow.com/questions/23110054/cassandra-adding-disks-increase-storage-volume-without-adding-new-nodes似乎表明“数据将随着时间的推移在磁盘之间均衡”,但没有具体说明这是由于重新平衡还是新数据将仅写入新磁盘(也是旧链接,因此不确定是否仍然相关)。
- http://mail-archives.apache.org/mod_mbox/cassandra-user/201610.mbox/%3cCAMy13tA3cZ++LaVnUsuwkwbR5tvBdhMEOqWij9nrWRODq42rLQ@mail.gmail.com%3e似乎意味着使用 Cassandra 3.2+ 进行压缩将始终在本地数据磁盘上运行。
答案1
新数据和压缩期间都会写入新磁盘。实际逻辑取决于 Cassandra 版本,例如,较新的版本将特定分区范围放入特定磁盘。通常的建议是使用 RAID-0 来拥有一个大磁盘,这样您就不会遇到大 SSTables 的问题。但这种方法有一个缺点 - 如果您丢失一个磁盘,您将丢失所有数据并需要重建所有内容。
理论上,您可以手动将一些 SSTable 移动到其他磁盘(假设该节点已停止),然后 Cassandra 将在压缩期间重新分配数据,但我尚未针对此配置尝试过。该操作还有另一个问题 - 如果您移动一些 SSTable,并且它已删除或更新了被另一个磁盘上较新数据覆盖的数据,并且如果该磁盘崩溃,那么您可以恢复已删除/旧的数据。
PS 每个节点 10Tb 太疯狂了。想想如果服务器坏了,重建一个节点需要多长时间。