我正在研究将一些大型数据库从 MySQL 迁移到 Cassandra,并试图弄清楚如何规划集群。从历史上看,人们只需购买磁盘来保存相关数据,但我不清楚 Cassandra 如何使用磁盘空间和 RAM 空间。
在规划集群时,会出现需要多少台机器、每台机器有多少磁盘、RAM 等问题。对于 1Tb、10Tb 或更多,我该如何回答这个问题?
答案1
基本上,磁盘的公式每个节点是 D x RF / N x O / C,其中变量定义如下:
- D 是您的整体数据大小。
- RF 是您的复制因子。大多数集群至少使用 2(为了持久性)或 3(为了在 CL=Quorum 时实现持久性和可用性的结合)。
- N 是集群中的节点数。该数字至少应为 RF。您还需要增加该数字,直到获得令人满意的“每个节点的磁盘数”结果。
- O 是磁盘上索引和未合并的 sstable 的开销乘数。除非您几乎没有索引且数据极其稳定,否则我会在这里使用至少 O=2 的系数。
- C 是使用 Cassandra 1.0+ 压缩支持(假设您启用它)可以节省的系数。这大约是您通过 gzip 压缩具有代表性内容的文件所节省的。如果禁用压缩,请使用 C=1。如果压缩倾向于将数据大小减半,请尝试 C=0.6 左右,因为压缩并不适用于所有内容(例如索引)。
一旦您获得了一些数字,您就应该将目标设定为“每个节点的磁盘”不超过可用本地存储的 30%,这样您就不必立即扩大集群,并且可以进行快照。
内存规划在很大程度上取决于您的架构,但您需要在每个节点上为 Cassandra 分配至少 4GB 的内存。操作系统可以使用超出此内存的任何内存来实现非常有益的磁盘缓存。只有当内存大大超过磁盘上实际驻留的数据量时,更多的内存才会变得完全无用。
答案2
容量规划真的是一门科学(就数学/统计学而言)。由于数学模型不会给你带来任何帮助,你真的必须设置一个测试平台来回答你的问题,因为这里没有人能为你提供你似乎想要的理论模型。
如何回答这个问题:
- 获得(可扩展的)测试平台
- 用你的数据填充它
- 编写适当的负载生成工具
- 施加负载并测量
- 测量并对结果进行健全性检查
- 可选择调整并再次转到 3. 或 4.
或聘请专业人士。