我目前正在管理一个由 5 个节点组成的 percona xtradb 集群,每天都有数以百万计的插入。写入性能非常好,但读取速度不快,特别是当我请求大数据集时。
插入的记录是传感器时间序列。
我想尝试 apache cassandra 来取代 percona 集群,但我不明白数据读取是如何工作的。我正在寻找能够在所有节点周围拆分查询并从多个节点并行读取的东西。
我知道Cassandra分片可以有分片副本。 如果我有 5 个节点并将副本因子设置为 5,读取速度会快 5 倍吗?
Cassandra 读取路径
客户端发起的读取请求被发送到协调器节点,协调器节点检查分区程序负责数据的副本是什么,以及是否满足一致性级别。
协调员将检查它是否负责数据。如果是,将满足请求。如果否,它将请求发送到响应最快的副本(这是使用动态告密确定的(。此外,请求摘要将发送到其他副本。
节点将比较返回的数据摘要,如果所有摘要都相同并且已满足一致性级别,则从应答速度最快的副本返回数据。如果摘要不同,协调器将发出一些读取修复操作。
在节点上执行几个步骤:检查行缓存,检查内存表,检查sstables。详细信息:如何读取数据?和 ReadPathForUsers。
负载均衡查询
由于您的复制因子等于节点数,这意味着每个节点将保存您的所有数据。因此,当协调器节点收到读取查询时,它将满足自身的要求。特别是(如果您使用LOCAL_ONE一致性级别,请求将非常快(。
客户端驱动程序实现负载平衡策略,这意味着在客户端上可以配置查询在群集中的分布方式。更多阅读 - 客户端请求阅读
如果我有 5 个节点并将副本因子设置为 5,读取速度会快 5 倍吗?
不。这意味着您最多将拥有 5 个数据副本,以确保在节点关闭时可以满足您的查询。卡桑德拉没有为阅读而划分工作。相反,它试图迫使您以一种高效和快速读取的方式设计数据。
阅读 cassandra 的最佳方法是确保生成的每个查询都命中 cassandra 分区。这意味着简单主键的第一部分和复合((x,y(,z(主键的第一部分作为查询参数提供。 这可以追溯到 cassandra 表设计原则,即根据查询需求进行表设计。
复制是关于数据的副本,分区是关于分发数据。 https://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archPartitionerAbout.html
关于卡桑德拉建模的一些参考资料, https://www.datastax.com/dev/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key
https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling
建议有 100 MB 的分区,但不是强制性的。
您可以使用 cassandra-stress 实用程序来查看读取和写入的外观报告。