生产建议
cassandra.yaml
和 jvm.options
文件包含许多关于生产环境使用的注意事项和建议。本页将扩展文件中的部分信息。
令牌
每个节点使用多个令牌范围称为虚拟节点或 vnodes。vnodes
可以在新节点引导到集群时,通过更多流式传输对等体来促进灵活扩展。限制流式传输的负面影响(I/O 和 CPU 开销)可以实现增量集群扩展。但是,更多令牌会导致与更多对等体共享数据,并导致可用性降低。必须根据集群的特征读取和写入来平衡这两个因素。要了解更多信息,建议阅读 Cassandra 在虚拟节点中的可用性,Joseph Lynch 和 Josh Snyder。
使用 cassandra.yaml
文件中的设置更改令牌数量
num_tokens: 16
以下是最常见的令牌计数,以及何时以及为何使用每个令牌计数的简要说明。
令牌计数 | 描述 |
---|---|
1 |
最大可用性、最大集群大小、最少对等体,但扩展性不灵活。必须始终将集群大小加倍才能扩展并保持平衡。 |
4 |
弹性和可用性的良好结合。建议用于最终将超过 30 个节点的集群。需要添加大约 20% 的节点才能保持平衡。缩减集群可能会导致集群不平衡。 |
8 |
使用 8 个 vnodes 将工作负载分布在系统之间,方差约为 10%,对性能的影响最小。 |
16 |
最适合经常扩展和缩减的弹性很强的集群,但对于大型集群来说,可用性可能存在问题。不建议用于超过 50 个节点的集群。 |
除了设置令牌计数之外,在 cassandra.yaml
中将 allocate_tokens_for_local_replication_factor
设置为适当的副本数量也极其重要,以确保令牌分配均匀。
预读
预读是操作系统的一项功能,它试图在页面缓存中尽可能多地加载数据。旋转磁盘的寻道时间可能很长,导致高延迟,因此使用页面缓存提高读取吞吐量可以提高性能。通过利用预读,操作系统可以在没有额外寻道成本的情况下将更多数据拉入内存。当可用 RAM 大于热数据集大小时,此方法效果很好,但当情况相反时(数据集 > RAM)可能会出现问题。热数据集越大,预读就越没有用。
在以下情况下,预读肯定没有用
-
小分区,例如只有一个分区键的表
-
固态硬盘 (SSD)
预读实际上会增加磁盘使用量,在某些情况下会导致延迟和吞吐量性能下降高达 5 倍。读取密集型、键值表,其行很小(小于 1KB),尤其容易出现此问题。
推荐的预读设置如下
硬件 | 初始建议 |
---|---|
旋转磁盘 |
64KB |
SSD |
4KB |
可以使用 blockdev
工具在 Linux 系统上调整预读。
例如,将磁盘 /dev/sda1
的预读设置为 4KB
$ blockdev --setra 8 /dev/sda1
|
所有系统都不同,因此请将这些建议作为起点,并根据您的 SLA 和吞吐量要求进行调整。要了解预读如何影响磁盘资源使用,我们建议仔细阅读 深入分析,使用外部工具 部分。
压缩
压缩数据通过压缩固定大小的字节缓冲区并将其写入磁盘来存储。缓冲区大小由表模式设置中 WITH COMPRESSION
的压缩映射中的 chunk_length_in_kb
元素确定。从 Cassandra 4.0 开始,默认设置为 16KB。
由于必须从磁盘读取整个压缩缓冲区,因此使用过大的压缩块长度会导致读取小记录时出现重大开销。与默认预读设置相结合,结果可能是某些工作负载的巨大读取放大。因此,为该设置选择适当的值非常重要。
LZ4Compressor 是默认的推荐压缩算法。如果您需要有关压缩的更多信息,请阅读 The Last Pickle 博客文章关于压缩性能。
压缩
有不同的 压缩 策略可用于不同的工作负载。我们建议阅读有关不同策略的信息,以了解哪种策略最适合您的环境。同一集群中的不同表可能(并且经常这样做)使用不同的压缩策略。
加密
在设置生产集群时,最好设置对等体到对等体加密和客户端服务器加密。在集群为生产流量提供服务后设置它很难正确完成。如果您计划使用任何类型的网络加密,我们建议在最初配置集群时设置它。稍后更改这些配置并非不可能,但错误会导致停机或数据丢失。