Cassandra 文档

版本

您正在查看预发布版本的文档。

查看最新版本

改进的流式传输

Apache Cassandra 4.0 对流式传输进行了多项改进。流式传输是集群节点以 SSTable 形式交换数据的过程。SSTable 的流式传输用于多种操作,例如

  • SSTable 修复

  • 主机替换

  • 范围移动

  • 引导

  • 重建

  • 集群扩展

基于 Netty 的流式传输

Cassandra 4.0 中的流式传输基于 Netty 的非阻塞输入/输出 (NIO) (CASSANDRA-12229)。它取代了单线程(或顺序)、同步、阻塞的流式传输消息和文件传输模型。Netty 支持非阻塞、异步、多线程流式传输,可以同时打开多个连接。非阻塞意味着线程不会被阻塞,因为它们不会等待发送请求的响应。响应可以在不同的线程中返回。在异步情况下,连接和线程是解耦的,并且没有 1:1 关系。可以打开比线程更多的连接。

零拷贝流式传输

在 4.0 之前,在流式传输期间,Cassandra 会将 SSTable 物化成对象。这会产生不必要的垃圾,并减慢整个流式传输过程,因为某些 SSTable 可以作为整个文件而不是单个分区进行传输。Cassandra 4.0 添加了对尽可能流式传输整个 SSTable 的支持 (CASSANDRA-14556),以便使用零拷贝 API 更快地进行流式传输。如果启用,Cassandra 将对符合条件的 SSTable 使用零拷贝,从而显着加快传输速度并提高吞吐量。零拷贝路径避免在发送方和接收方将数据引入用户空间。任何与流式传输相关的操作都会注意到相应的改进。零拷贝流式传输受硬件限制;仅受硬件限制(网络和磁盘 I/O)。

高可用性

在基准测试中,零拷贝流式传输比基于分区的流式传输快 5 倍。更快的流式传输提供了提高可用性的优势。集群的恢复主要取决于流式传输速度,Cassandra 集群中的故障节点能够更快地恢复(快 5 倍)。如果一个节点发生故障,则需要将 SSTable 流式传输到替换节点。在替换操作期间,新的 Cassandra 节点从保存属于此新节点的令牌范围数据的相邻节点流式传输 SSTable。根据存储的数据量,此过程可能需要大量的网络带宽,需要一些时间才能完成。这些范围移动操作花费的时间越长,集群的可用性损失就越大。多个节点发生故障会极大地降低高可用性。新节点完成流式传输数据的速度越快,它就能越快地提供服务,从而提高集群的可用性。

启用零拷贝流式传输

通过在 cassandra.yaml 中设置以下设置来启用零拷贝流式传输。

stream_entire_sstables: true

默认情况下,零拷贝流式传输已启用。

符合零拷贝流式传输条件的 SSTable

如果 SSTable 中的所有分区都需要传输,则使用零拷贝流式传输。这在使用 LeveledCompactionStrategy 或已启用按令牌范围对 SSTable 进行分区时很常见。将遍历 SSTable 中的所有分区键以确定是否符合零拷贝流式传输的条件。

零拷贝流式传输的优势

启用后,它允许 Cassandra 在节点之间零拷贝流式传输所有符合条件的 SSTable,包括每个组件。这会显着加快网络传输速度,前提是受 stream_throughput_outbound 指定的限制。

启用此功能将减少发送节点和接收节点上的 GC 压力。虽然此功能试图保持磁盘平衡,但不能保证这一点。如果启用节点间加密,此功能将自动禁用。目前,这可以与分层压缩一起使用。

配置零拷贝流式传输

限制会降低流式传输速度。stream_throughput_outbound 将节点上的所有出站流式传输文件传输限制为给定的总吞吐量(以 Mbps 为单位)。如果未设置,默认值为 200 Mbps 或 24 MiB/s。

stream_throughput_outbound: 24MiB/s

要运行任何零拷贝流式传输基准测试,stream_throughput_outbound 必须设置为非常高的值,否则,限制将非常大,基准测试结果将没有意义。

inter_dc_stream_throughput_outbound 会限制数据中心之间所有流式传输文件传输,此设置允许用户除了使用 stream_throughput_outbound 配置的限制所有网络流式传输流量外,还可以限制数据中心间流式传输吞吐量。如果未设置,默认值为 200 Mbps 或 25 MB/s。

inter_dc_stream_throughput_outbound: 24MiB/s

使用零拷贝流式传输流式传输的 SSTable 组件

零拷贝流式传输会流式传输整个 SSTable。SSTable 由多个单独文件中的组件组成。流式传输的 SSTable 组件列在表 1 中。

表 1. SSTable 组件

SSTable 组件 描述

Data.db

SSTable 的基本数据:其余组件可以根据数据组件重新生成。

Index.db

行键的索引,包含指向数据文件中的位置的指针。

Filter.db

SSTable 中行键的序列化布隆过滤器。

CompressionInfo.db

保存有关未压缩数据长度、块偏移量等信息的文件。

Statistics.db

有关 SSTable 内容的统计元数据。

Digest.crc32

保存数据文件大小_字节的 CRC32 校验和。

CRC.db

保存未压缩文件中的块的 CRC32。

Summary.db

保存 SSTable 索引摘要(索引组件的采样)

TOC.txt

目录,保存 SSTable 的所有组件列表。

自定义组件,例如自定义压缩策略也可能包含在内。

修复流式传输预览

使用 nodetool repair 进行修复涉及修复后的 SSTable 的流式传输,并且添加了修复预览以提供对需要执行的修复流式传输量的估计。修复预览 (CASSANDRA-13257) 使用选项 nodetool repair --preview 调用

-prv, --preview

它确定范围和要流式传输的数据量,但不会实际执行修复。

并行化键空间的流式传输

Cassandra 4.0 中的引导和重建的不同键空间的流式传输已并行化 (CASSANDRA-4663)。

多数据中心部署中流式传输的唯一节点

当每个数据中心中的副本数为 3 个或更多时,范围流式传输器会选择唯一的节点来流式传输数据 (CASSANDRA-4650)。优化的作用是使整个集群的流式传输负载均衡。如果没有优化,某些节点可能会被选中流式传输比其他节点更多的数据。此补丁允许选择专用节点来仅流式传输一个范围。

这将提高引导节点的性能,并且还会减少为数据提供服务的节点的压力。如果每个数据中心中的 N < 3,则不会影响它,因为它只从 2 个节点流式传输数据。

流式传输操作类型

了解特定流的类型或用途非常重要。版本 4.0(CASSANDRA-13064)添加了一个enum来区分不同类型的流。流类型在流请求和流任务中都可用。不同的流类型包括:

  • 恢复副本数量

  • 取消引导

  • 重新分配

  • 引导

  • 重建

  • 批量加载

  • 修复

当副本数量低于配置的 RF 时,禁止取消节点

CASSANDRA-12510 防止取消节点导致副本数量低于配置的副本因子 (RF),并添加了--force选项,允许在有意的情况下继续取消节点;即使取消节点会导致副本数量低于配置的 RF,也可以强制取消该节点。